mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-12 01:06:48 +07:00
Staging: rt28x0: updates from vendor's V2.1.0.0 drivers
Port changes from: * 2009_0420_RT2860_Linux_STA_V2.1.0.0 * 2009_0302_RT2870_Linux_STA_v2.1.0.0 * 2009_0525_RT3070_Linux_STA_v2.1.1.0 to in-kernel drivers. From the RT2860 driver release note: [2.1.0.0] 1. New generation schema for multiple OS porting 2. Fixed Ad-hoc ping failed in noisy environment. (Probe Response has too many retry packet then cause "not enough space in MgmtRing") 3. Fixed WPA(2)PSK issue when group cipher of AP is WEP40 or WEP104. 4. Modified iwpriv ra0 get_site_survey: In scan list result: Security shows "NONE" when AP is OPEN/NONE, shows "WEP" when AP is OPEN/WEP or SHARED/WEP, shows "WPAPSK(WPA2PSK)/TKIP(AES)" when AP is WPAPSK(WPA2PSK)/TKIP(AES) shows "WPA(WPA2)/TKIP(AES)" when AP is WPA(WPA2)/TKIP(AES) 5. Support kthread. 6. Add New A band channel list region 15 contains the whole channels in the A band region 4 and the new CE channel 167,169,171,173 7. Add New IEEE802.11r functionality. 8. Fixed WPA2-Enterprise failed when AP reboot or turn off then turn on. 9. Fixed STA cannot connect to 11B only AP when the setting of is PHY_11GN. From the RT2870 driver release note: [V2.1.0.0] 1. New generation schema for multiple OS porting. 2. Fixed Ad-hoc ping failed in noisy environment. (Probe Response has too many retry packet then cause "not enough space in MgmtRing"). 3. Fixed WPS failed with D-Link DIR-628 in 5GHz. 4. Change FastRoaming in DAT file to AutoRoaming. 5. Support kthread. 6. Add New A band channel list region 15 contains the whole channels in the A band region and the new CE channel 167,169,171,173. 7. New IEEE802.11r functionality. From the RT3070 driver release note: Version V2.1.1.0 1. Linux kernel 2.6.29 support. 2. Fix eFuse write from BIN file bug. Version 2.1.0.0 1. New generation schema for multiple OS porting 2. Fixed Ad-hoc ping failed in noisy environment. 3. Modified iwpriv ra0 get_site_survey: 4. Change FastRoaming in DAT file to AutoRoaming. 5. Support kthread. 6. New IEEE802.11r functionality. Tested with RT2860 and RT3070 chipsets. Signed-off-by: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
This commit is contained in:
parent
3441d25f03
commit
ca97b83888
File diff suppressed because it is too large
Load Diff
@ -2,26 +2,33 @@ obj-$(CONFIG_RT2860) += rt2860sta.o
|
||||
|
||||
# TODO: all of these should be removed
|
||||
EXTRA_CFLAGS += -DLINUX -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT
|
||||
EXTRA_CFLAGS += -DRT2860
|
||||
EXTRA_CFLAGS += -DRTMP_MAC_PCI -DRTMP_PCI_SUPPORT -DRT2860
|
||||
EXTRA_CFLAGS += -DDBG
|
||||
|
||||
rt2860sta-objs := \
|
||||
common/md5.o \
|
||||
common/crypt_md5.o \
|
||||
common/crypt_sha2.o \
|
||||
common/crypt_hmac.o \
|
||||
common/mlme.o \
|
||||
common/rtmp_wep.o \
|
||||
common/cmm_wep.o \
|
||||
common/action.o \
|
||||
common/cmm_data.o \
|
||||
common/rtmp_init.o \
|
||||
common/rtmp_tkip.o \
|
||||
common/cmm_tkip.o \
|
||||
common/cmm_aes.o \
|
||||
common/cmm_sync.o \
|
||||
common/eeprom.o \
|
||||
common/cmm_sanity.o \
|
||||
common/cmm_info.o \
|
||||
common/cmm_cfg.o \
|
||||
common/cmm_wpa.o \
|
||||
common/dfs.o \
|
||||
common/spectrum.o \
|
||||
common/rtmp_timer.o \
|
||||
common/rt_channel.o \
|
||||
common/cmm_profile.o \
|
||||
common/cmm_asic.o \
|
||||
sta/assoc.o \
|
||||
sta/aironet.o \
|
||||
sta/auth.o \
|
||||
sta/auth_rsp.o \
|
||||
sta/sync.o \
|
||||
@ -34,6 +41,9 @@ rt2860sta-objs := \
|
||||
rt_main_dev.o \
|
||||
sta_ioctl.o \
|
||||
common/ba_action.o \
|
||||
common/2860_rtmp_init.o \
|
||||
2860_main_dev.o \
|
||||
common/cmm_data_2860.o
|
||||
pci_main_dev.o \
|
||||
rt_pci_rbus.o \
|
||||
common/cmm_mac_pci.o \
|
||||
common/cmm_data_pci.o \
|
||||
common/ee_prom.o \
|
||||
common/rtmp_mcu.o
|
||||
|
@ -1,210 +0,0 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
aironet.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
Paul Lin 04-06-15 Initial
|
||||
*/
|
||||
|
||||
#ifndef __AIRONET_H__
|
||||
#define __AIRONET_H__
|
||||
|
||||
// Measurement Type definition
|
||||
#define MSRN_TYPE_UNUSED 0
|
||||
#define MSRN_TYPE_CHANNEL_LOAD_REQ 1
|
||||
#define MSRN_TYPE_NOISE_HIST_REQ 2
|
||||
#define MSRN_TYPE_BEACON_REQ 3
|
||||
#define MSRN_TYPE_FRAME_REQ 4
|
||||
|
||||
// Scan Mode in Beacon Request
|
||||
#define MSRN_SCAN_MODE_PASSIVE 0
|
||||
#define MSRN_SCAN_MODE_ACTIVE 1
|
||||
#define MSRN_SCAN_MODE_BEACON_TABLE 2
|
||||
|
||||
// PHY type definition for Aironet beacon report, CCX 2 table 36-9
|
||||
#define PHY_FH 1
|
||||
#define PHY_DSS 2
|
||||
#define PHY_UNUSED 3
|
||||
#define PHY_OFDM 4
|
||||
#define PHY_HR_DSS 5
|
||||
#define PHY_ERP 6
|
||||
|
||||
// RPI table in dBm
|
||||
#define RPI_0 0 // Power <= -87
|
||||
#define RPI_1 1 // -87 < Power <= -82
|
||||
#define RPI_2 2 // -82 < Power <= -77
|
||||
#define RPI_3 3 // -77 < Power <= -72
|
||||
#define RPI_4 4 // -72 < Power <= -67
|
||||
#define RPI_5 5 // -67 < Power <= -62
|
||||
#define RPI_6 6 // -62 < Power <= -57
|
||||
#define RPI_7 7 // -57 < Power
|
||||
|
||||
// Cisco Aironet IAPP definetions
|
||||
#define AIRONET_IAPP_TYPE 0x32
|
||||
#define AIRONET_IAPP_SUBTYPE_REQUEST 0x01
|
||||
#define AIRONET_IAPP_SUBTYPE_REPORT 0x81
|
||||
|
||||
// Measurement Request detail format
|
||||
typedef struct _MEASUREMENT_REQUEST {
|
||||
UCHAR Channel;
|
||||
UCHAR ScanMode; // Use only in beacon request, other requests did not use this field
|
||||
USHORT Duration;
|
||||
} MEASUREMENT_REQUEST, *PMEASUREMENT_REQUEST;
|
||||
|
||||
// Beacon Measurement Report
|
||||
// All these field might change to UCHAR, because we didn't do anything to these report.
|
||||
// We copy all these beacons and report to CCX 2 AP.
|
||||
typedef struct _BEACON_REPORT {
|
||||
UCHAR Channel;
|
||||
UCHAR Spare;
|
||||
USHORT Duration;
|
||||
UCHAR PhyType; // Definiation is listed above table 36-9
|
||||
UCHAR RxPower;
|
||||
UCHAR BSSID[6];
|
||||
UCHAR ParentTSF[4];
|
||||
UCHAR TargetTSF[8];
|
||||
USHORT BeaconInterval;
|
||||
USHORT CapabilityInfo;
|
||||
} BEACON_REPORT, *PBEACON_REPORT;
|
||||
|
||||
// Frame Measurement Report (Optional)
|
||||
typedef struct _FRAME_REPORT {
|
||||
UCHAR Channel;
|
||||
UCHAR Spare;
|
||||
USHORT Duration;
|
||||
UCHAR TA;
|
||||
UCHAR BSSID[6];
|
||||
UCHAR RSSI;
|
||||
UCHAR Count;
|
||||
} FRAME_REPORT, *PFRAME_REPORT;
|
||||
|
||||
#pragma pack(1)
|
||||
// Channel Load Report
|
||||
typedef struct _CHANNEL_LOAD_REPORT {
|
||||
UCHAR Channel;
|
||||
UCHAR Spare;
|
||||
USHORT Duration;
|
||||
UCHAR CCABusy;
|
||||
} CHANNEL_LOAD_REPORT, *PCHANNEL_LOAD_REPORT;
|
||||
#pragma pack()
|
||||
|
||||
// Nosie Histogram Report
|
||||
typedef struct _NOISE_HIST_REPORT {
|
||||
UCHAR Channel;
|
||||
UCHAR Spare;
|
||||
USHORT Duration;
|
||||
UCHAR Density[8];
|
||||
} NOISE_HIST_REPORT, *PNOISE_HIST_REPORT;
|
||||
|
||||
// Radio Management Capability element
|
||||
typedef struct _RADIO_MANAGEMENT_CAPABILITY {
|
||||
UCHAR Eid; // TODO: Why the Eid is 1 byte, not normal 2 bytes???
|
||||
UCHAR Length;
|
||||
UCHAR AironetOui[3]; // AIronet OUI (00 40 96)
|
||||
UCHAR Type; // Type / Version
|
||||
USHORT Status; // swap16 required
|
||||
} RADIO_MANAGEMENT_CAPABILITY, *PRADIO_MANAGEMENT_CAPABILITY;
|
||||
|
||||
// Measurement Mode Bit definition
|
||||
typedef struct _MEASUREMENT_MODE {
|
||||
UCHAR Rsvd:4;
|
||||
UCHAR Report:1;
|
||||
UCHAR NotUsed:1;
|
||||
UCHAR Enable:1;
|
||||
UCHAR Parallel:1;
|
||||
} MEASUREMENT_MODE, *PMEASUREMENT_MODE;
|
||||
|
||||
// Measurement Request element, This is little endian mode
|
||||
typedef struct _MEASUREMENT_REQUEST_ELEMENT {
|
||||
USHORT Eid;
|
||||
USHORT Length; // swap16 required
|
||||
USHORT Token; // non-zero unique token
|
||||
UCHAR Mode; // Measurement Mode
|
||||
UCHAR Type; // Measurement type
|
||||
} MEASUREMENT_REQUEST_ELEMENT, *PMEASUREMENT_REQUEST_ELEMENT;
|
||||
|
||||
// Measurement Report element, This is little endian mode
|
||||
typedef struct _MEASUREMENT_REPORT_ELEMENT {
|
||||
USHORT Eid;
|
||||
USHORT Length; // swap16 required
|
||||
USHORT Token; // non-zero unique token
|
||||
UCHAR Mode; // Measurement Mode
|
||||
UCHAR Type; // Measurement type
|
||||
} MEASUREMENT_REPORT_ELEMENT, *PMEASUREMENT_REPORT_ELEMENT;
|
||||
|
||||
// Cisco Aironet IAPP Frame Header, Network byte order used
|
||||
typedef struct _AIRONET_IAPP_HEADER {
|
||||
UCHAR CiscoSnapHeader[8]; // 8 bytes Cisco snap header
|
||||
USHORT Length; // IAPP ID & length, remember to swap16 in LE system
|
||||
UCHAR Type; // IAPP type
|
||||
UCHAR SubType; // IAPP subtype
|
||||
UCHAR DA[6]; // Destination MAC address
|
||||
UCHAR SA[6]; // Source MAC address
|
||||
USHORT Token; // Dialog token, no need to swap16 since it is for yoken usage only
|
||||
} AIRONET_IAPP_HEADER, *PAIRONET_IAPP_HEADER;
|
||||
|
||||
// Radio Measurement Request frame
|
||||
typedef struct _AIRONET_RM_REQUEST_FRAME {
|
||||
AIRONET_IAPP_HEADER IAPP; // Common header
|
||||
UCHAR Delay; // Activation Delay
|
||||
UCHAR Offset; // Measurement offset
|
||||
} AIRONET_RM_REQUEST_FRAME, *PAIRONET_RM_REQUEST_FRAME;
|
||||
|
||||
// Radio Measurement Report frame
|
||||
typedef struct _AIRONET_RM_REPORT_FRAME {
|
||||
AIRONET_IAPP_HEADER IAPP; // Common header
|
||||
} AIRONET_RM_REPORT_FRAME, *PAIRONET_RM_REPORT_FRAME;
|
||||
|
||||
// Saved element request actions which will saved in StaCfg.
|
||||
typedef struct _RM_REQUEST_ACTION {
|
||||
MEASUREMENT_REQUEST_ELEMENT ReqElem; // Saved request element
|
||||
MEASUREMENT_REQUEST Measurement; // Saved measurement within the request element
|
||||
} RM_REQUEST_ACTION, *PRM_REQUEST_ACTION;
|
||||
|
||||
// CCX administration control
|
||||
typedef union _CCX_CONTROL {
|
||||
struct {
|
||||
UINT32 Enable:1; // Enable CCX2
|
||||
UINT32 LeapEnable:1; // Enable LEAP at CCX2
|
||||
UINT32 RMEnable:1; // Radio Measurement Enable
|
||||
UINT32 DCRMEnable:1; // Non serving channel Radio Measurement enable
|
||||
UINT32 QOSEnable:1; // Enable QOS for CCX 2.0 support
|
||||
UINT32 FastRoamEnable:1; // Enable fast roaming
|
||||
UINT32 Rsvd:2; // Not used
|
||||
UINT32 dBmToRoam:8; // the condition to roam when receiving Rssi less than this value. It's negative value.
|
||||
UINT32 TuLimit:16; // Limit for different channel scan
|
||||
} field;
|
||||
UINT32 word;
|
||||
} CCX_CONTROL, *PCCX_CONTROL;
|
||||
|
||||
#endif // __AIRONET_H__
|
@ -40,22 +40,24 @@
|
||||
#ifndef __AP_H__
|
||||
#define __AP_H__
|
||||
|
||||
// ap_mlme.c
|
||||
// ap_wpa.c
|
||||
VOID WpaStateMachineInit(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN STATE_MACHINE *Sm,
|
||||
OUT STATE_MACHINE_FUNC Trans[]);
|
||||
|
||||
#ifdef RT2870
|
||||
#ifdef RTMP_MAC_USB
|
||||
VOID BeaconUpdateExec(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
#endif // RT2870 //
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
VOID RTMPSetPiggyBack(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN BOOLEAN bPiggyBack);
|
||||
|
||||
// ap.c
|
||||
|
||||
VOID MacTableReset(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
365
drivers/staging/rt2860/chip/mac_pci.h
Normal file
365
drivers/staging/rt2860/chip/mac_pci.h
Normal file
@ -0,0 +1,365 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
mac_pci.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __MAC_PCI_H__
|
||||
#define __MAC_PCI_H__
|
||||
|
||||
#include "../rtmp_type.h"
|
||||
#include "rtmp_mac.h"
|
||||
#include "rtmp_phy.h"
|
||||
#include "../rtmp_iface.h"
|
||||
#include "../rtmp_dot11.h"
|
||||
|
||||
|
||||
//
|
||||
// Device ID & Vendor ID related definitions,
|
||||
// NOTE: you should not add the new VendorID/DeviceID here unless you not sure it belongs to what chip.
|
||||
//
|
||||
#define NIC_PCI_VENDOR_ID 0x1814
|
||||
#define PCIBUS_INTEL_VENDOR 0x8086
|
||||
|
||||
#if !defined(PCI_CAP_ID_EXP)
|
||||
#define PCI_CAP_ID_EXP 0x10
|
||||
#endif
|
||||
#if !defined(PCI_EXP_LNKCTL)
|
||||
#define PCI_EXP_LNKCTL 0x10
|
||||
#endif
|
||||
#if !defined(PCI_CLASS_BRIDGE_PCI)
|
||||
#define PCI_CLASS_BRIDGE_PCI 0x0604
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#define TXINFO_SIZE 0
|
||||
#define RTMP_PKT_TAIL_PADDING 0
|
||||
#define fRTMP_ADAPTER_NEED_STOP_TX 0
|
||||
|
||||
#define AUX_CTRL 0x10c
|
||||
|
||||
//
|
||||
// TX descriptor format, Tx ring, Mgmt Ring
|
||||
//
|
||||
typedef struct PACKED _TXD_STRUC {
|
||||
// Word 0
|
||||
UINT32 SDPtr0;
|
||||
// Word 1
|
||||
UINT32 SDLen1:14;
|
||||
UINT32 LastSec1:1;
|
||||
UINT32 Burst:1;
|
||||
UINT32 SDLen0:14;
|
||||
UINT32 LastSec0:1;
|
||||
UINT32 DMADONE:1;
|
||||
//Word2
|
||||
UINT32 SDPtr1;
|
||||
//Word3
|
||||
UINT32 rsv2:24;
|
||||
UINT32 WIV:1; // Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition
|
||||
UINT32 QSEL:2; // select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA
|
||||
UINT32 rsv:2;
|
||||
UINT32 TCO:1; //
|
||||
UINT32 UCO:1; //
|
||||
UINT32 ICO:1; //
|
||||
} TXD_STRUC, *PTXD_STRUC;
|
||||
|
||||
|
||||
//
|
||||
// Rx descriptor format, Rx Ring
|
||||
//
|
||||
typedef struct PACKED _RXD_STRUC{
|
||||
// Word 0
|
||||
UINT32 SDP0;
|
||||
// Word 1
|
||||
UINT32 SDL1:14;
|
||||
UINT32 Rsv:2;
|
||||
UINT32 SDL0:14;
|
||||
UINT32 LS0:1;
|
||||
UINT32 DDONE:1;
|
||||
// Word 2
|
||||
UINT32 SDP1;
|
||||
// Word 3
|
||||
UINT32 BA:1;
|
||||
UINT32 DATA:1;
|
||||
UINT32 NULLDATA:1;
|
||||
UINT32 FRAG:1;
|
||||
UINT32 U2M:1; // 1: this RX frame is unicast to me
|
||||
UINT32 Mcast:1; // 1: this is a multicast frame
|
||||
UINT32 Bcast:1; // 1: this is a broadcast frame
|
||||
UINT32 MyBss:1; // 1: this frame belongs to the same BSSID
|
||||
UINT32 Crc:1; // 1: CRC error
|
||||
UINT32 CipherErr:2; // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid
|
||||
UINT32 AMSDU:1; // rx with 802.3 header, not 802.11 header.
|
||||
UINT32 HTC:1;
|
||||
UINT32 RSSI:1;
|
||||
UINT32 L2PAD:1;
|
||||
UINT32 AMPDU:1;
|
||||
UINT32 Decrypted:1; // this frame is being decrypted.
|
||||
UINT32 PlcpSignal:1; // To be moved
|
||||
UINT32 PlcpRssil:1;// To be moved
|
||||
UINT32 Rsv1:13;
|
||||
} RXD_STRUC, *PRXD_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC;
|
||||
|
||||
|
||||
/* ----------------- EEPROM Related MACRO ----------------- */
|
||||
|
||||
// 8051 firmware image for RT2860 - base address = 0x4000
|
||||
#define FIRMWARE_IMAGE_BASE 0x2000
|
||||
#define MAX_FIRMWARE_IMAGE_SIZE 0x2000 // 8kbyte
|
||||
|
||||
|
||||
/* ----------------- Frimware Related MACRO ----------------- */
|
||||
#define RTMP_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen) \
|
||||
do{ \
|
||||
ULONG _i, _firm; \
|
||||
RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x10000); \
|
||||
\
|
||||
for(_i=0; _i<_FwLen; _i+=4) \
|
||||
{ \
|
||||
_firm = _pFwImage[_i] + \
|
||||
(_pFwImage[_i+3] << 24) + \
|
||||
(_pFwImage[_i+2] << 16) + \
|
||||
(_pFwImage[_i+1] << 8); \
|
||||
RTMP_IO_WRITE32(_pAd, FIRMWARE_IMAGE_BASE + _i, _firm); \
|
||||
} \
|
||||
RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00000); \
|
||||
RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00001); \
|
||||
\
|
||||
/* initialize BBP R/W access agent */ \
|
||||
RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, 0); \
|
||||
RTMP_IO_WRITE32(_pAd, H2M_MAILBOX_CSR, 0); \
|
||||
}while(0)
|
||||
|
||||
|
||||
/* ----------------- TX Related MACRO ----------------- */
|
||||
#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0)
|
||||
#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0)
|
||||
|
||||
|
||||
#define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \
|
||||
((freeNum) >= (ULONG)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + 3)) /* rough estimate we will use 3 more descriptor. */
|
||||
#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx) \
|
||||
do{}while(0)
|
||||
|
||||
#define NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, freeNum, _TxFrameType) \
|
||||
(((freeNum != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 0)) || (freeNum<3))
|
||||
//(((freeNum) != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 1 /*0*/))
|
||||
|
||||
|
||||
#define HAL_KickOutMgmtTx(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) \
|
||||
RtmpPCIMgmtKickOut(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen)
|
||||
|
||||
#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \
|
||||
/* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)*/
|
||||
|
||||
#define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber) \
|
||||
RtmpPCI_WriteSingleTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)
|
||||
|
||||
#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \
|
||||
RtmpPCI_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)
|
||||
|
||||
#define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber) \
|
||||
RtmpPCI_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber)
|
||||
|
||||
#define HAL_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) \
|
||||
RtmpPCI_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx)
|
||||
|
||||
#define HAL_LastTxIdx(_pAd, _QueIdx,_LastTxIdx) \
|
||||
/*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx)*/
|
||||
|
||||
#define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx) \
|
||||
RTMP_IO_WRITE32((_pAd), TX_CTX_IDX0+((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx)
|
||||
/* RtmpPCIDataKickOut(_pAd, _pTxBlk, _QueIdx)*/
|
||||
|
||||
#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \
|
||||
MiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen)
|
||||
|
||||
#define GET_TXRING_FREENO(_pAd, _QueIdx) \
|
||||
(_pAd->TxRing[_QueIdx].TxSwFreeIdx > _pAd->TxRing[_QueIdx].TxCpuIdx) ? \
|
||||
(_pAd->TxRing[_QueIdx].TxSwFreeIdx - _pAd->TxRing[_QueIdx].TxCpuIdx - 1) \
|
||||
: \
|
||||
(_pAd->TxRing[_QueIdx].TxSwFreeIdx + TX_RING_SIZE - _pAd->TxRing[_QueIdx].TxCpuIdx - 1);
|
||||
|
||||
|
||||
#define GET_MGMTRING_FREENO(_pAd) \
|
||||
(_pAd->MgmtRing.TxSwFreeIdx > _pAd->MgmtRing.TxCpuIdx) ? \
|
||||
(_pAd->MgmtRing.TxSwFreeIdx - _pAd->MgmtRing.TxCpuIdx - 1) \
|
||||
: \
|
||||
(_pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - _pAd->MgmtRing.TxCpuIdx - 1);
|
||||
|
||||
|
||||
/* ----------------- RX Related MACRO ----------------- */
|
||||
|
||||
|
||||
/* ----------------- ASIC Related MACRO ----------------- */
|
||||
// reset MAC of a station entry to 0x000000000000
|
||||
#define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid) \
|
||||
AsicDelWcidTab(pAd, Wcid);
|
||||
|
||||
// add this entry into ASIC RX WCID search table
|
||||
#define RTMP_STA_ENTRY_ADD(pAd, pEntry) \
|
||||
AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);
|
||||
|
||||
// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
|
||||
// Set MAC register value according operation mode
|
||||
#define RTMP_UPDATE_PROTECT(pAd) \
|
||||
AsicUpdateProtect(pAd, 0, (ALLN_SETPROTECT), TRUE, 0);
|
||||
// end johnli
|
||||
|
||||
// remove Pair-wise key material from ASIC
|
||||
#define RTMP_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid) \
|
||||
AsicRemovePairwiseKeyEntry(pAd, BssIdx, (UCHAR)Wcid);
|
||||
|
||||
// add Client security information into ASIC WCID table and IVEIV table
|
||||
#define RTMP_STA_SECURITY_INFO_ADD(pAd, apidx, KeyID, pEntry) \
|
||||
RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \
|
||||
pAd->SharedKey[apidx][KeyID].CipherAlg, pEntry);
|
||||
|
||||
#define RTMP_SECURITY_KEY_ADD(pAd, apidx, KeyID, pEntry) \
|
||||
{ /* update pairwise key information to ASIC Shared Key Table */ \
|
||||
AsicAddSharedKeyEntry(pAd, apidx, KeyID, \
|
||||
pAd->SharedKey[apidx][KeyID].CipherAlg, \
|
||||
pAd->SharedKey[apidx][KeyID].Key, \
|
||||
pAd->SharedKey[apidx][KeyID].TxMic, \
|
||||
pAd->SharedKey[apidx][KeyID].RxMic); \
|
||||
/* update ASIC WCID attribute table and IVEIV table */ \
|
||||
RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \
|
||||
pAd->SharedKey[apidx][KeyID].CipherAlg, \
|
||||
pEntry); }
|
||||
|
||||
|
||||
// Insert the BA bitmap to ASIC for the Wcid entry
|
||||
#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID) \
|
||||
do{ \
|
||||
UINT32 _Value = 0, _Offset; \
|
||||
_Offset = MAC_WCID_BASE + (_Aid) * HW_WCID_ENTRY_SIZE + 4; \
|
||||
RTMP_IO_READ32((_pAd), _Offset, &_Value);\
|
||||
_Value |= (0x10000<<(_TID)); \
|
||||
RTMP_IO_WRITE32((_pAd), _Offset, _Value);\
|
||||
}while(0)
|
||||
|
||||
|
||||
// Remove the BA bitmap from ASIC for the Wcid entry
|
||||
// bitmap field starts at 0x10000 in ASIC WCID table
|
||||
#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID) \
|
||||
do{ \
|
||||
UINT32 _Value = 0, _Offset; \
|
||||
_Offset = MAC_WCID_BASE + (_Wcid) * HW_WCID_ENTRY_SIZE + 4; \
|
||||
RTMP_IO_READ32((_pAd), _Offset, &_Value); \
|
||||
_Value &= (~(0x10000 << (_TID))); \
|
||||
RTMP_IO_WRITE32((_pAd), _Offset, _Value); \
|
||||
}while(0)
|
||||
|
||||
|
||||
/* ----------------- Interface Related MACRO ----------------- */
|
||||
|
||||
//
|
||||
// Enable & Disable NIC interrupt via writing interrupt mask register
|
||||
// Since it use ADAPTER structure, it have to be put after structure definition.
|
||||
//
|
||||
#define RTMP_ASIC_INTERRUPT_DISABLE(_pAd) \
|
||||
do{ \
|
||||
RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, 0x0); /* 0: disable */ \
|
||||
RTMP_CLEAR_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \
|
||||
}while(0)
|
||||
|
||||
#define RTMP_ASIC_INTERRUPT_ENABLE(_pAd)\
|
||||
do{ \
|
||||
RTMP_IO_WRITE32((_pAd), INT_MASK_CSR, (_pAd)->int_enable_reg /*DELAYINTMASK*/); /* 1:enable */ \
|
||||
RTMP_SET_FLAG((_pAd), fRTMP_ADAPTER_INTERRUPT_ACTIVE); \
|
||||
}while(0)
|
||||
|
||||
|
||||
#define RTMP_IRQ_INIT(pAd) \
|
||||
{ pAd->int_enable_reg = ((DELAYINTMASK) | \
|
||||
(RxINT|TxDataInt|TxMgmtInt)) & ~(0x03); \
|
||||
pAd->int_disable_mask = 0; \
|
||||
pAd->int_pending = 0; }
|
||||
|
||||
#define RTMP_IRQ_ENABLE(pAd) \
|
||||
{ /* clear garbage ints */ \
|
||||
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff);\
|
||||
RTMP_ASIC_INTERRUPT_ENABLE(pAd); }
|
||||
|
||||
|
||||
/* ----------------- MLME Related MACRO ----------------- */
|
||||
#define RTMP_MLME_HANDLER(pAd) MlmeHandler(pAd)
|
||||
|
||||
#define RTMP_MLME_PRE_SANITY_CHECK(pAd)
|
||||
|
||||
#define RTMP_MLME_STA_QUICK_RSP_WAKE_UP(pAd) \
|
||||
RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100);
|
||||
|
||||
#define RTMP_MLME_RESET_STATE_MACHINE(pAd) \
|
||||
MlmeRestartStateMachine(pAd)
|
||||
|
||||
#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry)\
|
||||
HandleCounterMeasure(_pAd, _pEntry)
|
||||
|
||||
/* ----------------- Power Save Related MACRO ----------------- */
|
||||
#define RTMP_PS_POLL_ENQUEUE(pAd) EnqueuePsPoll(pAd)
|
||||
|
||||
|
||||
// For RTMPPCIePowerLinkCtrlRestore () function
|
||||
#define RESTORE_HALT 1
|
||||
#define RESTORE_WAKEUP 2
|
||||
#define RESTORE_CLOSE 3
|
||||
|
||||
#define PowerSafeCID 1
|
||||
#define PowerRadioOffCID 2
|
||||
#define PowerWakeCID 3
|
||||
#define CID0MASK 0x000000ff
|
||||
#define CID1MASK 0x0000ff00
|
||||
#define CID2MASK 0x00ff0000
|
||||
#define CID3MASK 0xff000000
|
||||
|
||||
|
||||
#define RTMP_STA_FORCE_WAKEUP(pAd, bFromTx) \
|
||||
RT28xxPciStaAsicForceWakeup(pAd, bFromTx);
|
||||
|
||||
#define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \
|
||||
RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
|
||||
|
||||
#define RTMP_SET_PSM_BIT(_pAd, _val) \
|
||||
MlmeSetPsmBit(_pAd, _val);
|
||||
|
||||
#define RTMP_MLME_RADIO_ON(pAd) \
|
||||
RT28xxPciMlmeRadioOn(pAd);
|
||||
|
||||
#define RTMP_MLME_RADIO_OFF(pAd) \
|
||||
RT28xxPciMlmeRadioOFF(pAd);
|
||||
|
||||
#endif //__MAC_PCI_H__ //
|
365
drivers/staging/rt2860/chip/mac_usb.h
Normal file
365
drivers/staging/rt2860/chip/mac_usb.h
Normal file
@ -0,0 +1,365 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
mac_usb.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __MAC_USB_H__
|
||||
#define __MAC_USB_H__
|
||||
|
||||
#include "../rtmp_type.h"
|
||||
#include "rtmp_mac.h"
|
||||
#include "rtmp_phy.h"
|
||||
#include "../rtmp_iface.h"
|
||||
#include "../rtmp_dot11.h"
|
||||
|
||||
|
||||
#define USB_CYC_CFG 0x02a4
|
||||
|
||||
#define BEACON_RING_SIZE 2
|
||||
#define MGMTPIPEIDX 0 // EP6 is highest priority
|
||||
|
||||
#define RTMP_PKT_TAIL_PADDING 11 // 3(max 4 byte padding) + 4 (last packet padding) + 4 (MaxBulkOutsize align padding)
|
||||
|
||||
#define fRTMP_ADAPTER_NEED_STOP_TX \
|
||||
(fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS | \
|
||||
fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_BULKOUT_RESET | \
|
||||
fRTMP_ADAPTER_RADIO_OFF | fRTMP_ADAPTER_REMOVE_IN_PROGRESS)
|
||||
|
||||
//
|
||||
// RXINFO appends at the end of each rx packet.
|
||||
//
|
||||
#define RXINFO_SIZE 4
|
||||
#define RT2870_RXDMALEN_FIELD_SIZE 4
|
||||
|
||||
typedef struct PACKED _RXINFO_STRUC {
|
||||
UINT32 BA:1;
|
||||
UINT32 DATA:1;
|
||||
UINT32 NULLDATA:1;
|
||||
UINT32 FRAG:1;
|
||||
UINT32 U2M:1; // 1: this RX frame is unicast to me
|
||||
UINT32 Mcast:1; // 1: this is a multicast frame
|
||||
UINT32 Bcast:1; // 1: this is a broadcast frame
|
||||
UINT32 MyBss:1; // 1: this frame belongs to the same BSSID
|
||||
UINT32 Crc:1; // 1: CRC error
|
||||
UINT32 CipherErr:2; // 0: decryption okay, 1:ICV error, 2:MIC error, 3:KEY not valid
|
||||
UINT32 AMSDU:1; // rx with 802.3 header, not 802.11 header.
|
||||
UINT32 HTC:1;
|
||||
UINT32 RSSI:1;
|
||||
UINT32 L2PAD:1;
|
||||
UINT32 AMPDU:1; // To be moved
|
||||
UINT32 Decrypted:1;
|
||||
UINT32 PlcpRssil:1;
|
||||
UINT32 CipherAlg:1;
|
||||
UINT32 LastAMSDU:1;
|
||||
UINT32 PlcpSignal:12;
|
||||
} RXINFO_STRUC, *PRXINFO_STRUC, RT28XX_RXD_STRUC, *PRT28XX_RXD_STRUC;
|
||||
|
||||
|
||||
//
|
||||
// TXINFO
|
||||
//
|
||||
#define TXINFO_SIZE 4
|
||||
|
||||
typedef struct _TXINFO_STRUC {
|
||||
// Word 0
|
||||
UINT32 USBDMATxPktLen:16; //used ONLY in USB bulk Aggregation, Total byte counts of all sub-frame.
|
||||
UINT32 rsv:8;
|
||||
UINT32 WIV:1; // Wireless Info Valid. 1 if Driver already fill WI, o if DMA needs to copy WI to correctposition
|
||||
UINT32 QSEL:2; // select on-chip FIFO ID for 2nd-stage output scheduler.0:MGMT, 1:HCCA 2:EDCA
|
||||
UINT32 SwUseLastRound:1; // Software use.
|
||||
UINT32 rsv2:2; // Software use.
|
||||
UINT32 USBDMANextVLD:1; //used ONLY in USB bulk Aggregation, NextValid
|
||||
UINT32 USBDMATxburst:1;//used ONLY in USB bulk Aggre. Force USB DMA transmit frame from current selected endpoint
|
||||
} TXINFO_STRUC, *PTXINFO_STRUC;
|
||||
|
||||
|
||||
//
|
||||
// Management ring buffer format
|
||||
//
|
||||
typedef struct _MGMT_STRUC {
|
||||
BOOLEAN Valid;
|
||||
PUCHAR pBuffer;
|
||||
ULONG Length;
|
||||
} MGMT_STRUC, *PMGMT_STRUC;
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
// The TX_BUFFER structure forms the transmitted USB packet to the device
|
||||
////////////////////////////////////////////////////////////////////////////
|
||||
typedef struct __TX_BUFFER{
|
||||
union{
|
||||
UCHAR WirelessPacket[TX_BUFFER_NORMSIZE];
|
||||
HEADER_802_11 NullFrame;
|
||||
PSPOLL_FRAME PsPollPacket;
|
||||
RTS_FRAME RTSFrame;
|
||||
}field;
|
||||
UCHAR Aggregation[4]; //Buffer for save Aggregation size.
|
||||
} TX_BUFFER, *PTX_BUFFER;
|
||||
|
||||
typedef struct __HTTX_BUFFER{
|
||||
union{
|
||||
UCHAR WirelessPacket[MAX_TXBULK_SIZE];
|
||||
HEADER_802_11 NullFrame;
|
||||
PSPOLL_FRAME PsPollPacket;
|
||||
RTS_FRAME RTSFrame;
|
||||
}field;
|
||||
UCHAR Aggregation[4]; //Buffer for save Aggregation size.
|
||||
} HTTX_BUFFER, *PHTTX_BUFFER;
|
||||
|
||||
|
||||
// used to track driver-generated write irps
|
||||
typedef struct _TX_CONTEXT
|
||||
{
|
||||
PVOID pAd; //Initialized in MiniportInitialize
|
||||
PURB pUrb; //Initialized in MiniportInitialize
|
||||
PIRP pIrp; //used to cancel pending bulk out.
|
||||
//Initialized in MiniportInitialize
|
||||
PTX_BUFFER TransferBuffer; //Initialized in MiniportInitialize
|
||||
ULONG BulkOutSize;
|
||||
UCHAR BulkOutPipeId;
|
||||
UCHAR SelfIdx;
|
||||
BOOLEAN InUse;
|
||||
BOOLEAN bWaitingBulkOut; // at least one packet is in this TxContext, ready for making IRP anytime.
|
||||
BOOLEAN bFullForBulkOut; // all tx buffer are full , so waiting for tx bulkout.
|
||||
BOOLEAN IRPPending;
|
||||
BOOLEAN LastOne;
|
||||
BOOLEAN bAggregatible;
|
||||
UCHAR Header_802_3[LENGTH_802_3];
|
||||
UCHAR Rsv[2];
|
||||
ULONG DataOffset;
|
||||
UINT TxRate;
|
||||
dma_addr_t data_dma; // urb dma on linux
|
||||
|
||||
} TX_CONTEXT, *PTX_CONTEXT, **PPTX_CONTEXT;
|
||||
|
||||
|
||||
// used to track driver-generated write irps
|
||||
typedef struct _HT_TX_CONTEXT
|
||||
{
|
||||
PVOID pAd; //Initialized in MiniportInitialize
|
||||
PURB pUrb; //Initialized in MiniportInitialize
|
||||
PIRP pIrp; //used to cancel pending bulk out.
|
||||
//Initialized in MiniportInitialize
|
||||
PHTTX_BUFFER TransferBuffer; //Initialized in MiniportInitialize
|
||||
ULONG BulkOutSize; // Indicate the total bulk-out size in bytes in one bulk-transmission
|
||||
UCHAR BulkOutPipeId;
|
||||
BOOLEAN IRPPending;
|
||||
BOOLEAN LastOne;
|
||||
BOOLEAN bCurWriting;
|
||||
BOOLEAN bRingEmpty;
|
||||
BOOLEAN bCopySavePad;
|
||||
UCHAR SavedPad[8];
|
||||
UCHAR Header_802_3[LENGTH_802_3];
|
||||
ULONG CurWritePosition; // Indicate the buffer offset which packet will be inserted start from.
|
||||
ULONG CurWriteRealPos; // Indicate the buffer offset which packet now are writing to.
|
||||
ULONG NextBulkOutPosition; // Indicate the buffer start offset of a bulk-transmission
|
||||
ULONG ENextBulkOutPosition; // Indicate the buffer end offset of a bulk-transmission
|
||||
UINT TxRate;
|
||||
dma_addr_t data_dma; // urb dma on linux
|
||||
} HT_TX_CONTEXT, *PHT_TX_CONTEXT, **PPHT_TX_CONTEXT;
|
||||
|
||||
|
||||
//
|
||||
// Structure to keep track of receive packets and buffers to indicate
|
||||
// receive data to the protocol.
|
||||
//
|
||||
typedef struct _RX_CONTEXT
|
||||
{
|
||||
PUCHAR TransferBuffer;
|
||||
PVOID pAd;
|
||||
PIRP pIrp;//used to cancel pending bulk in.
|
||||
PURB pUrb;
|
||||
//These 2 Boolean shouldn't both be 1 at the same time.
|
||||
ULONG BulkInOffset; // number of packets waiting for reordering .
|
||||
// BOOLEAN ReorderInUse; // At least one packet in this buffer are in reordering buffer and wait for receive indication
|
||||
BOOLEAN bRxHandling; // Notify this packet is being process now.
|
||||
BOOLEAN InUse; // USB Hardware Occupied. Wait for USB HW to put packet.
|
||||
BOOLEAN Readable; // Receive Complete back. OK for driver to indicate receiving packet.
|
||||
BOOLEAN IRPPending; // TODO: To be removed
|
||||
atomic_t IrpLock;
|
||||
NDIS_SPIN_LOCK RxContextLock;
|
||||
dma_addr_t data_dma; // urb dma on linux
|
||||
} RX_CONTEXT, *PRX_CONTEXT;
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
USB Frimware Related MACRO
|
||||
|
||||
******************************************************************************/
|
||||
// 8051 firmware image for usb - use last-half base address = 0x3000
|
||||
#define FIRMWARE_IMAGE_BASE 0x3000
|
||||
#define MAX_FIRMWARE_IMAGE_SIZE 0x1000 // 4kbyte
|
||||
|
||||
#define RTMP_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen) \
|
||||
RTUSBFirmwareWrite(_pAd, _pFwImage, _FwLen)
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
USB TX Related MACRO
|
||||
|
||||
******************************************************************************/
|
||||
#define RTMP_START_DEQUEUE(pAd, QueIdx, irqFlags) \
|
||||
do{ \
|
||||
RTMP_IRQ_LOCK(&pAd->DeQueueLock[QueIdx], irqFlags); \
|
||||
if (pAd->DeQueueRunning[QueIdx]) \
|
||||
{ \
|
||||
RTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\
|
||||
DBGPRINT(RT_DEBUG_OFF, ("DeQueueRunning[%d]= TRUE!\n", QueIdx)); \
|
||||
continue; \
|
||||
} \
|
||||
else \
|
||||
{ \
|
||||
pAd->DeQueueRunning[QueIdx] = TRUE; \
|
||||
RTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags);\
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
#define RTMP_STOP_DEQUEUE(pAd, QueIdx, irqFlags) \
|
||||
do{ \
|
||||
RTMP_IRQ_LOCK(&pAd->DeQueueLock[QueIdx], irqFlags); \
|
||||
pAd->DeQueueRunning[QueIdx] = FALSE; \
|
||||
RTMP_IRQ_UNLOCK(&pAd->DeQueueLock[QueIdx], irqFlags); \
|
||||
}while(0)
|
||||
|
||||
#define RTMP_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \
|
||||
(RTUSBFreeDescriptorRequest(pAd, pTxBlk->QueIdx, (pTxBlk->TotalFrameLen + GET_OS_PKT_LEN(pPacket))) == NDIS_STATUS_SUCCESS)
|
||||
|
||||
#define RTMP_RELEASE_DESC_RESOURCE(pAd, QueIdx) \
|
||||
do{}while(0)
|
||||
|
||||
#define NEED_QUEUE_BACK_FOR_AGG(_pAd, _QueIdx, _freeNum, _TxFrameType) \
|
||||
((_TxFrameType == TX_RALINK_FRAME) && (RTUSBNeedQueueBackForAgg(_pAd, _QueIdx)))
|
||||
|
||||
#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \
|
||||
RtmpUSB_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)
|
||||
|
||||
#define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber) \
|
||||
RtmpUSB_WriteSingleTxResource(pAd, pTxBlk,bIsLast, pFreeNumber)
|
||||
|
||||
#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \
|
||||
RtmpUSB_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)
|
||||
|
||||
#define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber) \
|
||||
RtmpUSB_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber)
|
||||
|
||||
#define HAL_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, TxIdx) \
|
||||
RtmpUSB_FinalWriteTxResource(pAd, pTxBlk, totalMPDUSize, TxIdx)
|
||||
|
||||
#define HAL_LastTxIdx(pAd, QueIdx,TxIdx) \
|
||||
/*RtmpUSBDataLastTxIdx(pAd, QueIdx,TxIdx)*/
|
||||
|
||||
#define HAL_KickOutTx(pAd, pTxBlk, QueIdx) \
|
||||
RtmpUSBDataKickOut(pAd, pTxBlk, QueIdx)
|
||||
|
||||
#define HAL_KickOutMgmtTx(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen) \
|
||||
RtmpUSBMgmtKickOut(pAd, QueIdx, pPacket, pSrcBufVA, SrcBufLen)
|
||||
|
||||
#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \
|
||||
RtmpUSBNullFrameKickOut(_pAd, _QueIdx, _pNullFrame, _frameLen)
|
||||
|
||||
#define GET_TXRING_FREENO(_pAd, _QueIdx) (_QueIdx) //(_pAd->TxRing[_QueIdx].TxSwFreeIdx)
|
||||
#define GET_MGMTRING_FREENO(_pAd) (_pAd->MgmtRing.TxSwFreeIdx)
|
||||
|
||||
|
||||
/* ----------------- RX Related MACRO ----------------- */
|
||||
|
||||
|
||||
/*
|
||||
* Device Hardware Interface Related MACRO
|
||||
*/
|
||||
#define RTMP_IRQ_INIT(pAd) do{}while(0)
|
||||
#define RTMP_IRQ_ENABLE(pAd) do{}while(0)
|
||||
|
||||
|
||||
/*
|
||||
* MLME Related MACRO
|
||||
*/
|
||||
#define RTMP_MLME_HANDLER(pAd) RTUSBMlmeUp(pAd)
|
||||
|
||||
#define RTMP_MLME_PRE_SANITY_CHECK(pAd) \
|
||||
{ if ((pAd->CommonCfg.bHardwareRadio == TRUE) && \
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) && \
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS))) { \
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_CHECK_GPIO, NULL, 0); } }
|
||||
|
||||
#define RTMP_MLME_STA_QUICK_RSP_WAKE_UP(pAd) \
|
||||
{ RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_QKERIODIC_EXECUT, NULL, 0); \
|
||||
RTUSBMlmeUp(pAd); }
|
||||
|
||||
#define RTMP_MLME_RESET_STATE_MACHINE(pAd) \
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_RESET_CONF, 0, NULL); \
|
||||
RTUSBMlmeUp(pAd);
|
||||
|
||||
#define RTMP_HANDLE_COUNTER_MEASURE(_pAd, _pEntry) \
|
||||
{ RTUSBEnqueueInternalCmd(_pAd, CMDTHREAD_802_11_COUNTER_MEASURE, _pEntry, sizeof(MAC_TABLE_ENTRY)); \
|
||||
RTUSBMlmeUp(_pAd); \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Power Save Related MACRO
|
||||
*/
|
||||
#define RTMP_PS_POLL_ENQUEUE(pAd) \
|
||||
{ RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_PSPOLL); \
|
||||
RTUSBKickBulkOut(pAd); }
|
||||
|
||||
#define RTMP_STA_FORCE_WAKEUP(_pAd, bFromTx) \
|
||||
RT28xxUsbStaAsicForceWakeup(_pAd, bFromTx);
|
||||
|
||||
#define RTMP_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \
|
||||
RT28xxUsbStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
|
||||
|
||||
#define RTMP_SET_PSM_BIT(_pAd, _val) \
|
||||
{\
|
||||
if ((_pAd)->StaCfg.WindowsPowerMode == Ndis802_11PowerModeFast_PSP) \
|
||||
MlmeSetPsmBit(_pAd, _val);\
|
||||
else \
|
||||
{ \
|
||||
USHORT _psm_val; \
|
||||
_psm_val = _val; \
|
||||
RTUSBEnqueueInternalCmd(_pAd, CMDTHREAD_SET_PSM_BIT, &(_psm_val), sizeof(USHORT)); \
|
||||
}\
|
||||
}
|
||||
|
||||
#define RTMP_MLME_RADIO_ON(pAd) \
|
||||
RT28xxUsbMlmeRadioOn(pAd);
|
||||
|
||||
#define RTMP_MLME_RADIO_OFF(pAd) \
|
||||
RT28xxUsbMlmeRadioOFF(pAd);
|
||||
|
||||
#endif //__MAC_USB_H__ //
|
56
drivers/staging/rt2860/chip/rt2860.h
Normal file
56
drivers/staging/rt2860/chip/rt2860.h
Normal file
@ -0,0 +1,56 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __RT2860_H__
|
||||
#define __RT2860_H__
|
||||
|
||||
#include "mac_pci.h"
|
||||
|
||||
#ifndef RTMP_PCI_SUPPORT
|
||||
#error "For RT2860, you should define the compile flag -DRTMP_PCI_SUPPORT"
|
||||
#endif
|
||||
|
||||
#ifndef RTMP_MAC_PCI
|
||||
#error "For RT2880, you should define the compile flag -DRTMP_MAC_PCI"
|
||||
#endif
|
||||
|
||||
//
|
||||
// Device ID & Vendor ID, these values should match EEPROM value
|
||||
//
|
||||
#define NIC2860_PCI_DEVICE_ID 0x0601
|
||||
#define NIC2860_PCIe_DEVICE_ID 0x0681
|
||||
#define NIC2760_PCI_DEVICE_ID 0x0701 // 1T/2R Cardbus ???
|
||||
#define NIC2790_PCIe_DEVICE_ID 0x0781 // 1T/2R miniCard
|
||||
|
||||
|
||||
#define VEN_AWT_PCIe_DEVICE_ID 0x1059
|
||||
#define VEN_AWT_PCI_VENDOR_ID 0x1A3B
|
||||
|
||||
#define EDIMAX_PCI_VENDOR_ID 0x1432
|
||||
|
||||
|
||||
#endif //__RT2860_H__ //
|
47
drivers/staging/rt2860/chip/rt2870.h
Normal file
47
drivers/staging/rt2860/chip/rt2870.h
Normal file
@ -0,0 +1,47 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
#ifndef __RT2870_H__
|
||||
#define __RT2870_H__
|
||||
|
||||
#ifdef RT2870
|
||||
|
||||
#ifndef RTMP_USB_SUPPORT
|
||||
#error "For RT2870, you should define the compile flag -DRTMP_USB_SUPPORT"
|
||||
#endif
|
||||
|
||||
#ifndef RTMP_MAC_USB
|
||||
#error "For RT2870, you should define the compile flag -DRTMP_MAC_USB"
|
||||
#endif
|
||||
|
||||
#include "../rtmp_type.h"
|
||||
#include "mac_usb.h"
|
||||
|
||||
|
||||
//#define RTMP_CHIP_NAME "RT2870"
|
||||
|
||||
#endif // RT2870 //
|
||||
#endif //__RT2870_H__ //
|
68
drivers/staging/rt2860/chip/rt3070.h
Normal file
68
drivers/staging/rt2860/chip/rt3070.h
Normal file
@ -0,0 +1,68 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt3070.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __RT3070_H__
|
||||
#define __RT3070_H__
|
||||
|
||||
#ifdef RT3070
|
||||
|
||||
|
||||
#ifndef RTMP_USB_SUPPORT
|
||||
#error "For RT3070, you should define the compile flag -DRTMP_USB_SUPPORT"
|
||||
#endif
|
||||
|
||||
#ifndef RTMP_MAC_USB
|
||||
#error "For RT3070, you should define the compile flag -DRTMP_MAC_USB"
|
||||
#endif
|
||||
|
||||
#ifndef RTMP_RF_RW_SUPPORT
|
||||
#error "For RT3070, you should define the compile flag -DRTMP_RF_RW_SUPPORT"
|
||||
#endif
|
||||
|
||||
#ifndef RT30xx
|
||||
#error "For RT3070, you should define the compile flag -DRT30xx"
|
||||
#endif
|
||||
|
||||
#include "mac_usb.h"
|
||||
#include "rt30xx.h"
|
||||
|
||||
//
|
||||
// Device ID & Vendor ID, these values should match EEPROM value
|
||||
//
|
||||
|
||||
#endif // RT3070 //
|
||||
|
||||
#endif //__RT3070_H__ //
|
48
drivers/staging/rt2860/chip/rt30xx.h
Normal file
48
drivers/staging/rt2860/chip/rt30xx.h
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt30xx.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __RT30XX_H__
|
||||
#define __RT30XX_H__
|
||||
|
||||
#ifdef RT30xx
|
||||
|
||||
|
||||
extern REG_PAIR RT30xx_RFRegTable[];
|
||||
extern UCHAR NUM_RF_REG_PARMS;
|
||||
|
||||
#endif // RT30xx //
|
||||
|
||||
#endif //__RT30XX_H__ //
|
File diff suppressed because it is too large
Load Diff
405
drivers/staging/rt2860/chip/rtmp_phy.h
Normal file
405
drivers/staging/rt2860/chip/rtmp_phy.h
Normal file
@ -0,0 +1,405 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_phy.h
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless Chip PHY(BBP/RF) related definition & structures
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_PHY_H__
|
||||
#define __RTMP_PHY_H__
|
||||
|
||||
|
||||
/*
|
||||
RF sections
|
||||
*/
|
||||
#define RF_R00 0
|
||||
#define RF_R01 1
|
||||
#define RF_R02 2
|
||||
#define RF_R03 3
|
||||
#define RF_R04 4
|
||||
#define RF_R05 5
|
||||
#define RF_R06 6
|
||||
#define RF_R07 7
|
||||
#define RF_R08 8
|
||||
#define RF_R09 9
|
||||
#define RF_R10 10
|
||||
#define RF_R11 11
|
||||
#define RF_R12 12
|
||||
#define RF_R13 13
|
||||
#define RF_R14 14
|
||||
#define RF_R15 15
|
||||
#define RF_R16 16
|
||||
#define RF_R17 17
|
||||
#define RF_R18 18
|
||||
#define RF_R19 19
|
||||
#define RF_R20 20
|
||||
#define RF_R21 21
|
||||
#define RF_R22 22
|
||||
#define RF_R23 23
|
||||
#define RF_R24 24
|
||||
#define RF_R25 25
|
||||
#define RF_R26 26
|
||||
#define RF_R27 27
|
||||
#define RF_R28 28
|
||||
#define RF_R29 29
|
||||
#define RF_R30 30
|
||||
#define RF_R31 31
|
||||
|
||||
|
||||
// value domain of pAd->RfIcType
|
||||
#define RFIC_2820 1 // 2.4G 2T3R
|
||||
#define RFIC_2850 2 // 2.4G/5G 2T3R
|
||||
#define RFIC_2720 3 // 2.4G 1T2R
|
||||
#define RFIC_2750 4 // 2.4G/5G 1T2R
|
||||
#define RFIC_3020 5 // 2.4G 1T1R
|
||||
#define RFIC_2020 6 // 2.4G B/G
|
||||
#define RFIC_3021 7 // 2.4G 1T2R
|
||||
#define RFIC_3022 8 // 2.4G 2T2R
|
||||
#define RFIC_3052 9 // 2.4G/5G 2T2R
|
||||
|
||||
/*
|
||||
BBP sections
|
||||
*/
|
||||
#define BBP_R0 0 // version
|
||||
#define BBP_R1 1 // TSSI
|
||||
#define BBP_R2 2 // TX configure
|
||||
#define BBP_R3 3
|
||||
#define BBP_R4 4
|
||||
#define BBP_R5 5
|
||||
#define BBP_R6 6
|
||||
#define BBP_R14 14 // RX configure
|
||||
#define BBP_R16 16
|
||||
#define BBP_R17 17 // RX sensibility
|
||||
#define BBP_R18 18
|
||||
#define BBP_R21 21
|
||||
#define BBP_R22 22
|
||||
#define BBP_R24 24
|
||||
#define BBP_R25 25
|
||||
#define BBP_R26 26
|
||||
#define BBP_R27 27
|
||||
#define BBP_R31 31
|
||||
#define BBP_R49 49 //TSSI
|
||||
#define BBP_R50 50
|
||||
#define BBP_R51 51
|
||||
#define BBP_R52 52
|
||||
#define BBP_R55 55
|
||||
#define BBP_R62 62 // Rx SQ0 Threshold HIGH
|
||||
#define BBP_R63 63
|
||||
#define BBP_R64 64
|
||||
#define BBP_R65 65
|
||||
#define BBP_R66 66
|
||||
#define BBP_R67 67
|
||||
#define BBP_R68 68
|
||||
#define BBP_R69 69
|
||||
#define BBP_R70 70 // Rx AGC SQ CCK Xcorr threshold
|
||||
#define BBP_R73 73
|
||||
#define BBP_R75 75
|
||||
#define BBP_R77 77
|
||||
#define BBP_R78 78
|
||||
#define BBP_R79 79
|
||||
#define BBP_R80 80
|
||||
#define BBP_R81 81
|
||||
#define BBP_R82 82
|
||||
#define BBP_R83 83
|
||||
#define BBP_R84 84
|
||||
#define BBP_R86 86
|
||||
#define BBP_R91 91
|
||||
#define BBP_R92 92
|
||||
#define BBP_R94 94 // Tx Gain Control
|
||||
#define BBP_R103 103
|
||||
#define BBP_R105 105
|
||||
#define BBP_R106 106
|
||||
#define BBP_R113 113
|
||||
#define BBP_R114 114
|
||||
#define BBP_R115 115
|
||||
#define BBP_R116 116
|
||||
#define BBP_R117 117
|
||||
#define BBP_R118 118
|
||||
#define BBP_R119 119
|
||||
#define BBP_R120 120
|
||||
#define BBP_R121 121
|
||||
#define BBP_R122 122
|
||||
#define BBP_R123 123
|
||||
#ifdef RT30xx
|
||||
#define BBP_R138 138 // add by johnli, RF power sequence setup, ADC dynamic on/off control
|
||||
#endif // RT30xx //
|
||||
|
||||
#define BBPR94_DEFAULT 0x06 // Add 1 value will gain 1db
|
||||
|
||||
//
|
||||
// BBP & RF are using indirect access. Before write any value into it.
|
||||
// We have to make sure there is no outstanding command pending via checking busy bit.
|
||||
//
|
||||
#define MAX_BUSY_COUNT 100 // Number of retry before failing access BBP & RF indirect register
|
||||
|
||||
//#define PHY_TR_SWITCH_TIME 5 // usec
|
||||
|
||||
//#define BBP_R17_LOW_SENSIBILITY 0x50
|
||||
//#define BBP_R17_MID_SENSIBILITY 0x41
|
||||
//#define BBP_R17_DYNAMIC_UP_BOUND 0x40
|
||||
|
||||
#define RSSI_FOR_VERY_LOW_SENSIBILITY -35
|
||||
#define RSSI_FOR_LOW_SENSIBILITY -58
|
||||
#define RSSI_FOR_MID_LOW_SENSIBILITY -80
|
||||
#define RSSI_FOR_MID_SENSIBILITY -90
|
||||
|
||||
/*****************************************************************************
|
||||
RF register Read/Write marco definition
|
||||
*****************************************************************************/
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#define RTMP_RF_IO_WRITE32(_A, _V) \
|
||||
{ \
|
||||
if ((_A)->bPCIclkOff == FALSE) \
|
||||
{ \
|
||||
PHY_CSR4_STRUC _value; \
|
||||
ULONG _busyCnt = 0; \
|
||||
\
|
||||
do { \
|
||||
RTMP_IO_READ32((_A), RF_CSR_CFG0, &_value.word); \
|
||||
if (_value.field.Busy == IDLE) \
|
||||
break; \
|
||||
_busyCnt++; \
|
||||
}while (_busyCnt < MAX_BUSY_COUNT); \
|
||||
if(_busyCnt < MAX_BUSY_COUNT) \
|
||||
{ \
|
||||
RTMP_IO_WRITE32((_A), RF_CSR_CFG0, (_V)); \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
#endif // RTMP_MAC_PCI //
|
||||
#ifdef RTMP_MAC_USB
|
||||
#define RTMP_RF_IO_WRITE32(_A, _V) RTUSBWriteRFRegister(_A, _V)
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
#ifdef RT30xx
|
||||
#define RTMP_RF_IO_READ8_BY_REG_ID(_A, _I, _pV) RT30xxReadRFRegister(_A, _I, _pV)
|
||||
#define RTMP_RF_IO_WRITE8_BY_REG_ID(_A, _I, _V) RT30xxWriteRFRegister(_A, _I, _V)
|
||||
#endif // RT30xx //
|
||||
|
||||
/*****************************************************************************
|
||||
BBP register Read/Write marco definitions.
|
||||
we read/write the bbp value by register's ID.
|
||||
Generate PER to test BA
|
||||
*****************************************************************************/
|
||||
#ifdef RTMP_MAC_PCI
|
||||
/*
|
||||
basic marco for BBP read operation.
|
||||
_pAd: the data structure pointer of RTMP_ADAPTER
|
||||
_bbpID : the bbp register ID
|
||||
_pV: data pointer used to save the value of queried bbp register.
|
||||
_bViaMCU: if we need access the bbp via the MCU.
|
||||
*/
|
||||
#define RTMP_BBP_IO_READ8(_pAd, _bbpID, _pV, _bViaMCU) \
|
||||
do{ \
|
||||
BBP_CSR_CFG_STRUC BbpCsr; \
|
||||
int _busyCnt, _secCnt, _regID; \
|
||||
\
|
||||
_regID = ((_bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); \
|
||||
for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
continue; \
|
||||
BbpCsr.word = 0; \
|
||||
BbpCsr.field.fRead = 1; \
|
||||
BbpCsr.field.BBP_RW_MODE = 1; \
|
||||
BbpCsr.field.Busy = 1; \
|
||||
BbpCsr.field.RegNum = _bbpID; \
|
||||
RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \
|
||||
if ((_bViaMCU) == TRUE) \
|
||||
{ \
|
||||
AsicSendCommandToMcu(_pAd, 0x80, 0xff, 0x0, 0x0); \
|
||||
RTMPusecDelay(1000); \
|
||||
} \
|
||||
for (_secCnt=0; _secCnt<MAX_BUSY_COUNT; _secCnt++) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == IDLE) \
|
||||
break; \
|
||||
} \
|
||||
if ((BbpCsr.field.Busy == IDLE) && \
|
||||
(BbpCsr.field.RegNum == _bbpID)) \
|
||||
{ \
|
||||
*(_pV) = (UCHAR)BbpCsr.field.Value; \
|
||||
break; \
|
||||
} \
|
||||
} \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
{ \
|
||||
DBGPRINT_ERR(("BBP(viaMCU=%d) read R%d fail\n", (_bViaMCU), _bbpID)); \
|
||||
*(_pV) = (_pAd)->BbpWriteLatch[_bbpID]; \
|
||||
if ((_bViaMCU) == TRUE) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_pAd, _regID, &BbpCsr.word); \
|
||||
BbpCsr.field.Busy = 0; \
|
||||
RTMP_IO_WRITE32(_pAd, _regID, BbpCsr.word); \
|
||||
} \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
/*
|
||||
This marco used for the BBP read operation which didn't need via MCU.
|
||||
*/
|
||||
#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) \
|
||||
RTMP_BBP_IO_READ8((_A), (_I), (_pV), FALSE)
|
||||
|
||||
/*
|
||||
This marco used for the BBP read operation which need via MCU.
|
||||
But for some chipset which didn't have mcu (e.g., RBUS based chipset), we
|
||||
will use this function too and didn't access the bbp register via the MCU.
|
||||
*/
|
||||
#define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) \
|
||||
do{ \
|
||||
if ((_A)->bPCIclkOff == FALSE) \
|
||||
{ \
|
||||
if ((_A)->infType == RTMP_DEV_INF_RBUS) \
|
||||
RTMP_BBP_IO_READ8((_A), (_I), (_pV), FALSE); \
|
||||
else \
|
||||
RTMP_BBP_IO_READ8((_A), (_I), (_pV), TRUE); \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
|
||||
/*
|
||||
basic marco for BBP write operation.
|
||||
_pAd: the data structure pointer of RTMP_ADAPTER
|
||||
_bbpID : the bbp register ID
|
||||
_pV: data used to save the value of queried bbp register.
|
||||
_bViaMCU: if we need access the bbp via the MCU.
|
||||
*/
|
||||
#define RTMP_BBP_IO_WRITE8(_pAd, _bbpID, _pV, _bViaMCU) \
|
||||
do{ \
|
||||
BBP_CSR_CFG_STRUC BbpCsr; \
|
||||
int _busyCnt, _regID; \
|
||||
\
|
||||
_regID = ((_bViaMCU) == TRUE ? H2M_BBP_AGENT : BBP_CSR_CFG); \
|
||||
for (_busyCnt=0; _busyCnt<MAX_BUSY_COUNT; _busyCnt++) \
|
||||
{ \
|
||||
RTMP_IO_READ32((_pAd), BBP_CSR_CFG, &BbpCsr.word); \
|
||||
if (BbpCsr.field.Busy == BUSY) \
|
||||
continue; \
|
||||
BbpCsr.word = 0; \
|
||||
BbpCsr.field.fRead = 0; \
|
||||
BbpCsr.field.BBP_RW_MODE = 1; \
|
||||
BbpCsr.field.Busy = 1; \
|
||||
BbpCsr.field.Value = _pV; \
|
||||
BbpCsr.field.RegNum = _bbpID; \
|
||||
RTMP_IO_WRITE32((_pAd), BBP_CSR_CFG, BbpCsr.word); \
|
||||
if ((_bViaMCU) == TRUE) \
|
||||
{ \
|
||||
AsicSendCommandToMcu(_pAd, 0x80, 0xff, 0x0, 0x0); \
|
||||
if ((_pAd)->OpMode == OPMODE_AP) \
|
||||
RTMPusecDelay(1000); \
|
||||
} \
|
||||
(_pAd)->BbpWriteLatch[_bbpID] = _pV; \
|
||||
break; \
|
||||
} \
|
||||
if (_busyCnt == MAX_BUSY_COUNT) \
|
||||
{ \
|
||||
DBGPRINT_ERR(("BBP write R%d fail\n", _bbpID)); \
|
||||
if((_bViaMCU) == TRUE) \
|
||||
{ \
|
||||
RTMP_IO_READ32(_pAd, H2M_BBP_AGENT, &BbpCsr.word); \
|
||||
BbpCsr.field.Busy = 0; \
|
||||
RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, BbpCsr.word); \
|
||||
} \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
|
||||
/*
|
||||
This marco used for the BBP write operation which didn't need via MCU.
|
||||
*/
|
||||
#define BBP_IO_WRITE8_BY_REG_ID(_A, _I, _pV) \
|
||||
RTMP_BBP_IO_WRITE8((_A), (_I), (_pV), FALSE)
|
||||
|
||||
/*
|
||||
This marco used for the BBP write operation which need via MCU.
|
||||
But for some chipset which didn't have mcu (e.g., RBUS based chipset), we
|
||||
will use this function too and didn't access the bbp register via the MCU.
|
||||
*/
|
||||
#define RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _pV) \
|
||||
do{ \
|
||||
if ((_A)->bPCIclkOff == FALSE) \
|
||||
{ \
|
||||
if ((_A)->infType == RTMP_DEV_INF_RBUS) \
|
||||
RTMP_BBP_IO_WRITE8((_A), (_I), (_pV), FALSE); \
|
||||
else \
|
||||
RTMP_BBP_IO_WRITE8((_A), (_I), (_pV), TRUE); \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
#endif // RTMP_MAC_PCI //
|
||||
#ifdef RTMP_MAC_USB
|
||||
#define RTMP_BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) RTUSBReadBBPRegister(_A, _I, _pV)
|
||||
#define RTMP_BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V) RTUSBWriteBBPRegister(_A, _I, _V)
|
||||
|
||||
#define BBP_IO_WRITE8_BY_REG_ID(_A, _I, _V) RTUSBWriteBBPRegister(_A, _I, _V)
|
||||
#define BBP_IO_READ8_BY_REG_ID(_A, _I, _pV) RTUSBReadBBPRegister(_A, _I, _pV)
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
#ifdef RT30xx
|
||||
#define RTMP_ASIC_MMPS_DISABLE(_pAd) \
|
||||
do{ \
|
||||
UCHAR _bbpData; \
|
||||
UINT32 _macData; \
|
||||
/* disable MMPS BBP control register */ \
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(_pAd, BBP_R3, &_bbpData); \
|
||||
_bbpData &= ~(0x04); /*bit 2*/ \
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(_pAd, BBP_R3, _bbpData); \
|
||||
\
|
||||
/* disable MMPS MAC control register */ \
|
||||
RTMP_IO_READ32(_pAd, 0x1210, &_macData); \
|
||||
_macData &= ~(0x09); /*bit 0, 3*/ \
|
||||
RTMP_IO_WRITE32(_pAd, 0x1210, _macData); \
|
||||
}while(0)
|
||||
|
||||
|
||||
#define RTMP_ASIC_MMPS_ENABLE(_pAd) \
|
||||
do{ \
|
||||
UCHAR _bbpData; \
|
||||
UINT32 _macData; \
|
||||
/* enable MMPS BBP control register */ \
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(_pAd, BBP_R3, &_bbpData); \
|
||||
_bbpData |= (0x04); /*bit 2*/ \
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(_pAd, BBP_R3, _bbpData); \
|
||||
\
|
||||
/* enable MMPS MAC control register */ \
|
||||
RTMP_IO_READ32(_pAd, 0x1210, &_macData); \
|
||||
_macData |= (0x09); /*bit 0, 3*/ \
|
||||
RTMP_IO_WRITE32(_pAd, 0x1210, _macData); \
|
||||
}while(0)
|
||||
|
||||
#endif // RT30xx //
|
||||
|
||||
#endif // __RTMP_PHY_H__ //
|
185
drivers/staging/rt2860/chips/rt3070.c
Normal file
185
drivers/staging/rt2860/chips/rt3070.c
Normal file
@ -0,0 +1,185 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt3070.c
|
||||
|
||||
Abstract:
|
||||
Specific funcitons and variables for RT3070
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifdef RT3070
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
#ifndef RTMP_RF_RW_SUPPORT
|
||||
#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
|
||||
#endif // RTMP_RF_RW_SUPPORT //
|
||||
|
||||
|
||||
VOID NICInitRT3070RFRegisters(IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT i;
|
||||
UCHAR RFValue;
|
||||
|
||||
// Driver must read EEPROM to get RfIcType before initial RF registers
|
||||
// Initialize RF register to default value
|
||||
if (IS_RT3070(pAd) || IS_RT3071(pAd))
|
||||
{
|
||||
// Init RF calibration
|
||||
// Driver should toggle RF R30 bit7 before init RF registers
|
||||
UINT32 RfReg = 0;
|
||||
UINT32 data;
|
||||
|
||||
RT30xxReadRFRegister(pAd, RF_R30, (PUCHAR)&RfReg);
|
||||
RfReg |= 0x80;
|
||||
RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
|
||||
RTMPusecDelay(1000);
|
||||
RfReg &= 0x7F;
|
||||
RT30xxWriteRFRegister(pAd, RF_R30, (UCHAR)RfReg);
|
||||
|
||||
// Initialize RF register to default value
|
||||
for (i = 0; i < NUM_RF_REG_PARMS; i++)
|
||||
{
|
||||
RT30xxWriteRFRegister(pAd, RT30xx_RFRegTable[i].Register, RT30xx_RFRegTable[i].Value);
|
||||
}
|
||||
|
||||
// add by johnli
|
||||
if (IS_RT3070(pAd))
|
||||
{
|
||||
//
|
||||
// The DAC issue(LDO_CFG0) has been fixed in RT3070(F).
|
||||
// The voltage raising patch is no longer needed for RT3070(F)
|
||||
//
|
||||
if ((pAd->MACVersion & 0xffff) < 0x0201)
|
||||
{
|
||||
// Update MAC 0x05D4 from 01xxxxxx to 0Dxxxxxx (voltage 1.2V to 1.35V) for RT3070 to improve yield rate
|
||||
RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
|
||||
data = ((data & 0xF0FFFFFF) | 0x0D000000);
|
||||
RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
|
||||
}
|
||||
}
|
||||
else if (IS_RT3071(pAd))
|
||||
{
|
||||
// Driver should set RF R6 bit6 on before init RF registers
|
||||
RT30xxReadRFRegister(pAd, RF_R06, (PUCHAR)&RfReg);
|
||||
RfReg |= 0x40;
|
||||
RT30xxWriteRFRegister(pAd, RF_R06, (UCHAR)RfReg);
|
||||
|
||||
// init R31
|
||||
RT30xxWriteRFRegister(pAd, RF_R31, 0x14);
|
||||
|
||||
// RT3071 version E has fixed this issue
|
||||
if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211))
|
||||
{
|
||||
// patch tx EVM issue temporarily
|
||||
RTUSBReadMACRegister(pAd, LDO_CFG0, &data);
|
||||
data = ((data & 0xE0FFFFFF) | 0x0D000000);
|
||||
RTUSBWriteMACRegister(pAd, LDO_CFG0, data);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_IO_READ32(pAd, LDO_CFG0, &data);
|
||||
data = ((data & 0xE0FFFFFF) | 0x01000000);
|
||||
RTMP_IO_WRITE32(pAd, LDO_CFG0, data);
|
||||
}
|
||||
|
||||
// patch LNA_PE_G1 failed issue
|
||||
RTUSBReadMACRegister(pAd, GPIO_SWITCH, &data);
|
||||
data &= ~(0x20);
|
||||
RTUSBWriteMACRegister(pAd, GPIO_SWITCH, data);
|
||||
}
|
||||
|
||||
//For RF filter Calibration
|
||||
RTMPFilterCalibration(pAd);
|
||||
|
||||
// Initialize RF R27 register, set RF R27 must be behind RTMPFilterCalibration()
|
||||
//
|
||||
// TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
|
||||
// Raising RF voltage is no longer needed for RT3070(F)
|
||||
//
|
||||
if ((IS_RT3070(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0201))
|
||||
{
|
||||
RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
|
||||
}
|
||||
else if ((IS_RT3071(pAd)) && ((pAd->MACVersion & 0xffff) < 0x0211))
|
||||
{
|
||||
RT30xxWriteRFRegister(pAd, RF_R27, 0x3);
|
||||
}
|
||||
|
||||
// set led open drain enable
|
||||
RTUSBReadMACRegister(pAd, OPT_14, &data);
|
||||
data |= 0x01;
|
||||
RTUSBWriteMACRegister(pAd, OPT_14, data);
|
||||
|
||||
// move from RT30xxLoadRFNormalModeSetup because it's needed for both RT3070 and RT3071
|
||||
// TX_LO1_en, RF R17 register Bit 3 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
|
||||
RFValue &= (~0x08);
|
||||
// to fix rx long range issue
|
||||
if (pAd->NicConfig2.field.ExternalLNAForG == 0)
|
||||
{
|
||||
if ((IS_RT3071(pAd) && ((pAd->MACVersion & 0xffff) >= 0x0211)) || IS_RT3070(pAd))
|
||||
{
|
||||
RFValue |= 0x20;
|
||||
}
|
||||
}
|
||||
// set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
|
||||
if (pAd->TxMixerGain24G >= 1)
|
||||
{
|
||||
RFValue &= (~0x7); // clean bit [2:0]
|
||||
RFValue |= pAd->TxMixerGain24G;
|
||||
}
|
||||
RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
|
||||
|
||||
if (IS_RT3071(pAd))
|
||||
{
|
||||
// add by johnli, RF power sequence setup, load RF normal operation-mode setup
|
||||
RT30xxLoadRFNormalModeSetup(pAd);
|
||||
}
|
||||
else if (IS_RT3070(pAd))
|
||||
{
|
||||
/* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/
|
||||
// LDORF_VC, RF R27 register Bit 2 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
|
||||
// TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
|
||||
// Raising RF voltage is no longer needed for RT3070(F)
|
||||
if ((pAd->MACVersion & 0xffff) < 0x0201)
|
||||
RFValue = (RFValue & (~0x77)) | 0x3;
|
||||
else
|
||||
RFValue = (RFValue & (~0x77));
|
||||
RT30xxWriteRFRegister(pAd, RF_R27, RFValue);
|
||||
/* end johnli */
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
#endif // RT3070 //
|
525
drivers/staging/rt2860/chips/rt30xx.c
Normal file
525
drivers/staging/rt2860/chips/rt30xx.c
Normal file
@ -0,0 +1,525 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt30xx.c
|
||||
|
||||
Abstract:
|
||||
Specific funcitons and variables for RT30xx.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#ifdef RT30xx
|
||||
|
||||
|
||||
#ifndef RTMP_RF_RW_SUPPORT
|
||||
#error "You Should Enable compile flag RTMP_RF_RW_SUPPORT for this chip"
|
||||
#endif // RTMP_RF_RW_SUPPORT //
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
//
|
||||
// RF register initialization set
|
||||
//
|
||||
REG_PAIR RT30xx_RFRegTable[] = {
|
||||
{RF_R04, 0x40},
|
||||
{RF_R05, 0x03},
|
||||
{RF_R06, 0x02},
|
||||
{RF_R07, 0x70},
|
||||
{RF_R09, 0x0F},
|
||||
{RF_R10, 0x41},
|
||||
{RF_R11, 0x21},
|
||||
{RF_R12, 0x7B},
|
||||
{RF_R14, 0x90},
|
||||
{RF_R15, 0x58},
|
||||
{RF_R16, 0xB3},
|
||||
{RF_R17, 0x92},
|
||||
{RF_R18, 0x2C},
|
||||
{RF_R19, 0x02},
|
||||
{RF_R20, 0xBA},
|
||||
{RF_R21, 0xDB},
|
||||
{RF_R24, 0x16},
|
||||
{RF_R25, 0x01},
|
||||
{RF_R29, 0x1F},
|
||||
};
|
||||
|
||||
UCHAR NUM_RF_REG_PARMS = (sizeof(RT30xx_RFRegTable) / sizeof(REG_PAIR));
|
||||
|
||||
|
||||
|
||||
// Antenna divesity use GPIO3 and EESK pin for control
|
||||
// Antenna and EEPROM access are both using EESK pin,
|
||||
// Therefor we should avoid accessing EESK at the same time
|
||||
// Then restore antenna after EEPROM access
|
||||
// The original name of this function is AsicSetRxAnt(), now change to
|
||||
//VOID AsicSetRxAnt(
|
||||
VOID RT30xxSetRxAnt(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Ant)
|
||||
{
|
||||
UINT32 Value;
|
||||
UINT32 x;
|
||||
|
||||
if ((pAd->EepromAccess) ||
|
||||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) ||
|
||||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) ||
|
||||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF)) ||
|
||||
(RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
// the antenna selection is through firmware and MAC register(GPIO3)
|
||||
if (Ant == 0)
|
||||
{
|
||||
// Main antenna
|
||||
AsicSendCommandToMcu(pAd, 0x73, 0xFF, 0x1, 0x0);
|
||||
|
||||
RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value);
|
||||
Value &= ~(0x0808);
|
||||
RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to main antenna\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
// Aux antenna
|
||||
AsicSendCommandToMcu(pAd, 0x73, 0xFF, 0x0, 0x0);
|
||||
RTMP_IO_READ32(pAd, GPIO_CTRL_CFG, &Value);
|
||||
Value &= ~(0x0808);
|
||||
Value |= 0x08;
|
||||
RTMP_IO_WRITE32(pAd, GPIO_CTRL_CFG, Value);
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicSetRxAnt, switch to aux antenna\n"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
For RF filter calibration purpose
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPFilterCalibration(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR R55x = 0, value, FilterTarget = 0x1E, BBPValue=0;
|
||||
UINT loop = 0, count = 0, loopcnt = 0, ReTry = 0;
|
||||
UCHAR RF_R24_Value = 0;
|
||||
|
||||
// Give bbp filter initial value
|
||||
pAd->Mlme.CaliBW20RfR24 = 0x1F;
|
||||
pAd->Mlme.CaliBW40RfR24 = 0x2F; //Bit[5] must be 1 for BW 40
|
||||
|
||||
do
|
||||
{
|
||||
if (loop == 1) //BandWidth = 40 MHz
|
||||
{
|
||||
// Write 0x27 to RF_R24 to program filter
|
||||
RF_R24_Value = 0x27;
|
||||
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
|
||||
if (IS_RT3090(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd))
|
||||
FilterTarget = 0x15;
|
||||
else
|
||||
FilterTarget = 0x19;
|
||||
|
||||
// when calibrate BW40, BBP mask must set to BW40.
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
|
||||
BBPValue&= (~0x18);
|
||||
BBPValue|= (0x10);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
|
||||
|
||||
// set to BW40
|
||||
RT30xxReadRFRegister(pAd, RF_R31, &value);
|
||||
value |= 0x20;
|
||||
RT30xxWriteRFRegister(pAd, RF_R31, value);
|
||||
}
|
||||
else //BandWidth = 20 MHz
|
||||
{
|
||||
// Write 0x07 to RF_R24 to program filter
|
||||
RF_R24_Value = 0x07;
|
||||
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
|
||||
if (IS_RT3090(pAd) || IS_RT3572(pAd)|| IS_RT3390(pAd))
|
||||
FilterTarget = 0x13;
|
||||
else
|
||||
FilterTarget = 0x16;
|
||||
|
||||
// set to BW20
|
||||
RT30xxReadRFRegister(pAd, RF_R31, &value);
|
||||
value &= (~0x20);
|
||||
RT30xxWriteRFRegister(pAd, RF_R31, value);
|
||||
}
|
||||
|
||||
// Write 0x01 to RF_R22 to enable baseband loopback mode
|
||||
RT30xxReadRFRegister(pAd, RF_R22, &value);
|
||||
value |= 0x01;
|
||||
RT30xxWriteRFRegister(pAd, RF_R22, value);
|
||||
|
||||
// Write 0x00 to BBP_R24 to set power & frequency of passband test tone
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
|
||||
|
||||
do
|
||||
{
|
||||
// Write 0x90 to BBP_R25 to transmit test tone
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
|
||||
|
||||
RTMPusecDelay(1000);
|
||||
// Read BBP_R55[6:0] for received power, set R55x = BBP_R55[6:0]
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
|
||||
R55x = value & 0xFF;
|
||||
|
||||
} while ((ReTry++ < 100) && (R55x == 0));
|
||||
|
||||
// Write 0x06 to BBP_R24 to set power & frequency of stopband test tone
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0x06);
|
||||
|
||||
while(TRUE)
|
||||
{
|
||||
// Write 0x90 to BBP_R25 to transmit test tone
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R25, 0x90);
|
||||
|
||||
//We need to wait for calibration
|
||||
RTMPusecDelay(1000);
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R55, &value);
|
||||
value &= 0xFF;
|
||||
if ((R55x - value) < FilterTarget)
|
||||
{
|
||||
RF_R24_Value ++;
|
||||
}
|
||||
else if ((R55x - value) == FilterTarget)
|
||||
{
|
||||
RF_R24_Value ++;
|
||||
count ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
// prevent infinite loop cause driver hang.
|
||||
if (loopcnt++ > 100)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("RTMPFilterCalibration - can't find a valid value, loopcnt=%d stop calibrating", loopcnt));
|
||||
break;
|
||||
}
|
||||
|
||||
// Write RF_R24 to program filter
|
||||
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
|
||||
}
|
||||
|
||||
if (count > 0)
|
||||
{
|
||||
RF_R24_Value = RF_R24_Value - ((count) ? (1) : (0));
|
||||
}
|
||||
|
||||
// Store for future usage
|
||||
if (loopcnt < 100)
|
||||
{
|
||||
if (loop++ == 0)
|
||||
{
|
||||
//BandWidth = 20 MHz
|
||||
pAd->Mlme.CaliBW20RfR24 = (UCHAR)RF_R24_Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
//BandWidth = 40 MHz
|
||||
pAd->Mlme.CaliBW40RfR24 = (UCHAR)RF_R24_Value;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
RT30xxWriteRFRegister(pAd, RF_R24, RF_R24_Value);
|
||||
|
||||
// reset count
|
||||
count = 0;
|
||||
} while(TRUE);
|
||||
|
||||
//
|
||||
// Set back to initial state
|
||||
//
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R24, 0);
|
||||
|
||||
RT30xxReadRFRegister(pAd, RF_R22, &value);
|
||||
value &= ~(0x01);
|
||||
RT30xxWriteRFRegister(pAd, RF_R22, value);
|
||||
|
||||
// set BBP back to BW20
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
|
||||
BBPValue&= (~0x18);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RTMPFilterCalibration - CaliBW20RfR24=0x%x, CaliBW40RfR24=0x%x\n", pAd->Mlme.CaliBW20RfR24, pAd->Mlme.CaliBW40RfR24));
|
||||
}
|
||||
|
||||
|
||||
// add by johnli, RF power sequence setup
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
|
||||
Load RF normal operation-mode setup
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
VOID RT30xxLoadRFNormalModeSetup(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR RFValue;
|
||||
|
||||
// RX0_PD & TX0_PD, RF R1 register Bit 2 & Bit 3 to 0 and RF_BLOCK_en,RX1_PD & TX1_PD, Bit0, Bit 4 & Bit5 to 1
|
||||
RT30xxReadRFRegister(pAd, RF_R01, &RFValue);
|
||||
RFValue = (RFValue & (~0x0C)) | 0x31;
|
||||
RT30xxWriteRFRegister(pAd, RF_R01, RFValue);
|
||||
|
||||
// TX_LO2_en, RF R15 register Bit 3 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R15, &RFValue);
|
||||
RFValue &= (~0x08);
|
||||
RT30xxWriteRFRegister(pAd, RF_R15, RFValue);
|
||||
|
||||
/* move to NICInitRT30xxRFRegisters
|
||||
// TX_LO1_en, RF R17 register Bit 3 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R17, &RFValue);
|
||||
RFValue &= (~0x08);
|
||||
// to fix rx long range issue
|
||||
if (((pAd->MACVersion & 0xffff) >= 0x0211) && (pAd->NicConfig2.field.ExternalLNAForG == 0))
|
||||
{
|
||||
RFValue |= 0x20;
|
||||
}
|
||||
// set RF_R17_bit[2:0] equal to EEPROM setting at 0x48h
|
||||
if (pAd->TxMixerGain24G >= 2)
|
||||
{
|
||||
RFValue &= (~0x7); // clean bit [2:0]
|
||||
RFValue |= pAd->TxMixerGain24G;
|
||||
}
|
||||
RT30xxWriteRFRegister(pAd, RF_R17, RFValue);
|
||||
*/
|
||||
|
||||
// RX_LO1_en, RF R20 register Bit 3 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R20, &RFValue);
|
||||
RFValue &= (~0x08);
|
||||
RT30xxWriteRFRegister(pAd, RF_R20, RFValue);
|
||||
|
||||
// RX_LO2_en, RF R21 register Bit 3 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R21, &RFValue);
|
||||
RFValue &= (~0x08);
|
||||
RT30xxWriteRFRegister(pAd, RF_R21, RFValue);
|
||||
|
||||
/* add by johnli, reset RF_R27 when interface down & up to fix throughput problem*/
|
||||
// LDORF_VC, RF R27 register Bit 2 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
|
||||
// TX to RX IQ glitch(RF_R27) has been fixed in RT3070(F).
|
||||
// Raising RF voltage is no longer needed for RT3070(F)
|
||||
if (IS_RT3090(pAd)) // RT309x and RT3071/72
|
||||
{
|
||||
if ((pAd->MACVersion & 0xffff) < 0x0211)
|
||||
RFValue = (RFValue & (~0x77)) | 0x3;
|
||||
else
|
||||
RFValue = (RFValue & (~0x77));
|
||||
RT30xxWriteRFRegister(pAd, RF_R27, RFValue);
|
||||
}
|
||||
/* end johnli */
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
|
||||
Load RF sleep-mode setup
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
VOID RT30xxLoadRFSleepModeSetup(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR RFValue;
|
||||
UINT32 MACValue;
|
||||
|
||||
|
||||
#ifdef RTMP_MAC_USB
|
||||
if(!IS_RT3572(pAd))
|
||||
#endif // RTMP_MAC_USB //
|
||||
{
|
||||
// RF_BLOCK_en. RF R1 register Bit 0 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R01, &RFValue);
|
||||
RFValue &= (~0x01);
|
||||
RT30xxWriteRFRegister(pAd, RF_R01, RFValue);
|
||||
|
||||
// VCO_IC, RF R7 register Bit 4 & Bit 5 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R07, &RFValue);
|
||||
RFValue &= (~0x30);
|
||||
RT30xxWriteRFRegister(pAd, RF_R07, RFValue);
|
||||
|
||||
// Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R09, &RFValue);
|
||||
RFValue &= (~0x0E);
|
||||
RT30xxWriteRFRegister(pAd, RF_R09, RFValue);
|
||||
|
||||
// RX_CTB_en, RF R21 register Bit 7 to 0
|
||||
RT30xxReadRFRegister(pAd, RF_R21, &RFValue);
|
||||
RFValue &= (~0x80);
|
||||
RT30xxWriteRFRegister(pAd, RF_R21, RFValue);
|
||||
}
|
||||
|
||||
if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72
|
||||
IS_RT3572(pAd) ||
|
||||
(IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201)))
|
||||
{
|
||||
#ifdef RTMP_MAC_USB
|
||||
if (!IS_RT3572(pAd))
|
||||
#endif // RTMP_MAC_USB //
|
||||
{
|
||||
RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
|
||||
RFValue |= 0x77;
|
||||
RT30xxWriteRFRegister(pAd, RF_R27, RFValue);
|
||||
}
|
||||
|
||||
RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
|
||||
MACValue |= 0x1D000000;
|
||||
RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
|
||||
Reverse RF sleep-mode setup
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
VOID RT30xxReverseRFSleepModeSetup(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UCHAR RFValue;
|
||||
UINT32 MACValue;
|
||||
|
||||
#ifdef RTMP_MAC_USB
|
||||
if(!IS_RT3572(pAd))
|
||||
#endif // RTMP_MAC_USB //
|
||||
{
|
||||
// RF_BLOCK_en, RF R1 register Bit 0 to 1
|
||||
RT30xxReadRFRegister(pAd, RF_R01, &RFValue);
|
||||
RFValue |= 0x01;
|
||||
RT30xxWriteRFRegister(pAd, RF_R01, RFValue);
|
||||
|
||||
// VCO_IC, RF R7 register Bit 4 & Bit 5 to 1
|
||||
RT30xxReadRFRegister(pAd, RF_R07, &RFValue);
|
||||
RFValue |= 0x30;
|
||||
RT30xxWriteRFRegister(pAd, RF_R07, RFValue);
|
||||
|
||||
// Idoh, RF R9 register Bit 1, Bit 2 & Bit 3 to 1
|
||||
RT30xxReadRFRegister(pAd, RF_R09, &RFValue);
|
||||
RFValue |= 0x0E;
|
||||
RT30xxWriteRFRegister(pAd, RF_R09, RFValue);
|
||||
|
||||
// RX_CTB_en, RF R21 register Bit 7 to 1
|
||||
RT30xxReadRFRegister(pAd, RF_R21, &RFValue);
|
||||
RFValue |= 0x80;
|
||||
RT30xxWriteRFRegister(pAd, RF_R21, RFValue);
|
||||
}
|
||||
|
||||
if (IS_RT3090(pAd) || // IS_RT3090 including RT309x and RT3071/72
|
||||
IS_RT3572(pAd) ||
|
||||
IS_RT3390(pAd) ||
|
||||
(IS_RT3070(pAd) && ((pAd->MACVersion & 0xffff) < 0x0201)))
|
||||
{
|
||||
#ifdef RTMP_MAC_USB
|
||||
if (!IS_RT3572(pAd))
|
||||
#endif // RTMP_MAC_USB //
|
||||
{
|
||||
RT30xxReadRFRegister(pAd, RF_R27, &RFValue);
|
||||
if ((pAd->MACVersion & 0xffff) < 0x0211)
|
||||
RFValue = (RFValue & (~0x77)) | 0x3;
|
||||
else
|
||||
RFValue = (RFValue & (~0x77));
|
||||
RT30xxWriteRFRegister(pAd, RF_R27, RFValue);
|
||||
}
|
||||
|
||||
// RT3071 version E has fixed this issue
|
||||
if ((pAd->NicConfig2.field.DACTestBit == 1) && ((pAd->MACVersion & 0xffff) < 0x0211))
|
||||
{
|
||||
// patch tx EVM issue temporarily
|
||||
RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
|
||||
MACValue = ((MACValue & 0xE0FFFFFF) | 0x0D000000);
|
||||
RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_IO_READ32(pAd, LDO_CFG0, &MACValue);
|
||||
MACValue = ((MACValue & 0xE0FFFFFF) | 0x01000000);
|
||||
RTMP_IO_WRITE32(pAd, LDO_CFG0, MACValue);
|
||||
}
|
||||
}
|
||||
|
||||
if(IS_RT3572(pAd))
|
||||
RT30xxWriteRFRegister(pAd, RF_R08, 0x80);
|
||||
}
|
||||
// end johnli
|
||||
|
||||
VOID RT30xxHaltAction(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 TxPinCfg = 0x00050F0F;
|
||||
|
||||
//
|
||||
// Turn off LNA_PE or TRSW_POL
|
||||
//
|
||||
if (IS_RT3070(pAd) || IS_RT3071(pAd) || IS_RT3572(pAd))
|
||||
{
|
||||
if ((IS_RT3071(pAd) || IS_RT3572(pAd))
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
&& (pAd->bUseEfuse)
|
||||
#endif // RTMP_EFUSE_SUPPORT //
|
||||
)
|
||||
{
|
||||
TxPinCfg &= 0xFFFBF0F0; // bit18 off
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPinCfg &= 0xFFFFF0F0;
|
||||
}
|
||||
|
||||
RTMP_IO_WRITE32(pAd, TX_PIN_CFG, TxPinCfg);
|
||||
}
|
||||
}
|
||||
|
||||
#endif // RT30xx //
|
File diff suppressed because it is too large
Load Diff
@ -1,897 +0,0 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
2860_rtmp_init.c
|
||||
|
||||
Abstract:
|
||||
Miniport generic portion header file
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Paul Lin 2002-08-01 created
|
||||
John Chang 2004-08-20 RT2561/2661 use scatter-gather scheme
|
||||
Jan Lee 2006-09-15 RT2860. Change for 802.11n , EEPROM, Led, BA, HT.
|
||||
*/
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Allocate DMA memory blocks for send, receive
|
||||
|
||||
Arguments:
|
||||
Adapter Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
NDIS_STATUS_SUCCESS
|
||||
NDIS_STATUS_FAILURE
|
||||
NDIS_STATUS_RESOURCES
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RTMPAllocTxRxRingMemory(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
|
||||
ULONG RingBasePaHigh;
|
||||
ULONG RingBasePaLow;
|
||||
PVOID RingBaseVa;
|
||||
INT index, num;
|
||||
PTXD_STRUC pTxD;
|
||||
PRXD_STRUC pRxD;
|
||||
ULONG ErrorValue = 0;
|
||||
PRTMP_TX_RING pTxRing;
|
||||
PRTMP_DMABUF pDmaBuf;
|
||||
PNDIS_PACKET pPacket;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPAllocTxRxRingMemory\n"));
|
||||
do
|
||||
{
|
||||
//
|
||||
// Allocate all ring descriptors, include TxD, RxD, MgmtD.
|
||||
// Although each size is different, to prevent cacheline and alignment
|
||||
// issue, I intentional set them all to 64 bytes.
|
||||
//
|
||||
for (num=0; num<NUM_OF_TX_RING; num++)
|
||||
{
|
||||
ULONG BufBasePaHigh;
|
||||
ULONG BufBasePaLow;
|
||||
PVOID BufBaseVa;
|
||||
|
||||
//
|
||||
// Allocate Tx ring descriptor's memory (5 TX rings = 4 ACs + 1 HCCA)
|
||||
//
|
||||
pAd->TxDescRing[num].AllocSize = TX_RING_SIZE * TXD_SIZE;
|
||||
RTMP_AllocateTxDescMemory(
|
||||
pAd,
|
||||
num,
|
||||
pAd->TxDescRing[num].AllocSize,
|
||||
FALSE,
|
||||
&pAd->TxDescRing[num].AllocVa,
|
||||
&pAd->TxDescRing[num].AllocPa);
|
||||
|
||||
if (pAd->TxDescRing[num].AllocVa == NULL)
|
||||
{
|
||||
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
|
||||
DBGPRINT_ERR(("Failed to allocate a big buffer\n"));
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
// Zero init this memory block
|
||||
NdisZeroMemory(pAd->TxDescRing[num].AllocVa, pAd->TxDescRing[num].AllocSize);
|
||||
|
||||
// Save PA & VA for further operation
|
||||
RingBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->TxDescRing[num].AllocPa);
|
||||
RingBasePaLow = RTMP_GetPhysicalAddressLow (pAd->TxDescRing[num].AllocPa);
|
||||
RingBaseVa = pAd->TxDescRing[num].AllocVa;
|
||||
|
||||
//
|
||||
// Allocate all 1st TXBuf's memory for this TxRing
|
||||
//
|
||||
pAd->TxBufSpace[num].AllocSize = TX_RING_SIZE * TX_DMA_1ST_BUFFER_SIZE;
|
||||
RTMP_AllocateFirstTxBuffer(
|
||||
pAd,
|
||||
num,
|
||||
pAd->TxBufSpace[num].AllocSize,
|
||||
FALSE,
|
||||
&pAd->TxBufSpace[num].AllocVa,
|
||||
&pAd->TxBufSpace[num].AllocPa);
|
||||
|
||||
if (pAd->TxBufSpace[num].AllocVa == NULL)
|
||||
{
|
||||
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
|
||||
DBGPRINT_ERR(("Failed to allocate a big buffer\n"));
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
// Zero init this memory block
|
||||
NdisZeroMemory(pAd->TxBufSpace[num].AllocVa, pAd->TxBufSpace[num].AllocSize);
|
||||
|
||||
// Save PA & VA for further operation
|
||||
BufBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->TxBufSpace[num].AllocPa);
|
||||
BufBasePaLow = RTMP_GetPhysicalAddressLow (pAd->TxBufSpace[num].AllocPa);
|
||||
BufBaseVa = pAd->TxBufSpace[num].AllocVa;
|
||||
|
||||
//
|
||||
// Initialize Tx Ring Descriptor and associated buffer memory
|
||||
//
|
||||
pTxRing = &pAd->TxRing[num];
|
||||
for (index = 0; index < TX_RING_SIZE; index++)
|
||||
{
|
||||
pTxRing->Cell[index].pNdisPacket = NULL;
|
||||
pTxRing->Cell[index].pNextNdisPacket = NULL;
|
||||
// Init Tx Ring Size, Va, Pa variables
|
||||
pTxRing->Cell[index].AllocSize = TXD_SIZE;
|
||||
pTxRing->Cell[index].AllocVa = RingBaseVa;
|
||||
RTMP_SetPhysicalAddressHigh(pTxRing->Cell[index].AllocPa, RingBasePaHigh);
|
||||
RTMP_SetPhysicalAddressLow (pTxRing->Cell[index].AllocPa, RingBasePaLow);
|
||||
|
||||
// Setup Tx Buffer size & address. only 802.11 header will store in this space
|
||||
pDmaBuf = &pTxRing->Cell[index].DmaBuf;
|
||||
pDmaBuf->AllocSize = TX_DMA_1ST_BUFFER_SIZE;
|
||||
pDmaBuf->AllocVa = BufBaseVa;
|
||||
RTMP_SetPhysicalAddressHigh(pDmaBuf->AllocPa, BufBasePaHigh);
|
||||
RTMP_SetPhysicalAddressLow(pDmaBuf->AllocPa, BufBasePaLow);
|
||||
|
||||
// link the pre-allocated TxBuf to TXD
|
||||
pTxD = (PTXD_STRUC) pTxRing->Cell[index].AllocVa;
|
||||
pTxD->SDPtr0 = BufBasePaLow;
|
||||
// advance to next ring descriptor address
|
||||
pTxD->DMADONE = 1;
|
||||
RingBasePaLow += TXD_SIZE;
|
||||
RingBaseVa = (PUCHAR) RingBaseVa + TXD_SIZE;
|
||||
|
||||
// advance to next TxBuf address
|
||||
BufBasePaLow += TX_DMA_1ST_BUFFER_SIZE;
|
||||
BufBaseVa = (PUCHAR) BufBaseVa + TX_DMA_1ST_BUFFER_SIZE;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("TxRing[%d]: total %d entry allocated\n", num, index));
|
||||
}
|
||||
if (Status == NDIS_STATUS_RESOURCES)
|
||||
break;
|
||||
|
||||
//
|
||||
// Allocate MGMT ring descriptor's memory except Tx ring which allocated eariler
|
||||
//
|
||||
pAd->MgmtDescRing.AllocSize = MGMT_RING_SIZE * TXD_SIZE;
|
||||
RTMP_AllocateMgmtDescMemory(
|
||||
pAd,
|
||||
pAd->MgmtDescRing.AllocSize,
|
||||
FALSE,
|
||||
&pAd->MgmtDescRing.AllocVa,
|
||||
&pAd->MgmtDescRing.AllocPa);
|
||||
|
||||
if (pAd->MgmtDescRing.AllocVa == NULL)
|
||||
{
|
||||
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
|
||||
DBGPRINT_ERR(("Failed to allocate a big buffer\n"));
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
// Zero init this memory block
|
||||
NdisZeroMemory(pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocSize);
|
||||
|
||||
// Save PA & VA for further operation
|
||||
RingBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->MgmtDescRing.AllocPa);
|
||||
RingBasePaLow = RTMP_GetPhysicalAddressLow (pAd->MgmtDescRing.AllocPa);
|
||||
RingBaseVa = pAd->MgmtDescRing.AllocVa;
|
||||
|
||||
//
|
||||
// Initialize MGMT Ring and associated buffer memory
|
||||
//
|
||||
for (index = 0; index < MGMT_RING_SIZE; index++)
|
||||
{
|
||||
pAd->MgmtRing.Cell[index].pNdisPacket = NULL;
|
||||
pAd->MgmtRing.Cell[index].pNextNdisPacket = NULL;
|
||||
// Init MGMT Ring Size, Va, Pa variables
|
||||
pAd->MgmtRing.Cell[index].AllocSize = TXD_SIZE;
|
||||
pAd->MgmtRing.Cell[index].AllocVa = RingBaseVa;
|
||||
RTMP_SetPhysicalAddressHigh(pAd->MgmtRing.Cell[index].AllocPa, RingBasePaHigh);
|
||||
RTMP_SetPhysicalAddressLow (pAd->MgmtRing.Cell[index].AllocPa, RingBasePaLow);
|
||||
|
||||
// Offset to next ring descriptor address
|
||||
RingBasePaLow += TXD_SIZE;
|
||||
RingBaseVa = (PUCHAR) RingBaseVa + TXD_SIZE;
|
||||
|
||||
// link the pre-allocated TxBuf to TXD
|
||||
pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[index].AllocVa;
|
||||
pTxD->DMADONE = 1;
|
||||
|
||||
// no pre-allocated buffer required in MgmtRing for scatter-gather case
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("MGMT Ring: total %d entry allocated\n", index));
|
||||
|
||||
//
|
||||
// Allocate RX ring descriptor's memory except Tx ring which allocated eariler
|
||||
//
|
||||
pAd->RxDescRing.AllocSize = RX_RING_SIZE * RXD_SIZE;
|
||||
RTMP_AllocateRxDescMemory(
|
||||
pAd,
|
||||
pAd->RxDescRing.AllocSize,
|
||||
FALSE,
|
||||
&pAd->RxDescRing.AllocVa,
|
||||
&pAd->RxDescRing.AllocPa);
|
||||
|
||||
if (pAd->RxDescRing.AllocVa == NULL)
|
||||
{
|
||||
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
|
||||
DBGPRINT_ERR(("Failed to allocate a big buffer\n"));
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
// Zero init this memory block
|
||||
NdisZeroMemory(pAd->RxDescRing.AllocVa, pAd->RxDescRing.AllocSize);
|
||||
|
||||
|
||||
printk("RX DESC %p size = %ld\n", pAd->RxDescRing.AllocVa,
|
||||
pAd->RxDescRing.AllocSize);
|
||||
|
||||
// Save PA & VA for further operation
|
||||
RingBasePaHigh = RTMP_GetPhysicalAddressHigh(pAd->RxDescRing.AllocPa);
|
||||
RingBasePaLow = RTMP_GetPhysicalAddressLow (pAd->RxDescRing.AllocPa);
|
||||
RingBaseVa = pAd->RxDescRing.AllocVa;
|
||||
|
||||
//
|
||||
// Initialize Rx Ring and associated buffer memory
|
||||
//
|
||||
for (index = 0; index < RX_RING_SIZE; index++)
|
||||
{
|
||||
// Init RX Ring Size, Va, Pa variables
|
||||
pAd->RxRing.Cell[index].AllocSize = RXD_SIZE;
|
||||
pAd->RxRing.Cell[index].AllocVa = RingBaseVa;
|
||||
RTMP_SetPhysicalAddressHigh(pAd->RxRing.Cell[index].AllocPa, RingBasePaHigh);
|
||||
RTMP_SetPhysicalAddressLow (pAd->RxRing.Cell[index].AllocPa, RingBasePaLow);
|
||||
|
||||
// Offset to next ring descriptor address
|
||||
RingBasePaLow += RXD_SIZE;
|
||||
RingBaseVa = (PUCHAR) RingBaseVa + RXD_SIZE;
|
||||
|
||||
// Setup Rx associated Buffer size & allocate share memory
|
||||
pDmaBuf = &pAd->RxRing.Cell[index].DmaBuf;
|
||||
pDmaBuf->AllocSize = RX_BUFFER_AGGRESIZE;
|
||||
pPacket = RTMP_AllocateRxPacketBuffer(
|
||||
pAd,
|
||||
pDmaBuf->AllocSize,
|
||||
FALSE,
|
||||
&pDmaBuf->AllocVa,
|
||||
&pDmaBuf->AllocPa);
|
||||
|
||||
/* keep allocated rx packet */
|
||||
pAd->RxRing.Cell[index].pNdisPacket = pPacket;
|
||||
|
||||
// Error handling
|
||||
if (pDmaBuf->AllocVa == NULL)
|
||||
{
|
||||
ErrorValue = ERRLOG_OUT_OF_SHARED_MEMORY;
|
||||
DBGPRINT_ERR(("Failed to allocate RxRing's 1st buffer\n"));
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
break;
|
||||
}
|
||||
|
||||
// Zero init this memory block
|
||||
NdisZeroMemory(pDmaBuf->AllocVa, pDmaBuf->AllocSize);
|
||||
|
||||
// Write RxD buffer address & allocated buffer length
|
||||
pRxD = (PRXD_STRUC) pAd->RxRing.Cell[index].AllocVa;
|
||||
pRxD->SDP0 = RTMP_GetPhysicalAddressLow(pDmaBuf->AllocPa);
|
||||
pRxD->DDONE = 0;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Rx Ring: total %d entry allocated\n", index));
|
||||
|
||||
} while (FALSE);
|
||||
|
||||
|
||||
NdisZeroMemory(&pAd->FragFrame, sizeof(FRAGMENT_FRAME));
|
||||
pAd->FragFrame.pFragPacket = RTMP_AllocateFragPacketBuffer(pAd, RX_BUFFER_NORMSIZE);
|
||||
|
||||
if (pAd->FragFrame.pFragPacket == NULL)
|
||||
{
|
||||
Status = NDIS_STATUS_RESOURCES;
|
||||
}
|
||||
|
||||
if (Status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
// Log error inforamtion
|
||||
NdisWriteErrorLogEntry(
|
||||
pAd->AdapterHandle,
|
||||
NDIS_ERROR_CODE_OUT_OF_RESOURCES,
|
||||
1,
|
||||
ErrorValue);
|
||||
}
|
||||
|
||||
DBGPRINT_S(Status, ("<-- RTMPAllocTxRxRingMemory, Status=%x\n", Status));
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Initialize transmit data structures
|
||||
|
||||
Arguments:
|
||||
Adapter Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
Note:
|
||||
Initialize all transmit releated private buffer, include those define
|
||||
in RTMP_ADAPTER structure and all private data structures.
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID NICInitTxRxRingAndBacklogQueue(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
//WPDMA_GLO_CFG_STRUC GloCfg;
|
||||
int i;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<--> NICInitTxRxRingAndBacklogQueue\n"));
|
||||
|
||||
// Initialize all transmit related software queues
|
||||
InitializeQueueHeader(&pAd->TxSwQueue[QID_AC_BE]);
|
||||
InitializeQueueHeader(&pAd->TxSwQueue[QID_AC_BK]);
|
||||
InitializeQueueHeader(&pAd->TxSwQueue[QID_AC_VI]);
|
||||
InitializeQueueHeader(&pAd->TxSwQueue[QID_AC_VO]);
|
||||
InitializeQueueHeader(&pAd->TxSwQueue[QID_HCCA]);
|
||||
|
||||
// Init RX Ring index pointer
|
||||
pAd->RxRing.RxSwReadIdx = 0;
|
||||
pAd->RxRing.RxCpuIdx = RX_RING_SIZE - 1;
|
||||
|
||||
// Init TX rings index pointer
|
||||
for (i=0; i<NUM_OF_TX_RING; i++)
|
||||
{
|
||||
pAd->TxRing[i].TxSwFreeIdx = 0;
|
||||
pAd->TxRing[i].TxCpuIdx = 0;
|
||||
}
|
||||
|
||||
// init MGMT ring index pointer
|
||||
pAd->MgmtRing.TxSwFreeIdx = 0;
|
||||
pAd->MgmtRing.TxCpuIdx = 0;
|
||||
|
||||
pAd->PrivateInfo.TxRingFullCnt = 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Reset NIC Asics. Call after rest DMA. So reset TX_CTX_IDX to zero.
|
||||
|
||||
Arguments:
|
||||
Adapter Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
Reset NIC to initial state AS IS system boot up time.
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPRingCleanUp(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR RingType)
|
||||
{
|
||||
PTXD_STRUC pTxD;
|
||||
PRXD_STRUC pRxD;
|
||||
PQUEUE_ENTRY pEntry;
|
||||
PNDIS_PACKET pPacket;
|
||||
int i;
|
||||
PRTMP_TX_RING pTxRing;
|
||||
unsigned long IrqFlags;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("RTMPRingCleanUp(RingIdx=%d, Pending-NDIS=%ld)\n", RingType, pAd->RalinkCounters.PendingNdisPacketCount));
|
||||
switch (RingType)
|
||||
{
|
||||
case QID_AC_BK:
|
||||
case QID_AC_BE:
|
||||
case QID_AC_VI:
|
||||
case QID_AC_VO:
|
||||
case QID_HCCA:
|
||||
RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
|
||||
pTxRing = &pAd->TxRing[RingType];
|
||||
|
||||
// We have to clean all descriptors in case some error happened with reset
|
||||
for (i=0; i<TX_RING_SIZE; i++) // We have to scan all TX ring
|
||||
{
|
||||
pTxD = (PTXD_STRUC) pTxRing->Cell[i].AllocVa;
|
||||
|
||||
pPacket = (PNDIS_PACKET) pTxRing->Cell[i].pNdisPacket;
|
||||
// release scatter-and-gather NDIS_PACKET
|
||||
if (pPacket)
|
||||
{
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
pTxRing->Cell[i].pNdisPacket = NULL;
|
||||
}
|
||||
|
||||
pPacket = (PNDIS_PACKET) pTxRing->Cell[i].pNextNdisPacket;
|
||||
// release scatter-and-gather NDIS_PACKET
|
||||
if (pPacket)
|
||||
{
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
pTxRing->Cell[i].pNextNdisPacket = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
RTMP_IO_READ32(pAd, TX_DTX_IDX0 + RingType * 0x10, &pTxRing->TxDmaIdx);
|
||||
pTxRing->TxSwFreeIdx = pTxRing->TxDmaIdx;
|
||||
pTxRing->TxCpuIdx = pTxRing->TxDmaIdx;
|
||||
RTMP_IO_WRITE32(pAd, TX_CTX_IDX0 + RingType * 0x10, pTxRing->TxCpuIdx);
|
||||
|
||||
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
|
||||
RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
|
||||
while (pAd->TxSwQueue[RingType].Head != NULL)
|
||||
{
|
||||
pEntry = RemoveHeadQueue(&pAd->TxSwQueue[RingType]);
|
||||
pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
DBGPRINT(RT_DEBUG_TRACE,("Release 1 NDIS packet from s/w backlog queue\n"));
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
|
||||
break;
|
||||
|
||||
case QID_MGMT:
|
||||
// We have to clean all descriptors in case some error happened with reset
|
||||
NdisAcquireSpinLock(&pAd->MgmtRingLock);
|
||||
|
||||
for (i=0; i<MGMT_RING_SIZE; i++)
|
||||
{
|
||||
pTxD = (PTXD_STRUC) pAd->MgmtRing.Cell[i].AllocVa;
|
||||
|
||||
pPacket = (PNDIS_PACKET) pAd->MgmtRing.Cell[i].pNdisPacket;
|
||||
// rlease scatter-and-gather NDIS_PACKET
|
||||
if (pPacket)
|
||||
{
|
||||
PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
}
|
||||
pAd->MgmtRing.Cell[i].pNdisPacket = NULL;
|
||||
|
||||
pPacket = (PNDIS_PACKET) pAd->MgmtRing.Cell[i].pNextNdisPacket;
|
||||
// release scatter-and-gather NDIS_PACKET
|
||||
if (pPacket)
|
||||
{
|
||||
PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
}
|
||||
pAd->MgmtRing.Cell[i].pNextNdisPacket = NULL;
|
||||
|
||||
}
|
||||
|
||||
RTMP_IO_READ32(pAd, TX_MGMTDTX_IDX, &pAd->MgmtRing.TxDmaIdx);
|
||||
pAd->MgmtRing.TxSwFreeIdx = pAd->MgmtRing.TxDmaIdx;
|
||||
pAd->MgmtRing.TxCpuIdx = pAd->MgmtRing.TxDmaIdx;
|
||||
RTMP_IO_WRITE32(pAd, TX_MGMTCTX_IDX, pAd->MgmtRing.TxCpuIdx);
|
||||
|
||||
NdisReleaseSpinLock(&pAd->MgmtRingLock);
|
||||
pAd->RalinkCounters.MgmtRingFullCount = 0;
|
||||
break;
|
||||
|
||||
case QID_RX:
|
||||
// We have to clean all descriptors in case some error happened with reset
|
||||
NdisAcquireSpinLock(&pAd->RxRingLock);
|
||||
|
||||
for (i=0; i<RX_RING_SIZE; i++)
|
||||
{
|
||||
pRxD = (PRXD_STRUC) pAd->RxRing.Cell[i].AllocVa;
|
||||
pRxD->DDONE = 0 ;
|
||||
}
|
||||
|
||||
RTMP_IO_READ32(pAd, RX_DRX_IDX, &pAd->RxRing.RxDmaIdx);
|
||||
pAd->RxRing.RxSwReadIdx = pAd->RxRing.RxDmaIdx;
|
||||
pAd->RxRing.RxCpuIdx = ((pAd->RxRing.RxDmaIdx == 0) ? (RX_RING_SIZE-1) : (pAd->RxRing.RxDmaIdx-1));
|
||||
RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
|
||||
|
||||
NdisReleaseSpinLock(&pAd->RxRingLock);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS AdapterBlockAllocateMemory(
|
||||
IN PVOID handle,
|
||||
OUT PVOID *ppAd)
|
||||
{
|
||||
PPCI_DEV pci_dev;
|
||||
dma_addr_t *phy_addr;
|
||||
POS_COOKIE pObj = (POS_COOKIE) handle;
|
||||
|
||||
pci_dev = pObj->pci_dev;
|
||||
phy_addr = &pObj->pAd_pa;
|
||||
|
||||
*ppAd = (PVOID)vmalloc(sizeof(RTMP_ADAPTER)); //pci_alloc_consistent(pci_dev, sizeof(RTMP_ADAPTER), phy_addr);
|
||||
|
||||
if (*ppAd)
|
||||
{
|
||||
NdisZeroMemory(*ppAd, sizeof(RTMP_ADAPTER));
|
||||
((PRTMP_ADAPTER)*ppAd)->OS_Cookie = handle;
|
||||
return (NDIS_STATUS_SUCCESS);
|
||||
} else {
|
||||
return (NDIS_STATUS_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void RTMP_AllocateTxDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT Index,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)PCI_ALLOC_CONSISTENT(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
|
||||
}
|
||||
|
||||
void RTMP_AllocateMgmtDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)PCI_ALLOC_CONSISTENT(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
|
||||
}
|
||||
|
||||
void RTMP_AllocateRxDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)PCI_ALLOC_CONSISTENT(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
|
||||
}
|
||||
|
||||
void RTMP_FreeRxDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN PVOID VirtualAddress,
|
||||
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
PCI_FREE_CONSISTENT(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress);
|
||||
}
|
||||
|
||||
|
||||
void RTMP_AllocateFirstTxBuffer(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT Index,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)PCI_ALLOC_CONSISTENT(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
}
|
||||
|
||||
/*
|
||||
* FUNCTION: Allocate a common buffer for DMA
|
||||
* ARGUMENTS:
|
||||
* AdapterHandle: AdapterHandle
|
||||
* Length: Number of bytes to allocate
|
||||
* Cached: Whether or not the memory can be cached
|
||||
* VirtualAddress: Pointer to memory is returned here
|
||||
* PhysicalAddress: Physical address corresponding to virtual address
|
||||
*/
|
||||
|
||||
void RTMP_AllocateSharedMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)PCI_ALLOC_CONSISTENT(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
}
|
||||
|
||||
VOID RTMPFreeTxRxRingMemory(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
int index, num , j;
|
||||
PRTMP_TX_RING pTxRing;
|
||||
PTXD_STRUC pTxD;
|
||||
PNDIS_PACKET pPacket;
|
||||
unsigned int IrqFlags;
|
||||
|
||||
POS_COOKIE pObj =(POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("--> RTMPFreeTxRxRingMemory\n"));
|
||||
|
||||
// Free TxSwQueue Packet
|
||||
for (index=0; index <NUM_OF_TX_RING; index++)
|
||||
{
|
||||
PQUEUE_ENTRY pEntry;
|
||||
PNDIS_PACKET pPacket;
|
||||
PQUEUE_HEADER pQueue;
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags);
|
||||
pQueue = &pAd->TxSwQueue[index];
|
||||
while (pQueue->Head)
|
||||
{
|
||||
pEntry = RemoveHeadQueue(pQueue);
|
||||
pPacket = QUEUE_ENTRY_TO_PACKET(pEntry);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE);
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
|
||||
}
|
||||
|
||||
// Free Tx Ring Packet
|
||||
for (index=0;index< NUM_OF_TX_RING;index++)
|
||||
{
|
||||
pTxRing = &pAd->TxRing[index];
|
||||
|
||||
for (j=0; j< TX_RING_SIZE; j++)
|
||||
{
|
||||
pTxD = (PTXD_STRUC) (pTxRing->Cell[j].AllocVa);
|
||||
pPacket = pTxRing->Cell[j].pNdisPacket;
|
||||
|
||||
if (pPacket)
|
||||
{
|
||||
PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr0, pTxD->SDLen0, PCI_DMA_TODEVICE);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
//Always assign pNdisPacket as NULL after clear
|
||||
pTxRing->Cell[j].pNdisPacket = NULL;
|
||||
|
||||
pPacket = pTxRing->Cell[j].pNextNdisPacket;
|
||||
|
||||
if (pPacket)
|
||||
{
|
||||
PCI_UNMAP_SINGLE(pAd, pTxD->SDPtr1, pTxD->SDLen1, PCI_DMA_TODEVICE);
|
||||
RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
//Always assign pNextNdisPacket as NULL after clear
|
||||
pTxRing->Cell[pTxRing->TxSwFreeIdx].pNextNdisPacket = NULL;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
for (index = RX_RING_SIZE - 1 ; index >= 0; index--)
|
||||
{
|
||||
if ((pAd->RxRing.Cell[index].DmaBuf.AllocVa) && (pAd->RxRing.Cell[index].pNdisPacket))
|
||||
{
|
||||
PCI_UNMAP_SINGLE(pObj->pci_dev, pAd->RxRing.Cell[index].DmaBuf.AllocPa, pAd->RxRing.Cell[index].DmaBuf.AllocSize, PCI_DMA_FROMDEVICE);
|
||||
RELEASE_NDIS_PACKET(pAd, pAd->RxRing.Cell[index].pNdisPacket, NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
}
|
||||
NdisZeroMemory(pAd->RxRing.Cell, RX_RING_SIZE * sizeof(RTMP_DMACB));
|
||||
|
||||
if (pAd->RxDescRing.AllocVa)
|
||||
{
|
||||
PCI_FREE_CONSISTENT(pObj->pci_dev, pAd->RxDescRing.AllocSize, pAd->RxDescRing.AllocVa, pAd->RxDescRing.AllocPa);
|
||||
}
|
||||
NdisZeroMemory(&pAd->RxDescRing, sizeof(RTMP_DMABUF));
|
||||
|
||||
if (pAd->MgmtDescRing.AllocVa)
|
||||
{
|
||||
PCI_FREE_CONSISTENT(pObj->pci_dev, pAd->MgmtDescRing.AllocSize, pAd->MgmtDescRing.AllocVa, pAd->MgmtDescRing.AllocPa);
|
||||
}
|
||||
NdisZeroMemory(&pAd->MgmtDescRing, sizeof(RTMP_DMABUF));
|
||||
|
||||
for (num = 0; num < NUM_OF_TX_RING; num++)
|
||||
{
|
||||
if (pAd->TxBufSpace[num].AllocVa)
|
||||
{
|
||||
PCI_FREE_CONSISTENT(pObj->pci_dev, pAd->TxBufSpace[num].AllocSize, pAd->TxBufSpace[num].AllocVa, pAd->TxBufSpace[num].AllocPa);
|
||||
}
|
||||
NdisZeroMemory(&pAd->TxBufSpace[num], sizeof(RTMP_DMABUF));
|
||||
|
||||
if (pAd->TxDescRing[num].AllocVa)
|
||||
{
|
||||
PCI_FREE_CONSISTENT(pObj->pci_dev, pAd->TxDescRing[num].AllocSize, pAd->TxDescRing[num].AllocVa, pAd->TxDescRing[num].AllocPa);
|
||||
}
|
||||
NdisZeroMemory(&pAd->TxDescRing[num], sizeof(RTMP_DMABUF));
|
||||
}
|
||||
|
||||
if (pAd->FragFrame.pFragPacket)
|
||||
RELEASE_NDIS_PACKET(pAd, pAd->FragFrame.pFragPacket, NDIS_STATUS_SUCCESS);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<-- RTMPFreeTxRxRingMemory\n"));
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Allocate a packet buffer for DMA
|
||||
* ARGUMENTS:
|
||||
* AdapterHandle: AdapterHandle
|
||||
* Length: Number of bytes to allocate
|
||||
* Cached: Whether or not the memory can be cached
|
||||
* VirtualAddress: Pointer to memory is returned here
|
||||
* PhysicalAddress: Physical address corresponding to virtual address
|
||||
* Notes:
|
||||
* Cached is ignored: always cached memory
|
||||
*/
|
||||
PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
PNDIS_PACKET pkt;
|
||||
|
||||
pkt = RTPKT_TO_OSPKT(DEV_ALLOC_SKB(Length));
|
||||
|
||||
if (pkt == NULL) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("can't allocate rx %ld size packet\n",Length));
|
||||
}
|
||||
|
||||
if (pkt) {
|
||||
RTMP_SET_PACKET_SOURCE(pkt, PKTSRC_NDIS);
|
||||
*VirtualAddress = (PVOID) RTPKT_TO_OSPKT(pkt)->data;
|
||||
*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE);
|
||||
} else {
|
||||
*VirtualAddress = (PVOID) NULL;
|
||||
*PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL;
|
||||
}
|
||||
|
||||
return (PNDIS_PACKET) pkt;
|
||||
}
|
||||
|
||||
|
||||
VOID Invalid_Remaining_Packet(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG VirtualAddress)
|
||||
{
|
||||
NDIS_PHYSICAL_ADDRESS PhysicalAddress;
|
||||
|
||||
PhysicalAddress = PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress+1600), RX_BUFFER_NORMSIZE-1600, -1, PCI_DMA_FROMDEVICE);
|
||||
}
|
||||
|
||||
PNDIS_PACKET GetPacketFromRxRing(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PRT28XX_RXD_STRUC pSaveRxD,
|
||||
OUT BOOLEAN *pbReschedule,
|
||||
IN OUT UINT32 *pRxPending)
|
||||
{
|
||||
PRXD_STRUC pRxD;
|
||||
PNDIS_PACKET pRxPacket = NULL;
|
||||
PNDIS_PACKET pNewPacket;
|
||||
PVOID AllocVa;
|
||||
NDIS_PHYSICAL_ADDRESS AllocPa;
|
||||
BOOLEAN bReschedule = FALSE;
|
||||
|
||||
RTMP_SEM_LOCK(&pAd->RxRingLock);
|
||||
|
||||
if (*pRxPending == 0)
|
||||
{
|
||||
// Get how may packets had been received
|
||||
RTMP_IO_READ32(pAd, RX_DRX_IDX , &pAd->RxRing.RxDmaIdx);
|
||||
|
||||
if (pAd->RxRing.RxSwReadIdx == pAd->RxRing.RxDmaIdx)
|
||||
{
|
||||
// no more rx packets
|
||||
bReschedule = FALSE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
// get rx pending count
|
||||
if (pAd->RxRing.RxDmaIdx > pAd->RxRing.RxSwReadIdx)
|
||||
*pRxPending = pAd->RxRing.RxDmaIdx - pAd->RxRing.RxSwReadIdx;
|
||||
else
|
||||
*pRxPending = pAd->RxRing.RxDmaIdx + RX_RING_SIZE - pAd->RxRing.RxSwReadIdx;
|
||||
|
||||
}
|
||||
|
||||
// Point to Rx indexed rx ring descriptor
|
||||
pRxD = (PRXD_STRUC) pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].AllocVa;
|
||||
|
||||
if (pRxD->DDONE == 0)
|
||||
{
|
||||
*pRxPending = 0;
|
||||
// DMAIndx had done but DDONE bit not ready
|
||||
bReschedule = TRUE;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
// return rx descriptor
|
||||
NdisMoveMemory(pSaveRxD, pRxD, RXD_SIZE);
|
||||
|
||||
pNewPacket = RTMP_AllocateRxPacketBuffer(pAd, RX_BUFFER_AGGRESIZE, FALSE, &AllocVa, &AllocPa);
|
||||
|
||||
if (pNewPacket)
|
||||
{
|
||||
// unmap the rx buffer
|
||||
PCI_UNMAP_SINGLE(pAd, pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].DmaBuf.AllocPa,
|
||||
pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].DmaBuf.AllocSize, PCI_DMA_FROMDEVICE);
|
||||
pRxPacket = pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].pNdisPacket;
|
||||
|
||||
pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].DmaBuf.AllocSize = RX_BUFFER_AGGRESIZE;
|
||||
pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].pNdisPacket = (PNDIS_PACKET) pNewPacket;
|
||||
pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].DmaBuf.AllocVa = AllocVa;
|
||||
pAd->RxRing.Cell[pAd->RxRing.RxSwReadIdx].DmaBuf.AllocPa = AllocPa;
|
||||
/* update SDP0 to new buffer of rx packet */
|
||||
pRxD->SDP0 = AllocPa;
|
||||
}
|
||||
else
|
||||
{
|
||||
//printk("No Rx Buffer\n");
|
||||
pRxPacket = NULL;
|
||||
bReschedule = TRUE;
|
||||
}
|
||||
|
||||
pRxD->DDONE = 0;
|
||||
|
||||
// had handled one rx packet
|
||||
*pRxPending = *pRxPending - 1;
|
||||
|
||||
// update rx descriptor and kick rx
|
||||
INC_RING_INDEX(pAd->RxRing.RxSwReadIdx, RX_RING_SIZE);
|
||||
|
||||
pAd->RxRing.RxCpuIdx = (pAd->RxRing.RxSwReadIdx == 0) ? (RX_RING_SIZE-1) : (pAd->RxRing.RxSwReadIdx-1);
|
||||
RTMP_IO_WRITE32(pAd, RX_CRX_IDX, pAd->RxRing.RxCpuIdx);
|
||||
|
||||
done:
|
||||
RTMP_SEM_UNLOCK(&pAd->RxRingLock);
|
||||
*pbReschedule = bReschedule;
|
||||
return pRxPacket;
|
||||
}
|
||||
/* End of 2860_rtmp_init.c */
|
||||
|
@ -150,7 +150,9 @@ VOID MlmeADDBAAction(
|
||||
MakeOutgoingFrame(pOutBuffer, &FrameLen,
|
||||
sizeof(FRAME_ADDBA_REQ), &Frame,
|
||||
END_OF_ARGS);
|
||||
MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
|
||||
|
||||
MiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[pInfo->TID]), pOutBuffer, FrameLen);
|
||||
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("BA - Send ADDBA request. StartSeq = %x, FrameLen = %ld. BufSize = %d\n", Frame.BaStartSeq.field.StartSeq, FrameLen, Frame.BaParm.BufSize));
|
||||
@ -527,9 +529,13 @@ VOID SendRefreshBAR(
|
||||
MakeOutgoingFrame(pOutBuffer, &FrameLen,
|
||||
sizeof(FRAME_BAR), &FrameBar,
|
||||
END_OF_ARGS);
|
||||
//if (!(CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_RALINK_CHIPSET)))
|
||||
if (1) // Now we always send BAR.
|
||||
{
|
||||
//MiniportMMRequestUnlock(pAd, 0, pOutBuffer, FrameLen);
|
||||
MiniportMMRequest(pAd, (MGMT_USE_QUEUE_FLAG | MapUserPriorityToAccessCategory[TID]), pOutBuffer, FrameLen);
|
||||
|
||||
MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
|
||||
|
||||
}
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
}
|
||||
}
|
||||
|
@ -35,8 +35,8 @@
|
||||
#define ORI_BA_SESSION_TIMEOUT (2000) // ms
|
||||
#define REC_BA_SESSION_IDLE_TIMEOUT (1000) // ms
|
||||
|
||||
#define REORDERING_PACKET_TIMEOUT ((100 * HZ)/1000) // system ticks -- 100 ms
|
||||
#define MAX_REORDERING_PACKET_TIMEOUT ((3000 * HZ)/1000) // system ticks -- 100 ms
|
||||
#define REORDERING_PACKET_TIMEOUT ((100 * OS_HZ)/1000) // system ticks -- 100 ms
|
||||
#define MAX_REORDERING_PACKET_TIMEOUT ((3000 * OS_HZ)/1000) // system ticks -- 100 ms
|
||||
|
||||
#define RESET_RCV_SEQ (0xFFFF)
|
||||
|
||||
@ -460,6 +460,8 @@ void ba_flush_reordering_timeout_mpdus(
|
||||
pBAEntry->LastIndSeq = Sequence;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%x, flush one!\n", pBAEntry->LastIndSeq));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -493,7 +495,7 @@ VOID BAOriSessionSetUp(
|
||||
{
|
||||
// try again after 3 secs
|
||||
DelayTime = 3000;
|
||||
// printk("DeCline BA from Peer\n");
|
||||
// DBGPRINT(RT_DEBUG_TRACE, ("DeCline BA from Peer\n"));
|
||||
// return;
|
||||
}
|
||||
|
||||
@ -531,11 +533,6 @@ VOID BAOriSessionSetUp(
|
||||
pBAEntry->TimeOutValue = TimeOut;
|
||||
pBAEntry->pAdapter = pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("Send AddBA to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d isForced:%d Wcid:%d\n"
|
||||
,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]
|
||||
,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]
|
||||
,TID,isForced,pEntry->Aid));
|
||||
|
||||
if (!(pEntry->TXBAbitmap & (1<<TID)))
|
||||
{
|
||||
RTMPInitTimer(pAd, &pBAEntry->ORIBATimer, GET_TIMER_FUNCTION(BAOriSessionSetupTimeout), pBAEntry, FALSE);
|
||||
@ -573,6 +570,8 @@ VOID BAOriSessionAdd(
|
||||
|
||||
pBAEntry->TimeOutValue = pFrame->TimeOutValue;
|
||||
pBAEntry->ORI_BA_Status = Originator_Done;
|
||||
pAd->BATable.numDoneOriginator ++;
|
||||
|
||||
// reset sequence number
|
||||
pBAEntry->Sequence = BA_ORI_INIT_SEQ;
|
||||
// Set Bitmap flag.
|
||||
@ -668,7 +667,7 @@ BOOLEAN BARecSessionAdd(
|
||||
// initial sequence number
|
||||
pBAEntry->LastIndSeq = RESET_RCV_SEQ; //pFrame->BaStartSeq.field.StartSeq;
|
||||
|
||||
printk("Start Seq = %08x\n", pFrame->BaStartSeq.field.StartSeq);
|
||||
DBGPRINT(RT_DEBUG_OFF, ("Start Seq = %08x\n", pFrame->BaStartSeq.field.StartSeq));
|
||||
|
||||
if (pEntry->RXBAbitmap & (1<<TID))
|
||||
{
|
||||
@ -686,7 +685,7 @@ BOOLEAN BARecSessionAdd(
|
||||
pEntry->BADeclineBitmap &= ~(1<<TID);
|
||||
|
||||
// Set BA session mask in WCID table.
|
||||
RT28XX_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);
|
||||
RTMP_ADD_BA_SESSION_TO_ASIC(pAd, pEntry->Aid, TID);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("MACEntry[%d]RXBAbitmap = 0x%x. BARecWcidArray=%d\n",
|
||||
pEntry->Aid, pEntry->RXBAbitmap, pEntry->BARecWcidArray[TID]));
|
||||
@ -713,8 +712,8 @@ BA_REC_ENTRY *BATableAllocRecEntry(
|
||||
|
||||
if (pAd->BATable.numAsRecipient >= MAX_BARECI_SESSION)
|
||||
{
|
||||
printk("BA Recipeint Session (%ld) > %d\n", pAd->BATable.numAsRecipient,
|
||||
MAX_BARECI_SESSION);
|
||||
DBGPRINT(RT_DEBUG_OFF, ("BA Recipeint Session (%ld) > %d\n",
|
||||
pAd->BATable.numAsRecipient, MAX_BARECI_SESSION));
|
||||
goto done;
|
||||
}
|
||||
|
||||
@ -794,6 +793,7 @@ VOID BATableFreeOriEntry(
|
||||
NdisAcquireSpinLock(&pAd->BATabLock);
|
||||
if (pBAEntry->ORI_BA_Status == Originator_Done)
|
||||
{
|
||||
pAd->BATable.numDoneOriginator -= 1;
|
||||
pEntry->TXBAbitmap &= (~(1<<(pBAEntry->TID) ));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("BATableFreeOriEntry numAsOriginator= %ld\n", pAd->BATable.numAsRecipient));
|
||||
// Erase Bitmap flag.
|
||||
@ -867,9 +867,8 @@ VOID BAOriSessionTearDown(
|
||||
// force send specified TID DelBA
|
||||
MLME_DELBA_REQ_STRUCT DelbaReq;
|
||||
MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
|
||||
if (Elem == NULL)
|
||||
return;
|
||||
|
||||
if (Elem != NULL)
|
||||
{
|
||||
NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
|
||||
NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
|
||||
|
||||
@ -877,15 +876,15 @@ VOID BAOriSessionTearDown(
|
||||
DelbaReq.Wcid = Wcid;
|
||||
DelbaReq.TID = TID;
|
||||
DelbaReq.Initiator = ORIGINATOR;
|
||||
#if 1
|
||||
Elem->MsgLen = sizeof(DelbaReq);
|
||||
NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));
|
||||
MlmeDELBAAction(pAd, Elem);
|
||||
kfree(Elem);
|
||||
#else
|
||||
MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ORI_DELBA_CATE, sizeof(MLME_DELBA_REQ_STRUCT), (PVOID)&DelbaReq);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(bForceSend):alloc memory failed!\n", __func__));
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
@ -902,9 +901,8 @@ VOID BAOriSessionTearDown(
|
||||
{
|
||||
MLME_DELBA_REQ_STRUCT DelbaReq;
|
||||
MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
|
||||
if (Elem == NULL)
|
||||
return;
|
||||
|
||||
if (Elem != NULL)
|
||||
{
|
||||
NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
|
||||
NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
|
||||
|
||||
@ -912,15 +910,16 @@ VOID BAOriSessionTearDown(
|
||||
DelbaReq.Wcid = Wcid;
|
||||
DelbaReq.TID = pBAEntry->TID;
|
||||
DelbaReq.Initiator = ORIGINATOR;
|
||||
#if 1
|
||||
Elem->MsgLen = sizeof(DelbaReq);
|
||||
NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));
|
||||
MlmeDELBAAction(pAd, Elem);
|
||||
kfree(Elem);
|
||||
#else
|
||||
MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ORI_DELBA_CATE, sizeof(MLME_DELBA_REQ_STRUCT), (PVOID)&DelbaReq);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __func__));
|
||||
return;
|
||||
}
|
||||
}
|
||||
RTMPCancelTimer(&pBAEntry->ORIBATimer, &Cancelled);
|
||||
BATableFreeOriEntry(pAd, Idx);
|
||||
@ -964,7 +963,6 @@ VOID BARecSessionTearDown(
|
||||
{
|
||||
MLME_DELBA_REQ_STRUCT DelbaReq;
|
||||
BOOLEAN Cancelled;
|
||||
MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
|
||||
//ULONG offset;
|
||||
//UINT32 VALUE;
|
||||
|
||||
@ -975,6 +973,9 @@ VOID BARecSessionTearDown(
|
||||
//
|
||||
if (bPassive == FALSE)
|
||||
{
|
||||
MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG);
|
||||
if (Elem != NULL)
|
||||
{
|
||||
NdisZeroMemory(&DelbaReq, sizeof(DelbaReq));
|
||||
NdisZeroMemory(Elem, sizeof(MLME_QUEUE_ELEM));
|
||||
|
||||
@ -982,15 +983,16 @@ VOID BARecSessionTearDown(
|
||||
DelbaReq.Wcid = Wcid;
|
||||
DelbaReq.TID = TID;
|
||||
DelbaReq.Initiator = RECIPIENT;
|
||||
#if 1
|
||||
Elem->MsgLen = sizeof(DelbaReq);
|
||||
NdisMoveMemory(Elem->Msg, &DelbaReq, sizeof(DelbaReq));
|
||||
MlmeDELBAAction(pAd, Elem);
|
||||
kfree(Elem);
|
||||
#else
|
||||
MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ORI_DELBA_CATE, sizeof(MLME_DELBA_REQ_STRUCT), (PVOID)&DelbaReq);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():alloc memory failed!\n", __func__));
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1009,7 +1011,7 @@ VOID BARecSessionTearDown(
|
||||
pAd->MacTab.Content[Wcid].RXBAbitmap &= (~(1<<(pBAEntry->TID)));
|
||||
pAd->MacTab.Content[Wcid].BARecWcidArray[TID] = 0;
|
||||
|
||||
RT28XX_DEL_BA_SESSION_FROM_ASIC(pAd, Wcid, TID);
|
||||
RTMP_DEL_BA_SESSION_FROM_ASIC(pAd, Wcid, TID);
|
||||
|
||||
NdisReleaseSpinLock(&pAd->BATabLock);
|
||||
|
||||
@ -1061,9 +1063,12 @@ VOID BAOriSessionSetupTimeout(
|
||||
|
||||
pAd = pBAEntry->pAdapter;
|
||||
|
||||
{
|
||||
// Do nothing if monitor mode is on
|
||||
if (MONITOR_ON(pAd))
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
pEntry = &pAd->MacTab.Content[pBAEntry->Wcid];
|
||||
|
||||
@ -1079,12 +1084,9 @@ VOID BAOriSessionSetupTimeout(
|
||||
AddbaReq.TimeOutValue = 0;
|
||||
AddbaReq.Token = pBAEntry->Token;
|
||||
MlmeEnqueue(pAd, ACTION_STATE_MACHINE, MT2_MLME_ADD_BA_CATE, sizeof(MLME_ADDBA_REQ_STRUCT), (PVOID)&AddbaReq);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) to %02x:%02x:%02x:%02x:%02x:%02x Tid:%d Wcid:%d\n"
|
||||
,pBAEntry->Token
|
||||
,pEntry->Addr[0],pEntry->Addr[1],pEntry->Addr[2]
|
||||
,pEntry->Addr[3],pEntry->Addr[4],pEntry->Addr[5]
|
||||
,pBAEntry->TID,pEntry->Aid));
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
DBGPRINT(RT_DEBUG_TRACE,("BA Ori Session Timeout(%d) : Send ADD BA again\n", pBAEntry->Token));
|
||||
|
||||
pBAEntry->Token++;
|
||||
RTMPSetTimer(&pBAEntry->ORIBATimer, ORI_BA_SESSION_TIMEOUT);
|
||||
}
|
||||
@ -1131,7 +1133,7 @@ VOID BARecSessionIdleTimeout(
|
||||
pAd = pBAEntry->pAdapter;
|
||||
// flush all pending reordering mpdus
|
||||
ba_refresh_reordering_mpdus(pAd, pBAEntry);
|
||||
printk("%ld: REC BA session Timeout\n", Now32);
|
||||
DBGPRINT(RT_DEBUG_OFF, ("%ld: REC BA session Timeout\n", Now32));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1174,7 +1176,7 @@ VOID PeerAddBAReqAction(
|
||||
if ((pAd->CommonCfg.bBADecline == FALSE) && IS_HT_STA(pMacEntry))
|
||||
{
|
||||
pAddreqFrame = (PFRAME_ADDBA_REQ)(&Elem->Msg[0]);
|
||||
printk("Rcv Wcid(%d) AddBAReq\n", Elem->Wcid);
|
||||
DBGPRINT(RT_DEBUG_OFF, ("Rcv Wcid(%d) AddBAReq\n", Elem->Wcid));
|
||||
if (BARecSessionAdd(pAd, &pAd->MacTab.Content[Elem->Wcid], pAddreqFrame))
|
||||
Status = 0;
|
||||
else
|
||||
@ -1367,7 +1369,7 @@ BOOLEAN CntlEnqueueForRecv(
|
||||
|
||||
if (SEQ_SMALLER(pBAEntry->LastIndSeq, pFrame->BAStartingSeq.field.StartSeq, MAXSEQ))
|
||||
{
|
||||
//printk("BAR Seq = %x, LastIndSeq = %x\n", pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq);
|
||||
//DBGPRINT(RT_DEBUG_TRACE, ("BAR Seq = %x, LastIndSeq = %x\n", pFrame->BAStartingSeq.field.StartSeq, pBAEntry->LastIndSeq));
|
||||
ba_indicate_reordering_mpdus_le_seq(pAd, pBAEntry, pFrame->BAStartingSeq.field.StartSeq);
|
||||
pBAEntry->LastIndSeq = (pFrame->BAStartingSeq.field.StartSeq == 0) ? MAXSEQ :(pFrame->BAStartingSeq.field.StartSeq -1);
|
||||
}
|
||||
@ -1388,8 +1390,6 @@ VOID SendPSMPAction(
|
||||
//ULONG Idx;
|
||||
FRAME_PSMP_ACTION Frame;
|
||||
ULONG FrameLen;
|
||||
UCHAR bbpdata=0;
|
||||
UINT32 macdata;
|
||||
|
||||
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
|
||||
if (NStatus != NDIS_STATUS_SUCCESS)
|
||||
@ -1405,48 +1405,26 @@ VOID SendPSMPAction(
|
||||
switch (Psmp)
|
||||
{
|
||||
case MMPS_ENABLE:
|
||||
if (IS_RT3090(pAd))
|
||||
#ifdef RT30xx
|
||||
if (IS_RT30xx(pAd)
|
||||
&&(pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1))
|
||||
{
|
||||
// disable MMPS BBP control register
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpdata);
|
||||
bbpdata &= ~(0x04); //bit 2
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpdata);
|
||||
|
||||
// disable MMPS MAC control register
|
||||
RTMP_IO_READ32(pAd, 0x1210, &macdata);
|
||||
macdata &= ~(0x09); //bit 0, 3
|
||||
RTMP_IO_WRITE32(pAd, 0x1210, macdata);
|
||||
RTMP_ASIC_MMPS_DISABLE(pAd);
|
||||
}
|
||||
#endif // RT30xx //
|
||||
Frame.Psmp = 0;
|
||||
break;
|
||||
case MMPS_DYNAMIC:
|
||||
if (IS_RT3090(pAd))
|
||||
{
|
||||
// enable MMPS BBP control register
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpdata);
|
||||
bbpdata |= 0x04; //bit 2
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpdata);
|
||||
|
||||
// enable MMPS MAC control register
|
||||
RTMP_IO_READ32(pAd, 0x1210, &macdata);
|
||||
macdata |= 0x09; //bit 0, 3
|
||||
RTMP_IO_WRITE32(pAd, 0x1210, macdata);
|
||||
}
|
||||
Frame.Psmp = 3;
|
||||
break;
|
||||
case MMPS_STATIC:
|
||||
if (IS_RT3090(pAd))
|
||||
#ifdef RT30xx
|
||||
if (IS_RT30xx(pAd)
|
||||
&&(pAd->Antenna.field.RxPath>1||pAd->Antenna.field.TxPath>1))
|
||||
{
|
||||
// enable MMPS BBP control register
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &bbpdata);
|
||||
bbpdata |= 0x04; //bit 2
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, bbpdata);
|
||||
|
||||
// enable MMPS MAC control register
|
||||
RTMP_IO_READ32(pAd, 0x1210, &macdata);
|
||||
macdata |= 0x09; //bit 0, 3
|
||||
RTMP_IO_WRITE32(pAd, 0x1210, macdata);
|
||||
RTMP_ASIC_MMPS_ENABLE(pAd);
|
||||
}
|
||||
#endif // RT30xx //
|
||||
Frame.Psmp = 1;
|
||||
break;
|
||||
}
|
||||
@ -1504,20 +1482,22 @@ void convert_reordering_packet_to_preAMSDU_or_802_3_packet(
|
||||
ASSERT(pRxBlk->pRxPacket);
|
||||
pRxPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
|
||||
|
||||
RTPKT_TO_OSPKT(pRxPkt)->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
|
||||
RTPKT_TO_OSPKT(pRxPkt)->data = pRxBlk->pData;
|
||||
RTPKT_TO_OSPKT(pRxPkt)->len = pRxBlk->DataSize;
|
||||
RTPKT_TO_OSPKT(pRxPkt)->tail = RTPKT_TO_OSPKT(pRxPkt)->data + RTPKT_TO_OSPKT(pRxPkt)->len;
|
||||
SET_OS_PKT_NETDEV(pRxPkt, get_netdev_from_bssid(pAd, FromWhichBSSID));
|
||||
SET_OS_PKT_DATAPTR(pRxPkt, pRxBlk->pData);
|
||||
SET_OS_PKT_LEN(pRxPkt, pRxBlk->DataSize);
|
||||
SET_OS_PKT_DATATAIL(pRxPkt, pRxBlk->pData, pRxBlk->DataSize);
|
||||
|
||||
//
|
||||
// copy 802.3 header, if necessary
|
||||
//
|
||||
if (!RX_BLK_TEST_FLAG(pRxBlk, fRX_AMSDU))
|
||||
{
|
||||
{
|
||||
#ifdef LINUX
|
||||
NdisMoveMemory(skb_push(pRxPkt, LENGTH_802_3), Header802_3, LENGTH_802_3);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1550,7 +1530,8 @@ static VOID ba_enqueue_reordering_packet(
|
||||
UINT16 Sequence = (UINT16) pRxBlk->pHeader->Sequence;
|
||||
|
||||
mpdu_blk = ba_mpdu_blk_alloc(pAd);
|
||||
if (mpdu_blk != NULL)
|
||||
if ((mpdu_blk != NULL) &&
|
||||
(!RX_BLK_TEST_FLAG(pRxBlk, fRX_EAP)))
|
||||
{
|
||||
// Write RxD buffer address & allocated buffer length
|
||||
NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
|
||||
|
File diff suppressed because it is too large
Load Diff
2531
drivers/staging/rt2860/common/cmm_asic.c
Normal file
2531
drivers/staging/rt2860/common/cmm_asic.c
Normal file
File diff suppressed because it is too large
Load Diff
290
drivers/staging/rt2860/common/cmm_cfg.c
Normal file
290
drivers/staging/rt2860/common/cmm_cfg.c
Normal file
@ -0,0 +1,290 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
cmm_cfg.c
|
||||
|
||||
Abstract:
|
||||
Ralink WiFi Driver configuration related subroutines
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
char* GetPhyMode(
|
||||
int Mode)
|
||||
{
|
||||
switch(Mode)
|
||||
{
|
||||
case MODE_CCK:
|
||||
return "CCK";
|
||||
|
||||
case MODE_OFDM:
|
||||
return "OFDM";
|
||||
case MODE_HTMIX:
|
||||
return "HTMIX";
|
||||
|
||||
case MODE_HTGREENFIELD:
|
||||
return "GREEN";
|
||||
default:
|
||||
return "N/A";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
char* GetBW(
|
||||
int BW)
|
||||
{
|
||||
switch(BW)
|
||||
{
|
||||
case BW_10:
|
||||
return "10M";
|
||||
|
||||
case BW_20:
|
||||
return "20M";
|
||||
case BW_40:
|
||||
return "40M";
|
||||
default:
|
||||
return "N/A";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Set Country Region to pAd->CommonCfg.CountryRegion.
|
||||
This command will not work, if the field of CountryRegion in eeprom is programmed.
|
||||
|
||||
Return:
|
||||
TRUE if all parameters are OK, FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
INT RT_CfgSetCountryRegion(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PSTRING arg,
|
||||
IN INT band)
|
||||
{
|
||||
LONG region, regionMax;
|
||||
UCHAR *pCountryRegion;
|
||||
|
||||
region = simple_strtol(arg, 0, 10);
|
||||
|
||||
if (band == BAND_24G)
|
||||
{
|
||||
pCountryRegion = &pAd->CommonCfg.CountryRegion;
|
||||
regionMax = REGION_MAXIMUM_BG_BAND;
|
||||
}
|
||||
else
|
||||
{
|
||||
pCountryRegion = &pAd->CommonCfg.CountryRegionForABand;
|
||||
regionMax = REGION_MAXIMUM_A_BAND;
|
||||
}
|
||||
|
||||
// TODO: Is it neccesay for following check???
|
||||
// Country can be set only when EEPROM not programmed
|
||||
if (*pCountryRegion & 0x80)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("CfgSetCountryRegion():CountryRegion in eeprom was programmed\n"));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if((region >= 0) && (region <= REGION_MAXIMUM_BG_BAND))
|
||||
{
|
||||
*pCountryRegion= (UCHAR) region;
|
||||
}
|
||||
else if ((region == REGION_31_BG_BAND) && (band == BAND_24G))
|
||||
{
|
||||
*pCountryRegion = (UCHAR) region;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("CfgSetCountryRegion():region(%ld) out of range!\n", region));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Set Wireless Mode
|
||||
Return:
|
||||
TRUE if all parameters are OK, FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
INT RT_CfgSetWirelessMode(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PSTRING arg)
|
||||
{
|
||||
INT MaxPhyMode = PHY_11G;
|
||||
LONG WirelessMode;
|
||||
|
||||
MaxPhyMode = PHY_11N_5G;
|
||||
|
||||
WirelessMode = simple_strtol(arg, 0, 10);
|
||||
if (WirelessMode <= MaxPhyMode)
|
||||
{
|
||||
pAd->CommonCfg.PhyMode = WirelessMode;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
INT RT_CfgSetShortSlot(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PSTRING arg)
|
||||
{
|
||||
LONG ShortSlot;
|
||||
|
||||
ShortSlot = simple_strtol(arg, 0, 10);
|
||||
|
||||
if (ShortSlot == 1)
|
||||
pAd->CommonCfg.bUseShortSlotTime = TRUE;
|
||||
else if (ShortSlot == 0)
|
||||
pAd->CommonCfg.bUseShortSlotTime = FALSE;
|
||||
else
|
||||
return FALSE; //Invalid argument
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Set WEP KEY base on KeyIdx
|
||||
Return:
|
||||
TRUE if all parameters are OK, FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
INT RT_CfgSetWepKey(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PSTRING keyString,
|
||||
IN CIPHER_KEY *pSharedKey,
|
||||
IN INT keyIdx)
|
||||
{
|
||||
INT KeyLen;
|
||||
INT i;
|
||||
UCHAR CipherAlg = CIPHER_NONE;
|
||||
BOOLEAN bKeyIsHex = FALSE;
|
||||
|
||||
// TODO: Shall we do memset for the original key info??
|
||||
memset(pSharedKey, 0, sizeof(CIPHER_KEY));
|
||||
KeyLen = strlen(keyString);
|
||||
switch (KeyLen)
|
||||
{
|
||||
case 5: //wep 40 Ascii type
|
||||
case 13: //wep 104 Ascii type
|
||||
bKeyIsHex = FALSE;
|
||||
pSharedKey->KeyLen = KeyLen;
|
||||
NdisMoveMemory(pSharedKey->Key, keyString, KeyLen);
|
||||
break;
|
||||
|
||||
case 10: //wep 40 Hex type
|
||||
case 26: //wep 104 Hex type
|
||||
for(i=0; i < KeyLen; i++)
|
||||
{
|
||||
if( !isxdigit(*(keyString+i)) )
|
||||
return FALSE; //Not Hex value;
|
||||
}
|
||||
bKeyIsHex = TRUE;
|
||||
pSharedKey->KeyLen = KeyLen/2 ;
|
||||
AtoH(keyString, pSharedKey->Key, pSharedKey->KeyLen);
|
||||
break;
|
||||
|
||||
default: //Invalid argument
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetWepKey(keyIdx=%d):Invalid argument (arg=%s)\n", keyIdx, keyString));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pSharedKey->CipherAlg = ((KeyLen % 5) ? CIPHER_WEP128 : CIPHER_WEP64);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RT_CfgSetWepKey:(KeyIdx=%d,type=%s, Alg=%s)\n",
|
||||
keyIdx, (bKeyIsHex == FALSE ? "Ascii" : "Hex"), CipherName[CipherAlg]));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Set WPA PSK key
|
||||
|
||||
Arguments:
|
||||
pAdapter Pointer to our adapter
|
||||
keyString WPA pre-shared key string
|
||||
pHashStr String used for password hash function
|
||||
hashStrLen Lenght of the hash string
|
||||
pPMKBuf Output buffer of WPAPSK key
|
||||
|
||||
Return:
|
||||
TRUE if all parameters are OK, FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
INT RT_CfgSetWPAPSKKey(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN PSTRING keyString,
|
||||
IN UCHAR *pHashStr,
|
||||
IN INT hashStrLen,
|
||||
OUT PUCHAR pPMKBuf)
|
||||
{
|
||||
int keyLen;
|
||||
UCHAR keyMaterial[40];
|
||||
|
||||
keyLen = strlen(keyString);
|
||||
if ((keyLen < 8) || (keyLen > 64))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("WPAPSK Key length(%d) error, required 8 ~ 64 characters!(keyStr=%s)\n",
|
||||
keyLen, keyString));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
memset(pPMKBuf, 0, 32);
|
||||
if (keyLen == 64)
|
||||
{
|
||||
AtoH(keyString, pPMKBuf, 32);
|
||||
}
|
||||
else
|
||||
{
|
||||
PasswordHash(keyString, pHashStr, hashStrLen, keyMaterial);
|
||||
NdisMoveMemory(pPMKBuf, keyMaterial, 32);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
1153
drivers/staging/rt2860/common/cmm_data_pci.c
Normal file
1153
drivers/staging/rt2860/common/cmm_data_pci.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -24,12 +24,17 @@
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
All functions in this file must be USB-depended, or you should out your function
|
||||
in other files.
|
||||
|
||||
*/
|
||||
#include "../rt_config.h"
|
||||
|
||||
#ifdef RTMP_MAC_USB
|
||||
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
/*
|
||||
@ -41,7 +46,7 @@
|
||||
static inline NDIS_STATUS RtmpUSBCanDoWrite(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR QueIdx,
|
||||
IN HT_TX_CONTEXT *pHTTXContext)
|
||||
IN HT_TX_CONTEXT *pHTTXContext)
|
||||
{
|
||||
NDIS_STATUS canWrite = NDIS_STATUS_RESOURCES;
|
||||
|
||||
@ -292,7 +297,6 @@ USHORT RtmpUSB_WriteSingleTxResource(
|
||||
pTxBlk->Priv = (TXINFO_SIZE + USBDMApktLen);
|
||||
|
||||
// For TxInfo, the length of USBDMApktLen = TXWI_SIZE + 802.11 header + payload
|
||||
//PS packets use HCCA queue when dequeue from PS unicast queue (WiFi WPA2 MA9_DT1 for Marvell B STA)
|
||||
RTMPWriteTxInfo(pAd, pTxInfo, (USHORT)(USBDMApktLen), FALSE, FIFO_EDCA, FALSE /*NextValid*/, FALSE);
|
||||
|
||||
if ((pHTTXContext->CurWritePosition + 3906 + pTxBlk->Priv) > MAX_TXBULK_LIMIT)
|
||||
@ -583,11 +587,11 @@ VOID RtmpUSBDataKickOut(
|
||||
This function handle RT2870 specific TxDesc and cpu index update and kick the packet out.
|
||||
*/
|
||||
int RtmpUSBMgmtKickOut(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR QueIdx,
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UCHAR QueIdx,
|
||||
IN PNDIS_PACKET pPacket,
|
||||
IN PUCHAR pSrcBufVA,
|
||||
IN UINT SrcBufLen)
|
||||
IN UINT SrcBufLen)
|
||||
{
|
||||
PTXINFO_STRUC pTxInfo;
|
||||
ULONG BulkOutSize;
|
||||
@ -679,6 +683,7 @@ VOID RtmpUSBNullFrameKickOut(
|
||||
pTxWI = (PTXWI_STRUC)&pWirelessPkt[TXINFO_SIZE];
|
||||
RTMPWriteTxWI(pAd, pTxWI, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, 0, BSSID_WCID, (sizeof(HEADER_802_11)),
|
||||
0, 0, (UCHAR)pAd->CommonCfg.MlmeTransmit.field.MCS, IFS_HTTXOP, FALSE, &pAd->CommonCfg.MlmeTransmit);
|
||||
|
||||
RTMPMoveMemory(&pWirelessPkt[TXWI_SIZE+TXINFO_SIZE], &pAd->NullFrame, sizeof(HEADER_802_11));
|
||||
pAd->NullContext.BulkOutSize = TXINFO_SIZE + TXWI_SIZE + sizeof(pAd->NullFrame) + 4;
|
||||
|
||||
@ -693,6 +698,109 @@ VOID RtmpUSBNullFrameKickOut(
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Get a received packet.
|
||||
|
||||
Arguments:
|
||||
pAd device control block
|
||||
pSaveRxD receive descriptor information
|
||||
*pbReschedule need reschedule flag
|
||||
*pRxPending pending received packet flag
|
||||
|
||||
Return Value:
|
||||
the recieved packet
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
PNDIS_PACKET GetPacketFromRxRing(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PRT28XX_RXD_STRUC pSaveRxD,
|
||||
OUT BOOLEAN *pbReschedule,
|
||||
IN OUT UINT32 *pRxPending)
|
||||
{
|
||||
PRX_CONTEXT pRxContext;
|
||||
PNDIS_PACKET pSkb;
|
||||
PUCHAR pData;
|
||||
ULONG ThisFrameLen;
|
||||
ULONG RxBufferLength;
|
||||
PRXWI_STRUC pRxWI;
|
||||
|
||||
pRxContext = &pAd->RxContext[pAd->NextRxBulkInReadIndex];
|
||||
if ((pRxContext->Readable == FALSE) || (pRxContext->InUse == TRUE))
|
||||
return NULL;
|
||||
|
||||
RxBufferLength = pRxContext->BulkInOffset - pAd->ReadPosition;
|
||||
if (RxBufferLength < (RT2870_RXDMALEN_FIELD_SIZE + sizeof(RXWI_STRUC) + sizeof(RXINFO_STRUC)))
|
||||
{
|
||||
goto label_null;
|
||||
}
|
||||
|
||||
pData = &pRxContext->TransferBuffer[pAd->ReadPosition]; /* 4KB */
|
||||
// The RXDMA field is 4 bytes, now just use the first 2 bytes. The Length including the (RXWI + MSDU + Padding)
|
||||
ThisFrameLen = *pData + (*(pData+1)<<8);
|
||||
if (ThisFrameLen == 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("BIRIdx(%d): RXDMALen is zero.[%ld], BulkInBufLen = %ld)\n",
|
||||
pAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset));
|
||||
goto label_null;
|
||||
}
|
||||
if ((ThisFrameLen&0x3) != 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("BIRIdx(%d): RXDMALen not multiple of 4.[%ld], BulkInBufLen = %ld)\n",
|
||||
pAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset));
|
||||
goto label_null;
|
||||
}
|
||||
|
||||
if ((ThisFrameLen + 8)> RxBufferLength) // 8 for (RT2870_RXDMALEN_FIELD_SIZE + sizeof(RXINFO_STRUC))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("BIRIdx(%d):FrameLen(0x%lx) outranges. BulkInLen=0x%lx, remaining RxBufLen=0x%lx, ReadPos=0x%lx\n",
|
||||
pAd->NextRxBulkInReadIndex, ThisFrameLen, pRxContext->BulkInOffset, RxBufferLength, pAd->ReadPosition));
|
||||
|
||||
// error frame. finish this loop
|
||||
goto label_null;
|
||||
}
|
||||
|
||||
// skip USB frame length field
|
||||
pData += RT2870_RXDMALEN_FIELD_SIZE;
|
||||
pRxWI = (PRXWI_STRUC)pData;
|
||||
if (pRxWI->MPDUtotalByteCount > ThisFrameLen)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s():pRxWIMPDUtotalByteCount(%d) large than RxDMALen(%ld)\n",
|
||||
__FUNCTION__, pRxWI->MPDUtotalByteCount, ThisFrameLen));
|
||||
goto label_null;
|
||||
}
|
||||
|
||||
// allocate a rx packet
|
||||
pSkb = dev_alloc_skb(ThisFrameLen);
|
||||
if (pSkb == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,("%s():Cannot Allocate sk buffer for this Bulk-In buffer!\n", __FUNCTION__));
|
||||
goto label_null;
|
||||
}
|
||||
|
||||
// copy the rx packet
|
||||
memcpy(skb_put(pSkb, ThisFrameLen), pData, ThisFrameLen);
|
||||
RTPKT_TO_OSPKT(pSkb)->dev = get_netdev_from_bssid(pAd, BSS0);
|
||||
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pSkb), PKTSRC_NDIS);
|
||||
|
||||
// copy RxD
|
||||
*pSaveRxD = *(PRXINFO_STRUC)(pData + ThisFrameLen);
|
||||
|
||||
// update next packet read position.
|
||||
pAd->ReadPosition += (ThisFrameLen + RT2870_RXDMALEN_FIELD_SIZE + RXINFO_SIZE); // 8 for (RT2870_RXDMALEN_FIELD_SIZE + sizeof(RXINFO_STRUC))
|
||||
|
||||
return pSkb;
|
||||
|
||||
label_null:
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
@ -775,6 +883,11 @@ NDIS_STATUS RTMPCheckRxError(
|
||||
if (pRxINFO->Decrypted && pRxINFO->CipherErr)
|
||||
{
|
||||
|
||||
if (((pRxINFO->CipherErr & 1) == 1) && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))
|
||||
RTMPSendWirelessEvent(pAd, IW_ICV_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
|
||||
|
||||
if (((pRxINFO->CipherErr & 2) == 2) && pAd->CommonCfg.bWirelessEvent && INFRA_ON(pAd))
|
||||
RTMPSendWirelessEvent(pAd, IW_MIC_ERROR_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
|
||||
//
|
||||
// MIC Error
|
||||
//
|
||||
@ -801,14 +914,32 @@ NDIS_STATUS RTMPCheckRxError(
|
||||
return(NDIS_STATUS_SUCCESS);
|
||||
}
|
||||
|
||||
VOID RtmpUsbStaAsicForceWakeupTimeout(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3)
|
||||
{
|
||||
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)FunctionContext;
|
||||
|
||||
|
||||
if (pAd && pAd->Mlme.AutoWakeupTimerRunning)
|
||||
{
|
||||
AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
|
||||
|
||||
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_DOZE);
|
||||
pAd->Mlme.AutoWakeupTimerRunning = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
VOID RT28xxUsbStaAsicForceWakeup(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN BOOLEAN bFromTx)
|
||||
{
|
||||
AUTO_WAKEUP_STRUC AutoWakeupCfg;
|
||||
BOOLEAN Canceled;
|
||||
|
||||
AutoWakeupCfg.word = 0;
|
||||
RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
|
||||
if (pAd->Mlme.AutoWakeupTimerRunning)
|
||||
RTMPCancelTimer(&pAd->Mlme.AutoWakeupTimer, &Canceled);
|
||||
|
||||
AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
|
||||
|
||||
@ -819,19 +950,14 @@ VOID RT28xxUsbStaAsicSleepThenAutoWakeup(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT TbttNumToNextWakeUp)
|
||||
{
|
||||
AUTO_WAKEUP_STRUC AutoWakeupCfg;
|
||||
|
||||
|
||||
// we have decided to SLEEP, so at least do it for a BEACON period.
|
||||
if (TbttNumToNextWakeUp == 0)
|
||||
TbttNumToNextWakeUp = 1;
|
||||
|
||||
AutoWakeupCfg.word = 0;
|
||||
RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
|
||||
|
||||
AutoWakeupCfg.field.NumofSleepingTbtt = TbttNumToNextWakeUp - 1;
|
||||
AutoWakeupCfg.field.EnableAutoWakeup = 1;
|
||||
AutoWakeupCfg.field.AutoLeadTime = 5;
|
||||
RTMP_IO_WRITE32(pAd, AUTO_WAKEUP_CFG, AutoWakeupCfg.word);
|
||||
RTMPSetTimer(&pAd->Mlme.AutoWakeupTimer, AUTO_WAKEUP_TIMEOUT);
|
||||
pAd->Mlme.AutoWakeupTimerRunning = TRUE;
|
||||
|
||||
AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02); // send POWER-SAVE command to MCU. Timeout 40us.
|
||||
|
||||
@ -839,98 +965,4 @@ VOID RT28xxUsbStaAsicSleepThenAutoWakeup(
|
||||
|
||||
}
|
||||
|
||||
VOID RT28xxUsbMlmeRadioOn(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("RT28xxUsbMlmeRadioOn()\n"));
|
||||
|
||||
if (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
|
||||
return;
|
||||
|
||||
AsicSendCommandToMcu(pAd, 0x31, 0xff, 0x00, 0x02);
|
||||
RTMPusecDelay(10000);
|
||||
|
||||
NICResetFromError(pAd);
|
||||
|
||||
// Enable Tx/Rx
|
||||
RTMPEnableRxTx(pAd);
|
||||
|
||||
#ifdef RT3070
|
||||
if (IS_RT3071(pAd))
|
||||
{
|
||||
RT30xxReverseRFSleepModeSetup(pAd);
|
||||
}
|
||||
#endif // RT3070 //
|
||||
|
||||
// Clear Radio off flag
|
||||
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
|
||||
|
||||
RTUSBBulkReceive(pAd);
|
||||
|
||||
// Set LED
|
||||
RTMPSetLED(pAd, LED_RADIO_ON);
|
||||
}
|
||||
|
||||
VOID RT28xxUsbMlmeRadioOFF(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
WPDMA_GLO_CFG_STRUC GloCfg;
|
||||
UINT32 Value, i;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("RT28xxUsbMlmeRadioOFF()\n"));
|
||||
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF))
|
||||
return;
|
||||
|
||||
// Set LED
|
||||
RTMPSetLED(pAd, LED_RADIO_OFF);
|
||||
// Set Radio off flag
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
|
||||
|
||||
{
|
||||
// Link down first if any association exists
|
||||
if (INFRA_ON(pAd) || ADHOC_ON(pAd))
|
||||
LinkDown(pAd, FALSE);
|
||||
RTMPusecDelay(10000);
|
||||
|
||||
//==========================================
|
||||
// Clean up old bss table
|
||||
BssTableInit(&pAd->ScanTab);
|
||||
}
|
||||
|
||||
if (pAd->CommonCfg.BBPCurrentBW == BW_40)
|
||||
{
|
||||
// Must using 40MHz.
|
||||
AsicTurnOffRFClk(pAd, pAd->CommonCfg.CentralChannel);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Must using 20MHz.
|
||||
AsicTurnOffRFClk(pAd, pAd->CommonCfg.Channel);
|
||||
}
|
||||
|
||||
// Disable Tx/Rx DMA
|
||||
RTUSBReadMACRegister(pAd, WPDMA_GLO_CFG, &GloCfg.word); // disable DMA
|
||||
GloCfg.field.EnableTxDMA = 0;
|
||||
GloCfg.field.EnableRxDMA = 0;
|
||||
RTUSBWriteMACRegister(pAd, WPDMA_GLO_CFG, GloCfg.word); // abort all TX rings
|
||||
|
||||
// Waiting for DMA idle
|
||||
i = 0;
|
||||
do
|
||||
{
|
||||
RTMP_IO_READ32(pAd, WPDMA_GLO_CFG, &GloCfg.word);
|
||||
if ((GloCfg.field.TxDMABusy == 0) && (GloCfg.field.RxDMABusy == 0))
|
||||
break;
|
||||
|
||||
RTMPusecDelay(1000);
|
||||
}while (i++ < 100);
|
||||
|
||||
// Disable MAC Tx/Rx
|
||||
RTMP_IO_READ32(pAd, MAC_SYS_CTRL, &Value);
|
||||
Value &= (0xfffffff3);
|
||||
RTMP_IO_WRITE32(pAd, MAC_SYS_CTRL, Value);
|
||||
|
||||
AsicSendCommandToMcu(pAd, 0x30, 0xff, 0xff, 0x02);
|
||||
}
|
||||
|
||||
#endif // RTMP_MAC_USB //
|
File diff suppressed because it is too large
Load Diff
1504
drivers/staging/rt2860/common/cmm_mac_pci.c
Normal file
1504
drivers/staging/rt2860/common/cmm_mac_pci.c
Normal file
File diff suppressed because it is too large
Load Diff
1216
drivers/staging/rt2860/common/cmm_mac_usb.c
Normal file
1216
drivers/staging/rt2860/common/cmm_mac_usb.c
Normal file
File diff suppressed because it is too large
Load Diff
1736
drivers/staging/rt2860/common/cmm_profile.c
Normal file
1736
drivers/staging/rt2860/common/cmm_profile.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -283,8 +283,8 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
|
||||
OUT USHORT *LengthVIE,
|
||||
OUT PNDIS_802_11_VARIABLE_IEs pVIE)
|
||||
{
|
||||
CHAR *Ptr;
|
||||
CHAR TimLen;
|
||||
UCHAR *Ptr;
|
||||
UCHAR TimLen;
|
||||
PFRAME_802_11 pFrame;
|
||||
PEID_STRUCT pEid;
|
||||
UCHAR SubType;
|
||||
@ -529,10 +529,9 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
|
||||
case IE_TIM:
|
||||
if(INFRA_ON(pAd) && SubType == SUBTYPE_BEACON)
|
||||
{
|
||||
GetTimBit((PUCHAR)pEid, pAd->StaActive.Aid, &TimLen, pBcastFlag, pDtimCount, pDtimPeriod, pMessageToMe);
|
||||
GetTimBit((PCHAR)pEid, pAd->StaActive.Aid, &TimLen, pBcastFlag, pDtimCount, pDtimPeriod, pMessageToMe);
|
||||
}
|
||||
break;
|
||||
|
||||
case IE_CHANNEL_SWITCH_ANNOUNCEMENT:
|
||||
if(pEid->Len == 3)
|
||||
{
|
||||
@ -545,6 +544,26 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
|
||||
// Wifi WMM use the same IE vale, need to parse that too
|
||||
// case IE_WPA:
|
||||
case IE_VENDOR_SPECIFIC:
|
||||
// Check Broadcom/Atheros 802.11n OUI version, for HT Capability IE.
|
||||
// This HT IE is before IEEE draft set HT IE value.2006-09-28 by Jan.
|
||||
/*if (NdisEqualMemory(pEid->Octet, BROADCOM_OUI, 3) && (pEid->Len >= 4))
|
||||
{
|
||||
if ((pEid->Octet[3] == OUI_BROADCOM_HT) && (pEid->Len >= 30))
|
||||
{
|
||||
{
|
||||
NdisMoveMemory(pHtCapability, &pEid->Octet[4], sizeof(HT_CAPABILITY_IE));
|
||||
*pHtCapabilityLen = SIZE_HT_CAP_IE; // Nnow we only support 26 bytes.
|
||||
}
|
||||
}
|
||||
if ((pEid->Octet[3] == OUI_BROADCOM_HT) && (pEid->Len >= 26))
|
||||
{
|
||||
{
|
||||
NdisMoveMemory(AddHtInfo, &pEid->Octet[4], sizeof(ADD_HT_INFO_IE));
|
||||
*AddHtInfoLen = SIZE_ADD_HT_INFO_IE; // Nnow we only support 26 bytes.
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
// Check the OUI version, filter out non-standard usage
|
||||
if (NdisEqualMemory(pEid->Octet, RALINK_OUI, 3) && (pEid->Len == 7))
|
||||
{
|
||||
@ -638,6 +657,8 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
|
||||
pEdcaParm->Cwmax[QID_AC_VO] = CW_MAX_IN_BITS-1;
|
||||
pEdcaParm->Txop[QID_AC_VO] = 48; // AC_VO: 48*32us ~= 1.5ms
|
||||
}
|
||||
|
||||
|
||||
break;
|
||||
|
||||
case IE_EXT_SUPP_RATES:
|
||||
@ -718,7 +739,7 @@ BOOLEAN PeerBeaconAndProbeRspSanity(
|
||||
|
||||
if (Sanity != 0x7)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_WARN, ("PeerBeaconAndProbeRspSanity - missing field, Sanity=0x%02x\n", Sanity));
|
||||
DBGPRINT(RT_DEBUG_LOUD, ("PeerBeaconAndProbeRspSanity - missing field, Sanity=0x%02x\n", Sanity));
|
||||
return FALSE;
|
||||
}
|
||||
else
|
||||
@ -755,8 +776,6 @@ BOOLEAN MlmeScanReqSanity(
|
||||
|
||||
if ((*pBssType == BSS_INFRA || *pBssType == BSS_ADHOC || *pBssType == BSS_ANY)
|
||||
&& (*pScanType == SCAN_ACTIVE || *pScanType == SCAN_PASSIVE
|
||||
|| *pScanType == SCAN_CISCO_PASSIVE || *pScanType == SCAN_CISCO_ACTIVE
|
||||
|| *pScanType == SCAN_CISCO_CHANNEL_LOAD || *pScanType == SCAN_CISCO_NOISE
|
||||
))
|
||||
{
|
||||
return TRUE;
|
||||
@ -837,8 +856,7 @@ BOOLEAN PeerAuthSanity(
|
||||
NdisMoveMemory(pSeq, &pFrame->Octet[2], 2);
|
||||
NdisMoveMemory(pStatus, &pFrame->Octet[4], 2);
|
||||
|
||||
if ((*pAlg == Ndis802_11AuthModeOpen)
|
||||
)
|
||||
if (*pAlg == AUTH_MODE_OPEN)
|
||||
{
|
||||
if (*pSeq == 1 || *pSeq == 2)
|
||||
{
|
||||
@ -850,7 +868,7 @@ BOOLEAN PeerAuthSanity(
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
else if (*pAlg == Ndis802_11AuthModeShared)
|
||||
else if (*pAlg == AUTH_MODE_KEY)
|
||||
{
|
||||
if (*pSeq == 1 || *pSeq == 4)
|
||||
{
|
||||
@ -897,7 +915,7 @@ BOOLEAN MlmeAuthReqSanity(
|
||||
*pTimeout = pInfo->Timeout;
|
||||
*pAlg = pInfo->Alg;
|
||||
|
||||
if (((*pAlg == Ndis802_11AuthModeShared) ||(*pAlg == Ndis802_11AuthModeOpen)
|
||||
if (((*pAlg == AUTH_MODE_KEY) ||(*pAlg == AUTH_MODE_OPEN)
|
||||
) &&
|
||||
((*pAddr & 0x01) == 0))
|
||||
{
|
||||
@ -1052,3 +1070,196 @@ NDIS_802_11_NETWORK_TYPE NetworkTypeInUseSanity(
|
||||
|
||||
return NetWorkType;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Check the validity of the received EAPoL frame
|
||||
Return:
|
||||
TRUE if all parameters are OK,
|
||||
FALSE otherwise
|
||||
==========================================================================
|
||||
*/
|
||||
BOOLEAN PeerWpaMessageSanity(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PEAPOL_PACKET pMsg,
|
||||
IN ULONG MsgLen,
|
||||
IN UCHAR MsgType,
|
||||
IN MAC_TABLE_ENTRY *pEntry)
|
||||
{
|
||||
UCHAR mic[LEN_KEY_DESC_MIC], digest[80], KEYDATA[MAX_LEN_OF_RSNIE];
|
||||
BOOLEAN bReplayDiff = FALSE;
|
||||
BOOLEAN bWPA2 = FALSE;
|
||||
KEY_INFO EapolKeyInfo;
|
||||
UCHAR GroupKeyIndex = 0;
|
||||
|
||||
|
||||
NdisZeroMemory(mic, sizeof(mic));
|
||||
NdisZeroMemory(digest, sizeof(digest));
|
||||
NdisZeroMemory(KEYDATA, sizeof(KEYDATA));
|
||||
NdisZeroMemory((PUCHAR)&EapolKeyInfo, sizeof(EapolKeyInfo));
|
||||
|
||||
NdisMoveMemory((PUCHAR)&EapolKeyInfo, (PUCHAR)&pMsg->KeyDesc.KeyInfo, sizeof(KEY_INFO));
|
||||
|
||||
*((USHORT *)&EapolKeyInfo) = cpu2le16(*((USHORT *)&EapolKeyInfo));
|
||||
|
||||
// Choose WPA2 or not
|
||||
if ((pEntry->AuthMode == Ndis802_11AuthModeWPA2) || (pEntry->AuthMode == Ndis802_11AuthModeWPA2PSK))
|
||||
bWPA2 = TRUE;
|
||||
|
||||
// 0. Check MsgType
|
||||
if ((MsgType > EAPOL_GROUP_MSG_2) || (MsgType < EAPOL_PAIR_MSG_1))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("The message type is invalid(%d)! \n", MsgType));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// 1. Replay counter check
|
||||
if (MsgType == EAPOL_PAIR_MSG_1 || MsgType == EAPOL_PAIR_MSG_3 || MsgType == EAPOL_GROUP_MSG_1) // For supplicant
|
||||
{
|
||||
// First validate replay counter, only accept message with larger replay counter.
|
||||
// Let equal pass, some AP start with all zero replay counter
|
||||
UCHAR ZeroReplay[LEN_KEY_DESC_REPLAY];
|
||||
|
||||
NdisZeroMemory(ZeroReplay, LEN_KEY_DESC_REPLAY);
|
||||
if ((RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY) != 1) &&
|
||||
(RTMPCompareMemory(pMsg->KeyDesc.ReplayCounter, ZeroReplay, LEN_KEY_DESC_REPLAY) != 0))
|
||||
{
|
||||
bReplayDiff = TRUE;
|
||||
}
|
||||
}
|
||||
else if (MsgType == EAPOL_PAIR_MSG_2 || MsgType == EAPOL_PAIR_MSG_4 || MsgType == EAPOL_GROUP_MSG_2) // For authenticator
|
||||
{
|
||||
// check Replay Counter coresponds to MSG from authenticator, otherwise discard
|
||||
if (!NdisEqualMemory(pMsg->KeyDesc.ReplayCounter, pEntry->R_Counter, LEN_KEY_DESC_REPLAY))
|
||||
{
|
||||
bReplayDiff = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// Replay Counter different condition
|
||||
if (bReplayDiff)
|
||||
{
|
||||
// send wireless event - for replay counter different
|
||||
if (pAd->CommonCfg.bWirelessEvent)
|
||||
RTMPSendWirelessEvent(pAd, IW_REPLAY_COUNTER_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);
|
||||
|
||||
if (MsgType < EAPOL_GROUP_MSG_1)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in pairwise msg %d of 4-way handshake!\n", MsgType));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Replay Counter Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));
|
||||
}
|
||||
|
||||
hex_dump("Receive replay counter ", pMsg->KeyDesc.ReplayCounter, LEN_KEY_DESC_REPLAY);
|
||||
hex_dump("Current replay counter ", pEntry->R_Counter, LEN_KEY_DESC_REPLAY);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// 2. Verify MIC except Pairwise Msg1
|
||||
if (MsgType != EAPOL_PAIR_MSG_1)
|
||||
{
|
||||
UCHAR rcvd_mic[LEN_KEY_DESC_MIC];
|
||||
|
||||
// Record the received MIC for check later
|
||||
NdisMoveMemory(rcvd_mic, pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
|
||||
NdisZeroMemory(pMsg->KeyDesc.KeyMic, LEN_KEY_DESC_MIC);
|
||||
|
||||
if (EapolKeyInfo.KeyDescVer == DESC_TYPE_TKIP) // TKIP
|
||||
{
|
||||
HMAC_MD5(pEntry->PTK, LEN_EAP_MICK, (PUCHAR)pMsg, MsgLen, mic, MD5_DIGEST_SIZE);
|
||||
}
|
||||
else if (EapolKeyInfo.KeyDescVer == DESC_TYPE_AES) // AES
|
||||
{
|
||||
HMAC_SHA1(pEntry->PTK, LEN_EAP_MICK, (PUCHAR)pMsg, MsgLen, digest, SHA1_DIGEST_SIZE);
|
||||
NdisMoveMemory(mic, digest, LEN_KEY_DESC_MIC);
|
||||
}
|
||||
|
||||
if (!NdisEqualMemory(rcvd_mic, mic, LEN_KEY_DESC_MIC))
|
||||
{
|
||||
// send wireless event - for MIC different
|
||||
if (pAd->CommonCfg.bWirelessEvent)
|
||||
RTMPSendWirelessEvent(pAd, IW_MIC_DIFF_EVENT_FLAG, pEntry->Addr, pEntry->apidx, 0);
|
||||
|
||||
if (MsgType < EAPOL_GROUP_MSG_1)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in pairwise msg %d of 4-way handshake!\n", MsgType));
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("MIC Different in group msg %d of 2-way handshake!\n", (MsgType - EAPOL_PAIR_MSG_4)));
|
||||
}
|
||||
|
||||
hex_dump("Received MIC", rcvd_mic, LEN_KEY_DESC_MIC);
|
||||
hex_dump("Desired MIC", mic, LEN_KEY_DESC_MIC);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
// 1. Decrypt the Key Data field if GTK is included.
|
||||
// 2. Extract the context of the Key Data field if it exist.
|
||||
// The field in pairwise_msg_2_WPA1(WPA2) & pairwise_msg_3_WPA1 is clear.
|
||||
// The field in group_msg_1_WPA1(WPA2) & pairwise_msg_3_WPA2 is encrypted.
|
||||
if (CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen) > 0)
|
||||
{
|
||||
// Decrypt this field
|
||||
if ((MsgType == EAPOL_PAIR_MSG_3 && bWPA2) || (MsgType == EAPOL_GROUP_MSG_1))
|
||||
{
|
||||
if(
|
||||
(EapolKeyInfo.KeyDescVer == DESC_TYPE_AES))
|
||||
{
|
||||
// AES
|
||||
AES_GTK_KEY_UNWRAP(&pEntry->PTK[16], KEYDATA,
|
||||
CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen),
|
||||
pMsg->KeyDesc.KeyData);
|
||||
}
|
||||
else
|
||||
{
|
||||
INT i;
|
||||
UCHAR Key[32];
|
||||
// Decrypt TKIP GTK
|
||||
// Construct 32 bytes RC4 Key
|
||||
NdisMoveMemory(Key, pMsg->KeyDesc.KeyIv, 16);
|
||||
NdisMoveMemory(&Key[16], &pEntry->PTK[16], 16);
|
||||
ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, Key, 32);
|
||||
//discard first 256 bytes
|
||||
for(i = 0; i < 256; i++)
|
||||
ARCFOUR_BYTE(&pAd->PrivateInfo.WEPCONTEXT);
|
||||
// Decrypt GTK. Becareful, there is no ICV to check the result is correct or not
|
||||
ARCFOUR_DECRYPT(&pAd->PrivateInfo.WEPCONTEXT, KEYDATA,
|
||||
pMsg->KeyDesc.KeyData,
|
||||
CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen));
|
||||
}
|
||||
|
||||
if (!bWPA2 && (MsgType == EAPOL_GROUP_MSG_1))
|
||||
GroupKeyIndex = EapolKeyInfo.KeyIndex;
|
||||
|
||||
}
|
||||
else if ((MsgType == EAPOL_PAIR_MSG_2) || (MsgType == EAPOL_PAIR_MSG_3 && !bWPA2))
|
||||
{
|
||||
NdisMoveMemory(KEYDATA, pMsg->KeyDesc.KeyData, CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Parse Key Data field to
|
||||
// 1. verify RSN IE for pairwise_msg_2_WPA1(WPA2) ,pairwise_msg_3_WPA1(WPA2)
|
||||
// 2. verify KDE format for pairwise_msg_3_WPA2, group_msg_1_WPA2
|
||||
// 3. update shared key for pairwise_msg_3_WPA2, group_msg_1_WPA1(WPA2)
|
||||
if (!RTMPParseEapolKeyData(pAd, KEYDATA,
|
||||
CONV_ARRARY_TO_UINT16(pMsg->KeyDesc.KeyDataLen),
|
||||
GroupKeyIndex, MsgType, bWPA2, pEntry))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
@ -25,7 +25,7 @@
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
sync.c
|
||||
cmm_sync.c
|
||||
|
||||
Abstract:
|
||||
|
||||
@ -64,11 +64,16 @@ UCHAR A_BAND_REGION_3_CHANNEL_LIST[]={52, 56, 60, 64, 149, 153, 157, 161};
|
||||
UCHAR A_BAND_REGION_4_CHANNEL_LIST[]={149, 153, 157, 161, 165};
|
||||
UCHAR A_BAND_REGION_5_CHANNEL_LIST[]={149, 153, 157, 161};
|
||||
UCHAR A_BAND_REGION_6_CHANNEL_LIST[]={36, 40, 44, 48};
|
||||
UCHAR A_BAND_REGION_7_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165};
|
||||
UCHAR A_BAND_REGION_7_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165, 169, 173};
|
||||
UCHAR A_BAND_REGION_8_CHANNEL_LIST[]={52, 56, 60, 64};
|
||||
UCHAR A_BAND_REGION_9_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165};
|
||||
UCHAR A_BAND_REGION_10_CHANNEL_LIST[]={36, 40, 44, 48, 149, 153, 157, 161, 165};
|
||||
UCHAR A_BAND_REGION_11_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161};
|
||||
UCHAR A_BAND_REGION_12_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
|
||||
UCHAR A_BAND_REGION_13_CHANNEL_LIST[]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161};
|
||||
UCHAR A_BAND_REGION_14_CHANNEL_LIST[]={36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165};
|
||||
UCHAR A_BAND_REGION_15_CHANNEL_LIST[]={149, 153, 157, 161, 165, 169, 173};
|
||||
|
||||
|
||||
//BaSizeArray follows the 802.11n definition as MaxRxFactor. 2^(13+factor) bytes. When factor =0, it's about Ba buffer size =8.
|
||||
UCHAR BaSizeArray[4] = {8,16,32,64};
|
||||
@ -200,7 +205,22 @@ VOID BuildChannelList(
|
||||
num = sizeof(A_BAND_REGION_11_CHANNEL_LIST)/sizeof(UCHAR);
|
||||
pChannelList = A_BAND_REGION_11_CHANNEL_LIST;
|
||||
break;
|
||||
|
||||
case REGION_12_A_BAND:
|
||||
num = sizeof(A_BAND_REGION_12_CHANNEL_LIST)/sizeof(UCHAR);
|
||||
pChannelList = A_BAND_REGION_12_CHANNEL_LIST;
|
||||
break;
|
||||
case REGION_13_A_BAND:
|
||||
num = sizeof(A_BAND_REGION_13_CHANNEL_LIST)/sizeof(UCHAR);
|
||||
pChannelList = A_BAND_REGION_13_CHANNEL_LIST;
|
||||
break;
|
||||
case REGION_14_A_BAND:
|
||||
num = sizeof(A_BAND_REGION_14_CHANNEL_LIST)/sizeof(UCHAR);
|
||||
pChannelList = A_BAND_REGION_14_CHANNEL_LIST;
|
||||
break;
|
||||
case REGION_15_A_BAND:
|
||||
num = sizeof(A_BAND_REGION_15_CHANNEL_LIST)/sizeof(UCHAR);
|
||||
pChannelList = A_BAND_REGION_15_CHANNEL_LIST;
|
||||
break;
|
||||
default: // Error. should never happen
|
||||
DBGPRINT(RT_DEBUG_WARN,("countryregion=%d not support", pAd->CommonCfg.CountryRegionForABand));
|
||||
break;
|
||||
@ -383,8 +403,11 @@ VOID ScanNextChannel(
|
||||
PHEADER_802_11 pHdr80211;
|
||||
UINT ScanTimeIn5gChannel = SHORT_CHANNEL_TIME;
|
||||
|
||||
{
|
||||
if (MONITOR_ON(pAd))
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (pAd->MlmeAux.Channel == 0)
|
||||
{
|
||||
@ -409,6 +432,19 @@ VOID ScanNextChannel(
|
||||
}
|
||||
|
||||
{
|
||||
#ifdef RT2860
|
||||
/*
|
||||
If all peer Ad-hoc clients leave, driver would do LinkDown and LinkUp.
|
||||
In LinkUp, CommonCfg.Ssid would copy SSID from MlmeAux.
|
||||
To prevent SSID is zero or wrong in Beacon, need to recover MlmeAux.SSID here.
|
||||
*/
|
||||
if (ADHOC_ON(pAd))
|
||||
{
|
||||
NdisZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
|
||||
pAd->MlmeAux.SsidLen = pAd->CommonCfg.SsidLen;
|
||||
NdisMoveMemory(pAd->MlmeAux.Ssid, pAd->CommonCfg.Ssid, pAd->CommonCfg.SsidLen);
|
||||
}
|
||||
#endif // RT2860 //
|
||||
//
|
||||
// To prevent data lost.
|
||||
// Send an NULL data with turned PSM bit on to current associated AP before SCAN progress.
|
||||
@ -438,29 +474,26 @@ VOID ScanNextChannel(
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_SCAN_CONF, 2, &Status);
|
||||
}
|
||||
|
||||
|
||||
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);
|
||||
}
|
||||
#ifdef RT2870
|
||||
#ifdef RTMP_MAC_USB
|
||||
else if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST) && (pAd->OpMode == OPMODE_STA))
|
||||
{
|
||||
pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
|
||||
MlmeCntlConfirm(pAd, MT2_SCAN_CONF, MLME_FAIL_NO_RESOURCE);
|
||||
}
|
||||
#endif // RT2870 //
|
||||
#endif // RTMP_MAC_USB //
|
||||
else
|
||||
{
|
||||
{
|
||||
// BBP and RF are not accessible in PS mode, we has to wake them up first
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
|
||||
#ifdef RT2860
|
||||
AsicForceWakeup(pAd, FROM_TX);
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
AsicForceWakeup(pAd, TRUE);
|
||||
#endif
|
||||
|
||||
// leave PSM during scanning. otherwise we may lost ProbeRsp & BEACON
|
||||
if (pAd->StaCfg.Psm == PWR_SAVE)
|
||||
MlmeSetPsmBit(pAd, PWR_ACTIVE);
|
||||
RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);
|
||||
}
|
||||
|
||||
AsicSwitchChannel(pAd, pAd->MlmeAux.Channel, TRUE);
|
||||
@ -487,16 +520,6 @@ VOID ScanNextChannel(
|
||||
// Chnage the channel scan time for CISCO stuff based on its IAPP announcement
|
||||
if (ScanType == FAST_SCAN_ACTIVE)
|
||||
RTMPSetTimer(&pAd->MlmeAux.ScanTimer, FAST_ACTIVE_SCAN_TIME);
|
||||
else if (((ScanType == SCAN_CISCO_ACTIVE) ||
|
||||
(ScanType == SCAN_CISCO_PASSIVE) ||
|
||||
(ScanType == SCAN_CISCO_CHANNEL_LOAD) ||
|
||||
(ScanType == SCAN_CISCO_NOISE)) && (pAd->OpMode == OPMODE_STA))
|
||||
{
|
||||
if (pAd->StaCfg.CCXScanTime < 25)
|
||||
RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime * 2);
|
||||
else
|
||||
RTMPSetTimer(&pAd->MlmeAux.ScanTimer, pAd->StaCfg.CCXScanTime);
|
||||
}
|
||||
else // must be SCAN_PASSIVE or SCAN_ACTIVE
|
||||
{
|
||||
if ((pAd->CommonCfg.PhyMode == PHY_11ABG_MIXED)
|
||||
@ -512,8 +535,9 @@ VOID ScanNextChannel(
|
||||
RTMPSetTimer(&pAd->MlmeAux.ScanTimer, MAX_CHANNEL_TIME);
|
||||
}
|
||||
|
||||
if ((ScanType == SCAN_ACTIVE) || (ScanType == FAST_SCAN_ACTIVE) ||
|
||||
(ScanType == SCAN_CISCO_ACTIVE))
|
||||
if ((ScanType == SCAN_ACTIVE)
|
||||
|| (ScanType == FAST_SCAN_ACTIVE)
|
||||
)
|
||||
{
|
||||
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
|
||||
if (NStatus != NDIS_STATUS_SUCCESS)
|
||||
|
@ -25,7 +25,7 @@
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_tkip.c
|
||||
cmm_tkip.c
|
||||
|
||||
Abstract:
|
||||
|
||||
@ -35,7 +35,7 @@
|
||||
Paul Wu 02-25-02 Initial
|
||||
*/
|
||||
|
||||
#include "../rt_config.h"
|
||||
#include "../rt_config.h"
|
||||
|
||||
// Rotation functions on 32 bit values
|
||||
#define ROL32( A, n ) \
|
||||
@ -114,74 +114,6 @@ UINT Tkip_Sbox_Upper[256] =
|
||||
0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
|
||||
};
|
||||
|
||||
/*****************************/
|
||||
/******** SBOX Table *********/
|
||||
/*****************************/
|
||||
|
||||
UCHAR SboxTable[256] =
|
||||
{
|
||||
0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
|
||||
0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
|
||||
0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
|
||||
0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
|
||||
0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
|
||||
0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
|
||||
0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
|
||||
0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
|
||||
0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
|
||||
0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
|
||||
0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
|
||||
0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
|
||||
0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
|
||||
0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
|
||||
0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
|
||||
0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
|
||||
0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
|
||||
0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
|
||||
0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
|
||||
0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
|
||||
0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
|
||||
0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
|
||||
0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
|
||||
0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
|
||||
0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
|
||||
0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
|
||||
0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
|
||||
0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
|
||||
0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
|
||||
0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
|
||||
0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
|
||||
0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
|
||||
};
|
||||
|
||||
VOID xor_32(
|
||||
IN PUCHAR a,
|
||||
IN PUCHAR b,
|
||||
OUT PUCHAR out);
|
||||
|
||||
VOID xor_128(
|
||||
IN PUCHAR a,
|
||||
IN PUCHAR b,
|
||||
OUT PUCHAR out);
|
||||
|
||||
VOID next_key(
|
||||
IN PUCHAR key,
|
||||
IN INT round);
|
||||
|
||||
VOID byte_sub(
|
||||
IN PUCHAR in,
|
||||
OUT PUCHAR out);
|
||||
|
||||
VOID shift_row(
|
||||
IN PUCHAR in,
|
||||
OUT PUCHAR out);
|
||||
|
||||
VOID mix_column(
|
||||
IN PUCHAR in,
|
||||
OUT PUCHAR out);
|
||||
|
||||
UCHAR RTMPCkipSbox(
|
||||
IN UCHAR a);
|
||||
//
|
||||
// Expanded IV for TKIP function.
|
||||
//
|
||||
@ -330,7 +262,7 @@ VOID RTMPTkipSetMICKey(
|
||||
*/
|
||||
VOID RTMPTkipAppendByte(
|
||||
IN PTKIP_KEY_INFO pTkip,
|
||||
IN UCHAR uChar)
|
||||
IN UCHAR uChar)
|
||||
{
|
||||
// Append the byte to our word-sized buffer
|
||||
pTkip->M |= (uChar << (8* pTkip->nBytesInM));
|
||||
@ -464,6 +396,7 @@ VOID RTMPInitTkipEngine(
|
||||
tkipIv.IV16.field.rc2 = *pTSC;
|
||||
tkipIv.IV16.field.CONTROL.field.ExtIV = 1; // 0: non-extended IV, 1: an extended IV
|
||||
tkipIv.IV16.field.CONTROL.field.KeyID = KeyId;
|
||||
// tkipIv.IV32 = *(PULONG)(pTSC + 2);
|
||||
NdisMoveMemory(&tkipIv.IV32, (pTSC + 2), 4); // Copy IV
|
||||
|
||||
*pIV16 = tkipIv.IV16.word;
|
||||
@ -577,75 +510,6 @@ BOOLEAN RTMPTkipCompareMICValue(
|
||||
return (TRUE);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Compare MIC value of received MSDU
|
||||
|
||||
Arguments:
|
||||
pAd Pointer to our adapter
|
||||
pLLC LLC header
|
||||
pSrc Pointer to the received Plain text data
|
||||
pDA Pointer to DA address
|
||||
pSA Pointer to SA address
|
||||
pMICKey pointer to MIC Key
|
||||
Len the length of the received plain text data exclude MIC value
|
||||
|
||||
Return Value:
|
||||
TRUE MIC value matched
|
||||
FALSE MIC value mismatched
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPTkipCompareMICValueWithLLC(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pLLC,
|
||||
IN PUCHAR pSrc,
|
||||
IN PUCHAR pDA,
|
||||
IN PUCHAR pSA,
|
||||
IN PUCHAR pMICKey,
|
||||
IN UINT Len)
|
||||
{
|
||||
UCHAR OldMic[8];
|
||||
ULONG Priority = 0;
|
||||
|
||||
// Init MIC value calculation
|
||||
RTMPTkipSetMICKey(&pAd->PrivateInfo.Rx, pMICKey);
|
||||
// DA
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pDA, MAC_ADDR_LEN);
|
||||
// SA
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSA, MAC_ADDR_LEN);
|
||||
// Priority + 3 bytes of 0
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, (PUCHAR)&Priority, 4);
|
||||
|
||||
// Start with LLC header
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pLLC, 8);
|
||||
|
||||
// Calculate MIC value from plain text data
|
||||
RTMPTkipAppend(&pAd->PrivateInfo.Rx, pSrc, Len);
|
||||
|
||||
// Get MIC valude from received frame
|
||||
NdisMoveMemory(OldMic, pSrc + Len, 8);
|
||||
|
||||
// Get MIC value from decrypted plain data
|
||||
RTMPTkipGetMIC(&pAd->PrivateInfo.Rx);
|
||||
|
||||
// Move MIC value from MSDU, this steps should move to data path.
|
||||
// Since the MIC value might cross MPDUs.
|
||||
if(!NdisEqualMemory(pAd->PrivateInfo.Rx.MIC, OldMic, 8))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("RTMPTkipCompareMICValueWithLLC(): TKIP MIC Error !\n")); //MIC error.
|
||||
|
||||
|
||||
return (FALSE);
|
||||
}
|
||||
return (TRUE);
|
||||
}
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
@ -865,209 +729,6 @@ VOID RTMPTkipMixKey(
|
||||
}
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* construct_mic_header1() */
|
||||
/* Builds the first MIC header block from */
|
||||
/* header fields. */
|
||||
/************************************************/
|
||||
|
||||
void construct_mic_header1(
|
||||
unsigned char *mic_header1,
|
||||
int header_length,
|
||||
unsigned char *mpdu)
|
||||
{
|
||||
mic_header1[0] = (unsigned char)((header_length - 2) / 256);
|
||||
mic_header1[1] = (unsigned char)((header_length - 2) % 256);
|
||||
mic_header1[2] = mpdu[0] & 0xcf; /* Mute CF poll & CF ack bits */
|
||||
mic_header1[3] = mpdu[1] & 0xc7; /* Mute retry, more data and pwr mgt bits */
|
||||
mic_header1[4] = mpdu[4]; /* A1 */
|
||||
mic_header1[5] = mpdu[5];
|
||||
mic_header1[6] = mpdu[6];
|
||||
mic_header1[7] = mpdu[7];
|
||||
mic_header1[8] = mpdu[8];
|
||||
mic_header1[9] = mpdu[9];
|
||||
mic_header1[10] = mpdu[10]; /* A2 */
|
||||
mic_header1[11] = mpdu[11];
|
||||
mic_header1[12] = mpdu[12];
|
||||
mic_header1[13] = mpdu[13];
|
||||
mic_header1[14] = mpdu[14];
|
||||
mic_header1[15] = mpdu[15];
|
||||
}
|
||||
|
||||
/************************************************/
|
||||
/* construct_mic_header2() */
|
||||
/* Builds the last MIC header block from */
|
||||
/* header fields. */
|
||||
/************************************************/
|
||||
|
||||
void construct_mic_header2(
|
||||
unsigned char *mic_header2,
|
||||
unsigned char *mpdu,
|
||||
int a4_exists,
|
||||
int qc_exists)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0; i<16; i++) mic_header2[i]=0x00;
|
||||
|
||||
mic_header2[0] = mpdu[16]; /* A3 */
|
||||
mic_header2[1] = mpdu[17];
|
||||
mic_header2[2] = mpdu[18];
|
||||
mic_header2[3] = mpdu[19];
|
||||
mic_header2[4] = mpdu[20];
|
||||
mic_header2[5] = mpdu[21];
|
||||
|
||||
// In Sequence Control field, mute sequence numer bits (12-bit)
|
||||
mic_header2[6] = mpdu[22] & 0x0f; /* SC */
|
||||
mic_header2[7] = 0x00; /* mpdu[23]; */
|
||||
|
||||
if ((!qc_exists) & a4_exists)
|
||||
{
|
||||
for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */
|
||||
|
||||
}
|
||||
|
||||
if (qc_exists && (!a4_exists))
|
||||
{
|
||||
mic_header2[8] = mpdu[24] & 0x0f; /* mute bits 15 - 4 */
|
||||
mic_header2[9] = mpdu[25] & 0x00;
|
||||
}
|
||||
|
||||
if (qc_exists && a4_exists)
|
||||
{
|
||||
for (i=0;i<6;i++) mic_header2[8+i] = mpdu[24+i]; /* A4 */
|
||||
|
||||
mic_header2[14] = mpdu[30] & 0x0f;
|
||||
mic_header2[15] = mpdu[31] & 0x00;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/************************************************/
|
||||
/* construct_mic_iv() */
|
||||
/* Builds the MIC IV from header fields and PN */
|
||||
/************************************************/
|
||||
|
||||
void construct_mic_iv(
|
||||
unsigned char *mic_iv,
|
||||
int qc_exists,
|
||||
int a4_exists,
|
||||
unsigned char *mpdu,
|
||||
unsigned int payload_length,
|
||||
unsigned char *pn_vector)
|
||||
{
|
||||
int i;
|
||||
|
||||
mic_iv[0] = 0x59;
|
||||
if (qc_exists && a4_exists)
|
||||
mic_iv[1] = mpdu[30] & 0x0f; /* QoS_TC */
|
||||
if (qc_exists && !a4_exists)
|
||||
mic_iv[1] = mpdu[24] & 0x0f; /* mute bits 7-4 */
|
||||
if (!qc_exists)
|
||||
mic_iv[1] = 0x00;
|
||||
for (i = 2; i < 8; i++)
|
||||
mic_iv[i] = mpdu[i + 8]; /* mic_iv[2:7] = A2[0:5] = mpdu[10:15] */
|
||||
#ifdef CONSISTENT_PN_ORDER
|
||||
for (i = 8; i < 14; i++)
|
||||
mic_iv[i] = pn_vector[i - 8]; /* mic_iv[8:13] = PN[0:5] */
|
||||
#else
|
||||
for (i = 8; i < 14; i++)
|
||||
mic_iv[i] = pn_vector[13 - i]; /* mic_iv[8:13] = PN[5:0] */
|
||||
#endif
|
||||
i = (payload_length / 256);
|
||||
i = (payload_length % 256);
|
||||
mic_iv[14] = (unsigned char) (payload_length / 256);
|
||||
mic_iv[15] = (unsigned char) (payload_length % 256);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/************************************/
|
||||
/* bitwise_xor() */
|
||||
/* A 128 bit, bitwise exclusive or */
|
||||
/************************************/
|
||||
|
||||
void bitwise_xor(unsigned char *ina, unsigned char *inb, unsigned char *out)
|
||||
{
|
||||
int i;
|
||||
for (i=0; i<16; i++)
|
||||
{
|
||||
out[i] = ina[i] ^ inb[i];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void aes128k128d(unsigned char *key, unsigned char *data, unsigned char *ciphertext)
|
||||
{
|
||||
int round;
|
||||
int i;
|
||||
unsigned char intermediatea[16];
|
||||
unsigned char intermediateb[16];
|
||||
unsigned char round_key[16];
|
||||
|
||||
for(i=0; i<16; i++) round_key[i] = key[i];
|
||||
|
||||
for (round = 0; round < 11; round++)
|
||||
{
|
||||
if (round == 0)
|
||||
{
|
||||
xor_128(round_key, data, ciphertext);
|
||||
next_key(round_key, round);
|
||||
}
|
||||
else if (round == 10)
|
||||
{
|
||||
byte_sub(ciphertext, intermediatea);
|
||||
shift_row(intermediatea, intermediateb);
|
||||
xor_128(intermediateb, round_key, ciphertext);
|
||||
}
|
||||
else /* 1 - 9 */
|
||||
{
|
||||
byte_sub(ciphertext, intermediatea);
|
||||
shift_row(intermediatea, intermediateb);
|
||||
mix_column(&intermediateb[0], &intermediatea[0]);
|
||||
mix_column(&intermediateb[4], &intermediatea[4]);
|
||||
mix_column(&intermediateb[8], &intermediatea[8]);
|
||||
mix_column(&intermediateb[12], &intermediatea[12]);
|
||||
xor_128(intermediatea, round_key, ciphertext);
|
||||
next_key(round_key, round);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void construct_ctr_preload(
|
||||
unsigned char *ctr_preload,
|
||||
int a4_exists,
|
||||
int qc_exists,
|
||||
unsigned char *mpdu,
|
||||
unsigned char *pn_vector,
|
||||
int c)
|
||||
{
|
||||
|
||||
int i = 0;
|
||||
for (i=0; i<16; i++) ctr_preload[i] = 0x00;
|
||||
i = 0;
|
||||
|
||||
ctr_preload[0] = 0x01; /* flag */
|
||||
if (qc_exists && a4_exists) ctr_preload[1] = mpdu[30] & 0x0f; /* QoC_Control */
|
||||
if (qc_exists && !a4_exists) ctr_preload[1] = mpdu[24] & 0x0f;
|
||||
|
||||
for (i = 2; i < 8; i++)
|
||||
ctr_preload[i] = mpdu[i + 8]; /* ctr_preload[2:7] = A2[0:5] = mpdu[10:15] */
|
||||
#ifdef CONSISTENT_PN_ORDER
|
||||
for (i = 8; i < 14; i++)
|
||||
ctr_preload[i] = pn_vector[i - 8]; /* ctr_preload[8:13] = PN[0:5] */
|
||||
#else
|
||||
for (i = 8; i < 14; i++)
|
||||
ctr_preload[i] = pn_vector[13 - i]; /* ctr_preload[8:13] = PN[5:0] */
|
||||
#endif
|
||||
ctr_preload[14] = (unsigned char) (c / 256); // Ctr
|
||||
ctr_preload[15] = (unsigned char) (c % 256);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// TRUE: Success!
|
||||
// FALSE: Decrypt Error!
|
||||
@ -1102,12 +763,13 @@ BOOLEAN RTMPSoftDecryptTKIP(
|
||||
ULONG pnh;/* Most significant 32 bits of PN */
|
||||
UINT num_blocks;
|
||||
UINT payload_remainder;
|
||||
ARCFOURCONTEXT ArcFourContext;
|
||||
ARCFOURCONTEXT ArcFourContext;
|
||||
UINT crc32 = 0;
|
||||
UINT trailfcs = 0;
|
||||
UCHAR MIC[8];
|
||||
UCHAR TrailMIC[8];
|
||||
|
||||
|
||||
fc0 = *pData;
|
||||
fc1 = *(pData + 1);
|
||||
|
||||
@ -1211,376 +873,10 @@ BOOLEAN RTMPSoftDecryptTKIP(
|
||||
if (!NdisEqualMemory(MIC, TrailMIC, 8))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("RTMPSoftDecryptTKIP, WEP Data MIC Error !\n")); //MIC error.
|
||||
//RTMPReportMicError(pAd, &pWpaKey[KeyID]); // marked by AlbertY @ 20060630
|
||||
return (FALSE);
|
||||
}
|
||||
|
||||
//DBGPRINT(RT_DEBUG_TRACE, "RTMPSoftDecryptTKIP Decript done!!\n");
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
BOOLEAN RTMPSoftDecryptAES(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pData,
|
||||
IN ULONG DataByteCnt,
|
||||
IN PCIPHER_KEY pWpaKey)
|
||||
{
|
||||
UCHAR KeyID;
|
||||
UINT HeaderLen;
|
||||
UCHAR PN[6];
|
||||
UINT payload_len;
|
||||
UINT num_blocks;
|
||||
UINT payload_remainder;
|
||||
USHORT fc;
|
||||
UCHAR fc0;
|
||||
UCHAR fc1;
|
||||
UINT frame_type;
|
||||
UINT frame_subtype;
|
||||
UINT from_ds;
|
||||
UINT to_ds;
|
||||
INT a4_exists;
|
||||
INT qc_exists;
|
||||
UCHAR aes_out[16];
|
||||
int payload_index;
|
||||
UINT i;
|
||||
UCHAR ctr_preload[16];
|
||||
UCHAR chain_buffer[16];
|
||||
UCHAR padded_buffer[16];
|
||||
UCHAR mic_iv[16];
|
||||
UCHAR mic_header1[16];
|
||||
UCHAR mic_header2[16];
|
||||
UCHAR MIC[8];
|
||||
UCHAR TrailMIC[8];
|
||||
|
||||
fc0 = *pData;
|
||||
fc1 = *(pData + 1);
|
||||
|
||||
fc = *((PUSHORT)pData);
|
||||
|
||||
frame_type = ((fc0 >> 2) & 0x03);
|
||||
frame_subtype = ((fc0 >> 4) & 0x0f);
|
||||
|
||||
from_ds = (fc1 & 0x2) >> 1;
|
||||
to_ds = (fc1 & 0x1);
|
||||
|
||||
a4_exists = (from_ds & to_ds);
|
||||
qc_exists = ((frame_subtype == 0x08) || /* Assumed QoS subtypes */
|
||||
(frame_subtype == 0x09) || /* Likely to change. */
|
||||
(frame_subtype == 0x0a) ||
|
||||
(frame_subtype == 0x0b)
|
||||
);
|
||||
|
||||
HeaderLen = 24;
|
||||
if (a4_exists)
|
||||
HeaderLen += 6;
|
||||
|
||||
KeyID = *((PUCHAR)(pData+ HeaderLen + 3));
|
||||
KeyID = KeyID >> 6;
|
||||
|
||||
if (pWpaKey[KeyID].KeyLen == 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RTMPSoftDecryptAES failed!(KeyID[%d] Length can not be 0)\n", KeyID));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
PN[0] = *(pData+ HeaderLen);
|
||||
PN[1] = *(pData+ HeaderLen + 1);
|
||||
PN[2] = *(pData+ HeaderLen + 4);
|
||||
PN[3] = *(pData+ HeaderLen + 5);
|
||||
PN[4] = *(pData+ HeaderLen + 6);
|
||||
PN[5] = *(pData+ HeaderLen + 7);
|
||||
|
||||
payload_len = DataByteCnt - HeaderLen - 8 - 8; // 8 bytes for CCMP header , 8 bytes for MIC
|
||||
payload_remainder = (payload_len) % 16;
|
||||
num_blocks = (payload_len) / 16;
|
||||
|
||||
|
||||
|
||||
// Find start of payload
|
||||
payload_index = HeaderLen + 8; //IV+EIV
|
||||
|
||||
for (i=0; i< num_blocks; i++)
|
||||
{
|
||||
construct_ctr_preload(ctr_preload,
|
||||
a4_exists,
|
||||
qc_exists,
|
||||
pData,
|
||||
PN,
|
||||
i+1 );
|
||||
|
||||
aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
|
||||
|
||||
bitwise_xor(aes_out, pData + payload_index, chain_buffer);
|
||||
NdisMoveMemory(pData + payload_index - 8, chain_buffer, 16);
|
||||
payload_index += 16;
|
||||
}
|
||||
|
||||
//
|
||||
// If there is a short final block, then pad it
|
||||
// encrypt it and copy the unpadded part back
|
||||
//
|
||||
if (payload_remainder > 0)
|
||||
{
|
||||
construct_ctr_preload(ctr_preload,
|
||||
a4_exists,
|
||||
qc_exists,
|
||||
pData,
|
||||
PN,
|
||||
num_blocks + 1);
|
||||
|
||||
NdisZeroMemory(padded_buffer, 16);
|
||||
NdisMoveMemory(padded_buffer, pData + payload_index, payload_remainder);
|
||||
|
||||
aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
|
||||
|
||||
bitwise_xor(aes_out, padded_buffer, chain_buffer);
|
||||
NdisMoveMemory(pData + payload_index - 8, chain_buffer, payload_remainder);
|
||||
payload_index += payload_remainder;
|
||||
}
|
||||
|
||||
//
|
||||
// Descrypt the MIC
|
||||
//
|
||||
construct_ctr_preload(ctr_preload,
|
||||
a4_exists,
|
||||
qc_exists,
|
||||
pData,
|
||||
PN,
|
||||
0);
|
||||
NdisZeroMemory(padded_buffer, 16);
|
||||
NdisMoveMemory(padded_buffer, pData + payload_index, 8);
|
||||
|
||||
aes128k128d(pWpaKey[KeyID].Key, ctr_preload, aes_out);
|
||||
|
||||
bitwise_xor(aes_out, padded_buffer, chain_buffer);
|
||||
|
||||
NdisMoveMemory(TrailMIC, chain_buffer, 8);
|
||||
|
||||
//
|
||||
// Calculate MIC
|
||||
//
|
||||
|
||||
//Force the protected frame bit on
|
||||
*(pData + 1) = *(pData + 1) | 0x40;
|
||||
|
||||
// Find start of payload
|
||||
// Because the CCMP header has been removed
|
||||
payload_index = HeaderLen;
|
||||
|
||||
construct_mic_iv(
|
||||
mic_iv,
|
||||
qc_exists,
|
||||
a4_exists,
|
||||
pData,
|
||||
payload_len,
|
||||
PN);
|
||||
|
||||
construct_mic_header1(
|
||||
mic_header1,
|
||||
HeaderLen,
|
||||
pData);
|
||||
|
||||
construct_mic_header2(
|
||||
mic_header2,
|
||||
pData,
|
||||
a4_exists,
|
||||
qc_exists);
|
||||
|
||||
aes128k128d(pWpaKey[KeyID].Key, mic_iv, aes_out);
|
||||
bitwise_xor(aes_out, mic_header1, chain_buffer);
|
||||
aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
|
||||
bitwise_xor(aes_out, mic_header2, chain_buffer);
|
||||
aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
|
||||
|
||||
// iterate through each 16 byte payload block
|
||||
for (i = 0; i < num_blocks; i++)
|
||||
{
|
||||
bitwise_xor(aes_out, pData + payload_index, chain_buffer);
|
||||
payload_index += 16;
|
||||
aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
|
||||
}
|
||||
|
||||
// Add on the final payload block if it needs padding
|
||||
if (payload_remainder > 0)
|
||||
{
|
||||
NdisZeroMemory(padded_buffer, 16);
|
||||
NdisMoveMemory(padded_buffer, pData + payload_index, payload_remainder);
|
||||
|
||||
bitwise_xor(aes_out, padded_buffer, chain_buffer);
|
||||
aes128k128d(pWpaKey[KeyID].Key, chain_buffer, aes_out);
|
||||
}
|
||||
// aes_out contains padded mic, discard most significant
|
||||
// 8 bytes to generate 64 bit MIC
|
||||
for (i = 0 ; i < 8; i++) MIC[i] = aes_out[i];
|
||||
|
||||
if (!NdisEqualMemory(MIC, TrailMIC, 8))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("RTMPSoftDecryptAES, MIC Error !\n")); //MIC error.
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/****************************************/
|
||||
/* aes128k128d() */
|
||||
/* Performs a 128 bit AES encrypt with */
|
||||
/* 128 bit data. */
|
||||
/****************************************/
|
||||
VOID xor_128(
|
||||
IN PUCHAR a,
|
||||
IN PUCHAR b,
|
||||
OUT PUCHAR out)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i=0;i<16; i++)
|
||||
{
|
||||
out[i] = a[i] ^ b[i];
|
||||
}
|
||||
}
|
||||
|
||||
VOID next_key(
|
||||
IN PUCHAR key,
|
||||
IN INT round)
|
||||
{
|
||||
UCHAR rcon;
|
||||
UCHAR sbox_key[4];
|
||||
UCHAR rcon_table[12] =
|
||||
{
|
||||
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
|
||||
0x1b, 0x36, 0x36, 0x36
|
||||
};
|
||||
|
||||
sbox_key[0] = RTMPCkipSbox(key[13]);
|
||||
sbox_key[1] = RTMPCkipSbox(key[14]);
|
||||
sbox_key[2] = RTMPCkipSbox(key[15]);
|
||||
sbox_key[3] = RTMPCkipSbox(key[12]);
|
||||
|
||||
rcon = rcon_table[round];
|
||||
|
||||
xor_32(&key[0], sbox_key, &key[0]);
|
||||
key[0] = key[0] ^ rcon;
|
||||
|
||||
xor_32(&key[4], &key[0], &key[4]);
|
||||
xor_32(&key[8], &key[4], &key[8]);
|
||||
xor_32(&key[12], &key[8], &key[12]);
|
||||
}
|
||||
|
||||
VOID xor_32(
|
||||
IN PUCHAR a,
|
||||
IN PUCHAR b,
|
||||
OUT PUCHAR out)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i=0;i<4; i++)
|
||||
{
|
||||
out[i] = a[i] ^ b[i];
|
||||
}
|
||||
}
|
||||
|
||||
VOID byte_sub(
|
||||
IN PUCHAR in,
|
||||
OUT PUCHAR out)
|
||||
{
|
||||
INT i;
|
||||
|
||||
for (i=0; i< 16; i++)
|
||||
{
|
||||
out[i] = RTMPCkipSbox(in[i]);
|
||||
}
|
||||
}
|
||||
|
||||
UCHAR RTMPCkipSbox(
|
||||
IN UCHAR a)
|
||||
{
|
||||
return SboxTable[(int)a];
|
||||
}
|
||||
|
||||
VOID shift_row(
|
||||
IN PUCHAR in,
|
||||
OUT PUCHAR out)
|
||||
{
|
||||
out[0] = in[0];
|
||||
out[1] = in[5];
|
||||
out[2] = in[10];
|
||||
out[3] = in[15];
|
||||
out[4] = in[4];
|
||||
out[5] = in[9];
|
||||
out[6] = in[14];
|
||||
out[7] = in[3];
|
||||
out[8] = in[8];
|
||||
out[9] = in[13];
|
||||
out[10] = in[2];
|
||||
out[11] = in[7];
|
||||
out[12] = in[12];
|
||||
out[13] = in[1];
|
||||
out[14] = in[6];
|
||||
out[15] = in[11];
|
||||
}
|
||||
|
||||
VOID mix_column(
|
||||
IN PUCHAR in,
|
||||
OUT PUCHAR out)
|
||||
{
|
||||
INT i;
|
||||
UCHAR add1b[4];
|
||||
UCHAR add1bf7[4];
|
||||
UCHAR rotl[4];
|
||||
UCHAR swap_halfs[4];
|
||||
UCHAR andf7[4];
|
||||
UCHAR rotr[4];
|
||||
UCHAR temp[4];
|
||||
UCHAR tempb[4];
|
||||
|
||||
for (i=0 ; i<4; i++)
|
||||
{
|
||||
if ((in[i] & 0x80)== 0x80)
|
||||
add1b[i] = 0x1b;
|
||||
else
|
||||
add1b[i] = 0x00;
|
||||
}
|
||||
|
||||
swap_halfs[0] = in[2]; /* Swap halfs */
|
||||
swap_halfs[1] = in[3];
|
||||
swap_halfs[2] = in[0];
|
||||
swap_halfs[3] = in[1];
|
||||
|
||||
rotl[0] = in[3]; /* Rotate left 8 bits */
|
||||
rotl[1] = in[0];
|
||||
rotl[2] = in[1];
|
||||
rotl[3] = in[2];
|
||||
|
||||
andf7[0] = in[0] & 0x7f;
|
||||
andf7[1] = in[1] & 0x7f;
|
||||
andf7[2] = in[2] & 0x7f;
|
||||
andf7[3] = in[3] & 0x7f;
|
||||
|
||||
for (i = 3; i>0; i--) /* logical shift left 1 bit */
|
||||
{
|
||||
andf7[i] = andf7[i] << 1;
|
||||
if ((andf7[i-1] & 0x80) == 0x80)
|
||||
{
|
||||
andf7[i] = (andf7[i] | 0x01);
|
||||
}
|
||||
}
|
||||
andf7[0] = andf7[0] << 1;
|
||||
andf7[0] = andf7[0] & 0xfe;
|
||||
|
||||
xor_32(add1b, andf7, add1bf7);
|
||||
|
||||
xor_32(in, add1bf7, rotr);
|
||||
|
||||
temp[0] = rotr[0]; /* Rotate right 8 bits */
|
||||
rotr[0] = rotr[1];
|
||||
rotr[1] = rotr[2];
|
||||
rotr[2] = rotr[3];
|
||||
rotr[3] = temp[0];
|
||||
|
||||
xor_32(add1bf7, rotr, temp);
|
||||
xor_32(swap_halfs, rotl,tempb);
|
||||
xor_32(temp, tempb, out);
|
||||
}
|
||||
|
@ -35,7 +35,7 @@
|
||||
Paul Wu 10-28-02 Initial
|
||||
*/
|
||||
|
||||
#include "../rt_config.h"
|
||||
#include "../rt_config.h"
|
||||
|
||||
UINT FCSTAB_32[256] =
|
||||
{
|
||||
@ -105,6 +105,15 @@ UINT FCSTAB_32[256] =
|
||||
0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d
|
||||
};
|
||||
|
||||
/*
|
||||
UCHAR WEPKEY[] = {
|
||||
//IV
|
||||
0x00, 0x11, 0x22,
|
||||
//WEP KEY
|
||||
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
|
||||
};
|
||||
*/
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
@ -144,12 +153,6 @@ VOID RTMPInitWepEngine(
|
||||
|
||||
pAd->PrivateInfo.FCSCRC32 = PPPINITFCS32; //Init crc32.
|
||||
|
||||
if (pAd->StaCfg.bCkipOn && (pAd->StaCfg.CkipFlag & 0x10) && (pAd->OpMode == OPMODE_STA))
|
||||
{
|
||||
ARCFOUR_INIT(&pAd->PrivateInfo.WEPCONTEXT, pKey, KeyLen); //INIT SBOX, KEYLEN+3(IV)
|
||||
NdisMoveMemory(pDest, pKey, 3); //Append Init Vector
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(WEPKEY + 3, pKey, KeyLen);
|
||||
|
||||
@ -215,7 +218,7 @@ VOID RTMPEncryptData(
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RTMPSoftDecryptWEP(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pData,
|
||||
IN ULONG DataByteCnt,
|
||||
IN PCIPHER_KEY pGroupKey)
|
||||
@ -229,7 +232,7 @@ BOOLEAN RTMPSoftDecryptWEP(
|
||||
//WEP KEY
|
||||
0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xAA, 0xBB, 0xCC
|
||||
};
|
||||
UCHAR *pPayload = (UCHAR *)pData + LENGTH_802_11;
|
||||
UCHAR *pPayload = (UCHAR *)pData + LENGTH_802_11;
|
||||
ULONG payload_len = DataByteCnt - LENGTH_802_11;
|
||||
|
||||
NdisMoveMemory(WEPKEY, pPayload, 3); //Get WEP IV
|
||||
@ -494,4 +497,3 @@ VOID RTMPSetICV(
|
||||
|
||||
ARCFOUR_ENCRYPT(&pAd->PrivateInfo.WEPCONTEXT, pDest, (PUCHAR) &pAd->PrivateInfo.FCSCRC32, 4);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
194
drivers/staging/rt2860/common/crypt_hmac.c
Normal file
194
drivers/staging/rt2860/common/crypt_hmac.c
Normal file
@ -0,0 +1,194 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#include "../crypt_hmac.h"
|
||||
|
||||
|
||||
#ifdef HMAC_SHA1_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
HMAC using SHA1 hash function
|
||||
|
||||
Arguments:
|
||||
key Secret key
|
||||
key_len The length of the key in bytes
|
||||
message Message context
|
||||
message_len The length of message in bytes
|
||||
macLen Request the length of message authentication code
|
||||
|
||||
Return Value:
|
||||
mac Message authentication code
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID HMAC_SHA1 (
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen)
|
||||
{
|
||||
SHA1_CTX_STRUC sha_ctx1;
|
||||
SHA1_CTX_STRUC sha_ctx2;
|
||||
UINT8 K0[SHA1_BLOCK_SIZE];
|
||||
UINT8 Digest[SHA1_DIGEST_SIZE];
|
||||
UINT index;
|
||||
|
||||
NdisZeroMemory(&sha_ctx1, sizeof(SHA1_CTX_STRUC));
|
||||
NdisZeroMemory(&sha_ctx2, sizeof(SHA1_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, SHA1_BLOCK_SIZE);
|
||||
if (KeyLen <= SHA1_BLOCK_SIZE)
|
||||
NdisMoveMemory(K0, Key, KeyLen);
|
||||
else
|
||||
RT_SHA1(Key, KeyLen, K0);
|
||||
/* End of if */
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x¡¦36¡¦ repeated B times. */
|
||||
for (index = 0; index < SHA1_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
/* End of for */
|
||||
|
||||
RT_SHA1_Init(&sha_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
SHA1_Append(&sha_ctx1, K0, sizeof(K0));
|
||||
/* H((K0^ipad)||text) */
|
||||
SHA1_Append(&sha_ctx1, Message, MessageLen);
|
||||
SHA1_End(&sha_ctx1, Digest);
|
||||
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x¡¦5c¡¦ repeated B times. */
|
||||
for (index = 0; index < SHA1_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
/* End of for */
|
||||
|
||||
RT_SHA1_Init(&sha_ctx2);
|
||||
/* H(K0^opad) */
|
||||
SHA1_Append(&sha_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
SHA1_Append(&sha_ctx2, Digest, SHA1_DIGEST_SIZE);
|
||||
SHA1_End(&sha_ctx2, Digest);
|
||||
|
||||
if (MACLen > SHA1_DIGEST_SIZE)
|
||||
NdisMoveMemory(MAC, Digest, SHA1_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(MAC, Digest, MACLen);
|
||||
} /* End of HMAC_SHA1 */
|
||||
#endif /* HMAC_SHA1_SUPPORT */
|
||||
|
||||
#ifdef HMAC_MD5_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
HMAC using MD5 hash function
|
||||
|
||||
Arguments:
|
||||
key Secret key
|
||||
key_len The length of the key in bytes
|
||||
message Message context
|
||||
message_len The length of message in bytes
|
||||
macLen Request the length of message authentication code
|
||||
|
||||
Return Value:
|
||||
mac Message authentication code
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID HMAC_MD5(
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen)
|
||||
{
|
||||
MD5_CTX_STRUC md5_ctx1;
|
||||
MD5_CTX_STRUC md5_ctx2;
|
||||
UINT8 K0[MD5_BLOCK_SIZE];
|
||||
UINT8 Digest[MD5_DIGEST_SIZE];
|
||||
UINT index;
|
||||
|
||||
NdisZeroMemory(&md5_ctx1, sizeof(MD5_CTX_STRUC));
|
||||
NdisZeroMemory(&md5_ctx2, sizeof(MD5_CTX_STRUC));
|
||||
/*
|
||||
* If the length of K = B(Block size): K0 = K.
|
||||
* If the length of K > B: hash K to obtain an L byte string,
|
||||
* then append (B-L) zeros to create a B-byte string K0 (i.e., K0 = H(K) || 00...00).
|
||||
* If the length of K < B: append zeros to the end of K to create a B-byte string K0
|
||||
*/
|
||||
NdisZeroMemory(K0, MD5_BLOCK_SIZE);
|
||||
if (KeyLen <= MD5_BLOCK_SIZE) {
|
||||
NdisMoveMemory(K0, Key, KeyLen);
|
||||
} else {
|
||||
RT_MD5(Key, KeyLen, K0);
|
||||
}
|
||||
|
||||
/* Exclusive-Or K0 with ipad */
|
||||
/* ipad: Inner pad; the byte x¡¦36¡¦ repeated B times. */
|
||||
for (index = 0; index < MD5_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36;
|
||||
/* End of for */
|
||||
|
||||
MD5_Init(&md5_ctx1);
|
||||
/* H(K0^ipad) */
|
||||
MD5_Append(&md5_ctx1, K0, sizeof(K0));
|
||||
/* H((K0^ipad)||text) */
|
||||
MD5_Append(&md5_ctx1, Message, MessageLen);
|
||||
MD5_End(&md5_ctx1, Digest);
|
||||
|
||||
/* Exclusive-Or K0 with opad and remove ipad */
|
||||
/* opad: Outer pad; the byte x¡¦5c¡¦ repeated B times. */
|
||||
for (index = 0; index < MD5_BLOCK_SIZE; index++)
|
||||
K0[index] ^= 0x36^0x5c;
|
||||
/* End of for */
|
||||
|
||||
MD5_Init(&md5_ctx2);
|
||||
/* H(K0^opad) */
|
||||
MD5_Append(&md5_ctx2, K0, sizeof(K0));
|
||||
/* H( (K0^opad) || H((K0^ipad)||text) ) */
|
||||
MD5_Append(&md5_ctx2, Digest, MD5_DIGEST_SIZE);
|
||||
MD5_End(&md5_ctx2, Digest);
|
||||
|
||||
if (MACLen > MD5_DIGEST_SIZE)
|
||||
NdisMoveMemory(MAC, Digest, MD5_DIGEST_SIZE);
|
||||
else
|
||||
NdisMoveMemory(MAC, Digest, MACLen);
|
||||
} /* End of HMAC_SHA256 */
|
||||
#endif /* HMAC_MD5_SUPPORT */
|
||||
|
||||
/* End of crypt_hmac.c */
|
352
drivers/staging/rt2860/common/crypt_md5.c
Normal file
352
drivers/staging/rt2860/common/crypt_md5.c
Normal file
@ -0,0 +1,352 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#include "../crypt_md5.h"
|
||||
|
||||
#ifdef MD5_SUPPORT
|
||||
/*
|
||||
* F, G, H and I are basic MD5 functions.
|
||||
*/
|
||||
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
|
||||
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
|
||||
#define H(x, y, z) ((x) ^ (y) ^ (z))
|
||||
#define I(x, y, z) ((y) ^ ((x) | (~z)))
|
||||
|
||||
#define ROTL(x,n,w) ((x << n) | (x >> (w - n)))
|
||||
#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */
|
||||
|
||||
#define ROUND1(a, b, c, d, x, s, ac) { \
|
||||
(a) += F((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define ROUND2(a, b, c, d, x, s, ac) { \
|
||||
(a) += G((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define ROUND3(a, b, c, d, x, s, ac) { \
|
||||
(a) += H((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
#define ROUND4(a, b, c, d, x, s, ac) { \
|
||||
(a) += I((b),(c),(d)) + (x) + (UINT32)(ac); \
|
||||
(a) = ROTL32((a),(s)); \
|
||||
(a) += (b); \
|
||||
}
|
||||
static const UINT32 MD5_DefaultHashValue[4] = {
|
||||
0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL
|
||||
};
|
||||
#endif /* MD5_SUPPORT */
|
||||
|
||||
|
||||
#ifdef MD5_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial Md5_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to Md5_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID MD5_Init (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX)
|
||||
{
|
||||
NdisMoveMemory(pMD5_CTX->HashValue, MD5_DefaultHashValue,
|
||||
sizeof(MD5_DefaultHashValue));
|
||||
NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);
|
||||
pMD5_CTX->BlockLen = 0;
|
||||
pMD5_CTX->MessageLen = 0;
|
||||
} /* End of MD5_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
MD5 computation for one block (512 bits)
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to Md5_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
T[i] := floor(abs(sin(i + 1)) * (2 pow 32)), i is number of round
|
||||
========================================================================
|
||||
*/
|
||||
VOID MD5_Hash (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX)
|
||||
{
|
||||
UINT32 X_i;
|
||||
UINT32 X[16];
|
||||
UINT32 a,b,c,d;
|
||||
|
||||
/* Prepare the message schedule, {X_i} */
|
||||
NdisMoveMemory(X, pMD5_CTX->Block, MD5_BLOCK_SIZE);
|
||||
for (X_i = 0; X_i < 16; X_i++)
|
||||
X[X_i] = cpu2le32(X[X_i]); /* Endian Swap */
|
||||
/* End of for */
|
||||
|
||||
/* MD5 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pMD5_CTX->HashValue[0];
|
||||
b = pMD5_CTX->HashValue[1];
|
||||
c = pMD5_CTX->HashValue[2];
|
||||
d = pMD5_CTX->HashValue[3];
|
||||
|
||||
/*
|
||||
* Round 1
|
||||
* Let [abcd k s i] denote the operation
|
||||
* a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND1(a, b, c, d, X[ 0], 7, 0xd76aa478); /* 1 */
|
||||
ROUND1(d, a, b, c, X[ 1], 12, 0xe8c7b756); /* 2 */
|
||||
ROUND1(c, d, a, b, X[ 2], 17, 0x242070db); /* 3 */
|
||||
ROUND1(b, c, d, a, X[ 3], 22, 0xc1bdceee); /* 4 */
|
||||
ROUND1(a, b, c, d, X[ 4], 7, 0xf57c0faf); /* 5 */
|
||||
ROUND1(d, a, b, c, X[ 5], 12, 0x4787c62a); /* 6 */
|
||||
ROUND1(c, d, a, b, X[ 6], 17, 0xa8304613); /* 7 */
|
||||
ROUND1(b, c, d, a, X[ 7], 22, 0xfd469501); /* 8 */
|
||||
ROUND1(a, b, c, d, X[ 8], 7, 0x698098d8); /* 9 */
|
||||
ROUND1(d, a, b, c, X[ 9], 12, 0x8b44f7af); /* 10 */
|
||||
ROUND1(c, d, a, b, X[10], 17, 0xffff5bb1); /* 11 */
|
||||
ROUND1(b, c, d, a, X[11], 22, 0x895cd7be); /* 12 */
|
||||
ROUND1(a, b, c, d, X[12], 7, 0x6b901122); /* 13 */
|
||||
ROUND1(d, a, b, c, X[13], 12, 0xfd987193); /* 14 */
|
||||
ROUND1(c, d, a, b, X[14], 17, 0xa679438e); /* 15 */
|
||||
ROUND1(b, c, d, a, X[15], 22, 0x49b40821); /* 16 */
|
||||
|
||||
/*
|
||||
* Round 2
|
||||
* Let [abcd k s i] denote the operation
|
||||
* a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND2(a, b, c, d, X[ 1], 5, 0xf61e2562); /* 17 */
|
||||
ROUND2(d, a, b, c, X[ 6], 9, 0xc040b340); /* 18 */
|
||||
ROUND2(c, d, a, b, X[11], 14, 0x265e5a51); /* 19 */
|
||||
ROUND2(b, c, d, a, X[ 0], 20, 0xe9b6c7aa); /* 20 */
|
||||
ROUND2(a, b, c, d, X[ 5], 5, 0xd62f105d); /* 21 */
|
||||
ROUND2(d, a, b, c, X[10], 9, 0x2441453); /* 22 */
|
||||
ROUND2(c, d, a, b, X[15], 14, 0xd8a1e681); /* 23 */
|
||||
ROUND2(b, c, d, a, X[ 4], 20, 0xe7d3fbc8); /* 24 */
|
||||
ROUND2(a, b, c, d, X[ 9], 5, 0x21e1cde6); /* 25 */
|
||||
ROUND2(d, a, b, c, X[14], 9, 0xc33707d6); /* 26 */
|
||||
ROUND2(c, d, a, b, X[ 3], 14, 0xf4d50d87); /* 27 */
|
||||
ROUND2(b, c, d, a, X[ 8], 20, 0x455a14ed); /* 28 */
|
||||
ROUND2(a, b, c, d, X[13], 5, 0xa9e3e905); /* 29 */
|
||||
ROUND2(d, a, b, c, X[ 2], 9, 0xfcefa3f8); /* 30 */
|
||||
ROUND2(c, d, a, b, X[ 7], 14, 0x676f02d9); /* 31 */
|
||||
ROUND2(b, c, d, a, X[12], 20, 0x8d2a4c8a); /* 32 */
|
||||
|
||||
/*
|
||||
* Round 3
|
||||
* Let [abcd k s t] denote the operation
|
||||
* a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND3(a, b, c, d, X[ 5], 4, 0xfffa3942); /* 33 */
|
||||
ROUND3(d, a, b, c, X[ 8], 11, 0x8771f681); /* 34 */
|
||||
ROUND3(c, d, a, b, X[11], 16, 0x6d9d6122); /* 35 */
|
||||
ROUND3(b, c, d, a, X[14], 23, 0xfde5380c); /* 36 */
|
||||
ROUND3(a, b, c, d, X[ 1], 4, 0xa4beea44); /* 37 */
|
||||
ROUND3(d, a, b, c, X[ 4], 11, 0x4bdecfa9); /* 38 */
|
||||
ROUND3(c, d, a, b, X[ 7], 16, 0xf6bb4b60); /* 39 */
|
||||
ROUND3(b, c, d, a, X[10], 23, 0xbebfbc70); /* 40 */
|
||||
ROUND3(a, b, c, d, X[13], 4, 0x289b7ec6); /* 41 */
|
||||
ROUND3(d, a, b, c, X[ 0], 11, 0xeaa127fa); /* 42 */
|
||||
ROUND3(c, d, a, b, X[ 3], 16, 0xd4ef3085); /* 43 */
|
||||
ROUND3(b, c, d, a, X[ 6], 23, 0x4881d05); /* 44 */
|
||||
ROUND3(a, b, c, d, X[ 9], 4, 0xd9d4d039); /* 45 */
|
||||
ROUND3(d, a, b, c, X[12], 11, 0xe6db99e5); /* 46 */
|
||||
ROUND3(c, d, a, b, X[15], 16, 0x1fa27cf8); /* 47 */
|
||||
ROUND3(b, c, d, a, X[ 2], 23, 0xc4ac5665); /* 48 */
|
||||
|
||||
/*
|
||||
* Round 4
|
||||
* Let [abcd k s t] denote the operation
|
||||
* a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s)
|
||||
*/
|
||||
ROUND4(a, b, c, d, X[ 0], 6, 0xf4292244); /* 49 */
|
||||
ROUND4(d, a, b, c, X[ 7], 10, 0x432aff97); /* 50 */
|
||||
ROUND4(c, d, a, b, X[14], 15, 0xab9423a7); /* 51 */
|
||||
ROUND4(b, c, d, a, X[ 5], 21, 0xfc93a039); /* 52 */
|
||||
ROUND4(a, b, c, d, X[12], 6, 0x655b59c3); /* 53 */
|
||||
ROUND4(d, a, b, c, X[ 3], 10, 0x8f0ccc92); /* 54 */
|
||||
ROUND4(c, d, a, b, X[10], 15, 0xffeff47d); /* 55 */
|
||||
ROUND4(b, c, d, a, X[ 1], 21, 0x85845dd1); /* 56 */
|
||||
ROUND4(a, b, c, d, X[ 8], 6, 0x6fa87e4f); /* 57 */
|
||||
ROUND4(d, a, b, c, X[15], 10, 0xfe2ce6e0); /* 58 */
|
||||
ROUND4(c, d, a, b, X[ 6], 15, 0xa3014314); /* 59 */
|
||||
ROUND4(b, c, d, a, X[13], 21, 0x4e0811a1); /* 60 */
|
||||
ROUND4(a, b, c, d, X[ 4], 6, 0xf7537e82); /* 61 */
|
||||
ROUND4(d, a, b, c, X[11], 10, 0xbd3af235); /* 62 */
|
||||
ROUND4(c, d, a, b, X[ 2], 15, 0x2ad7d2bb); /* 63 */
|
||||
ROUND4(b, c, d, a, X[ 9], 21, 0xeb86d391); /* 64 */
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pMD5_CTX->HashValue[0] += a;
|
||||
pMD5_CTX->HashValue[1] += b;
|
||||
pMD5_CTX->HashValue[2] += c;
|
||||
pMD5_CTX->HashValue[3] += d;
|
||||
|
||||
NdisZeroMemory(pMD5_CTX->Block, MD5_BLOCK_SIZE);
|
||||
pMD5_CTX->BlockLen = 0;
|
||||
} /* End of MD5_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 64 bytes, the MD5_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to MD5_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID MD5_Append (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
if ((pMD5_CTX->BlockLen + diffLen) < MD5_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pMD5_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen,
|
||||
Message + appendLen, MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);
|
||||
appendLen += (MD5_BLOCK_SIZE - pMD5_CTX->BlockLen);
|
||||
pMD5_CTX->BlockLen = MD5_BLOCK_SIZE;
|
||||
MD5_Hash(pMD5_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
pMD5_CTX->MessageLen += MessageLen;
|
||||
} /* End of MD5_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 64 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pMD5_CTX Pointer to MD5_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID MD5_End (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
|
||||
/* append 1 bits to end of the message */
|
||||
NdisFillMemory(pMD5_CTX->Block + pMD5_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
|
||||
if (pMD5_CTX->BlockLen > 55)
|
||||
MD5_Hash(pMD5_CTX);
|
||||
/* End of if */
|
||||
|
||||
/* Append the length of message in rightmost 64 bits */
|
||||
message_length_bits = pMD5_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2le64(message_length_bits);
|
||||
NdisMoveMemory(&pMD5_CTX->Block[56], &message_length_bits, 8);
|
||||
MD5_Hash(pMD5_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT32 hash value to bytes */
|
||||
for (index = 0; index < 4;index++)
|
||||
pMD5_CTX->HashValue[index] = cpu2le32(pMD5_CTX->HashValue[index]);
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pMD5_CTX->HashValue, MD5_DIGEST_SIZE);
|
||||
} /* End of MD5_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
MD5 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_MD5 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
MD5_CTX_STRUC md5_ctx;
|
||||
|
||||
NdisZeroMemory(&md5_ctx, sizeof(MD5_CTX_STRUC));
|
||||
MD5_Init(&md5_ctx);
|
||||
MD5_Append(&md5_ctx, Message, MessageLen);
|
||||
MD5_End(&md5_ctx, DigestMessage);
|
||||
} /* End of RT_MD5 */
|
||||
|
||||
#endif /* MD5_SUPPORT */
|
||||
|
||||
/* End of crypt_md5.c */
|
535
drivers/staging/rt2860/common/crypt_sha2.c
Normal file
535
drivers/staging/rt2860/common/crypt_sha2.c
Normal file
@ -0,0 +1,535 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#include "../crypt_sha2.h"
|
||||
|
||||
/* Basic operations */
|
||||
#define SHR(x,n) (x >> n) /* SHR(x)^n, right shift n bits , x is w-bit word, 0 <= n <= w */
|
||||
#define ROTR(x,n,w) ((x >> n) | (x << (w - n))) /* ROTR(x)^n, circular right shift n bits , x is w-bit word, 0 <= n <= w */
|
||||
#define ROTL(x,n,w) ((x << n) | (x >> (w - n))) /* ROTL(x)^n, circular left shift n bits , x is w-bit word, 0 <= n <= w */
|
||||
#define ROTR32(x,n) ROTR(x,n,32) /* 32 bits word */
|
||||
#define ROTL32(x,n) ROTL(x,n,32) /* 32 bits word */
|
||||
|
||||
/* Basic functions */
|
||||
#define Ch(x,y,z) ((x & y) ^ ((~x) & z))
|
||||
#define Maj(x,y,z) ((x & y) ^ (x & z) ^ (y & z))
|
||||
#define Parity(x,y,z) (x ^ y ^ z)
|
||||
|
||||
#ifdef SHA1_SUPPORT
|
||||
/* SHA1 constants */
|
||||
#define SHA1_MASK 0x0000000f
|
||||
static const UINT32 SHA1_K[4] = {
|
||||
0x5a827999UL, 0x6ed9eba1UL, 0x8f1bbcdcUL, 0xca62c1d6UL
|
||||
};
|
||||
static const UINT32 SHA1_DefaultHashValue[5] = {
|
||||
0x67452301UL, 0xefcdab89UL, 0x98badcfeUL, 0x10325476UL, 0xc3d2e1f0UL
|
||||
};
|
||||
#endif /* SHA1_SUPPORT */
|
||||
|
||||
|
||||
#ifdef SHA256_SUPPORT
|
||||
/* SHA256 functions */
|
||||
#define Zsigma_256_0(x) (ROTR32(x,2) ^ ROTR32(x,13) ^ ROTR32(x,22))
|
||||
#define Zsigma_256_1(x) (ROTR32(x,6) ^ ROTR32(x,11) ^ ROTR32(x,25))
|
||||
#define Sigma_256_0(x) (ROTR32(x,7) ^ ROTR32(x,18) ^ SHR(x,3))
|
||||
#define Sigma_256_1(x) (ROTR32(x,17) ^ ROTR32(x,19) ^ SHR(x,10))
|
||||
/* SHA256 constants */
|
||||
static const UINT32 SHA256_K[64] = {
|
||||
0x428a2f98UL, 0x71374491UL, 0xb5c0fbcfUL, 0xe9b5dba5UL,
|
||||
0x3956c25bUL, 0x59f111f1UL, 0x923f82a4UL, 0xab1c5ed5UL,
|
||||
0xd807aa98UL, 0x12835b01UL, 0x243185beUL, 0x550c7dc3UL,
|
||||
0x72be5d74UL, 0x80deb1feUL, 0x9bdc06a7UL, 0xc19bf174UL,
|
||||
0xe49b69c1UL, 0xefbe4786UL, 0x0fc19dc6UL, 0x240ca1ccUL,
|
||||
0x2de92c6fUL, 0x4a7484aaUL, 0x5cb0a9dcUL, 0x76f988daUL,
|
||||
0x983e5152UL, 0xa831c66dUL, 0xb00327c8UL, 0xbf597fc7UL,
|
||||
0xc6e00bf3UL, 0xd5a79147UL, 0x06ca6351UL, 0x14292967UL,
|
||||
0x27b70a85UL, 0x2e1b2138UL, 0x4d2c6dfcUL, 0x53380d13UL,
|
||||
0x650a7354UL, 0x766a0abbUL, 0x81c2c92eUL, 0x92722c85UL,
|
||||
0xa2bfe8a1UL, 0xa81a664bUL, 0xc24b8b70UL, 0xc76c51a3UL,
|
||||
0xd192e819UL, 0xd6990624UL, 0xf40e3585UL, 0x106aa070UL,
|
||||
0x19a4c116UL, 0x1e376c08UL, 0x2748774cUL, 0x34b0bcb5UL,
|
||||
0x391c0cb3UL, 0x4ed8aa4aUL, 0x5b9cca4fUL, 0x682e6ff3UL,
|
||||
0x748f82eeUL, 0x78a5636fUL, 0x84c87814UL, 0x8cc70208UL,
|
||||
0x90befffaUL, 0xa4506cebUL, 0xbef9a3f7UL, 0xc67178f2UL
|
||||
};
|
||||
static const UINT32 SHA256_DefaultHashValue[8] = {
|
||||
0x6a09e667UL, 0xbb67ae85UL, 0x3c6ef372UL, 0xa54ff53aUL,
|
||||
0x510e527fUL, 0x9b05688cUL, 0x1f83d9abUL, 0x5be0cd19UL
|
||||
};
|
||||
#endif /* SHA256_SUPPORT */
|
||||
|
||||
|
||||
#ifdef SHA1_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial SHA1_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1_Init (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->HashValue, SHA1_DefaultHashValue,
|
||||
sizeof(SHA1_DefaultHashValue));
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);
|
||||
pSHA_CTX->MessageLen = 0;
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of RT_SHA1_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA1 computation for one block (512 bits)
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA1_Hash (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
UINT32 W_i,t,s;
|
||||
UINT32 W[16];
|
||||
UINT32 a,b,c,d,e,T,f_t = 0;
|
||||
|
||||
/* Prepare the message schedule, {W_i}, 0 < t < 15 */
|
||||
NdisMoveMemory(W, pSHA_CTX->Block, SHA1_BLOCK_SIZE);
|
||||
for (W_i = 0; W_i < 16; W_i++)
|
||||
W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */
|
||||
/* End of for */
|
||||
|
||||
/* SHA256 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pSHA_CTX->HashValue[0];
|
||||
b = pSHA_CTX->HashValue[1];
|
||||
c = pSHA_CTX->HashValue[2];
|
||||
d = pSHA_CTX->HashValue[3];
|
||||
e = pSHA_CTX->HashValue[4];
|
||||
|
||||
/* 80 rounds */
|
||||
for (t = 0;t < 80;t++) {
|
||||
s = t & SHA1_MASK;
|
||||
if (t > 15) { /* Prepare the message schedule, {W_i}, 16 < t < 79 */
|
||||
W[s] = (W[(s+13) & SHA1_MASK]) ^ (W[(s+8) & SHA1_MASK]) ^ (W[(s+2) & SHA1_MASK]) ^ W[s];
|
||||
W[s] = ROTL32(W[s],1);
|
||||
} /* End of if */
|
||||
switch (t / 20) {
|
||||
case 0:
|
||||
f_t = Ch(b,c,d);
|
||||
break;
|
||||
case 1:
|
||||
f_t = Parity(b,c,d);
|
||||
break;
|
||||
case 2:
|
||||
f_t = Maj(b,c,d);
|
||||
break;
|
||||
case 3:
|
||||
f_t = Parity(b,c,d);
|
||||
break;
|
||||
} /* End of switch */
|
||||
T = ROTL32(a,5) + f_t + e + SHA1_K[t / 20] + W[s];
|
||||
e = d;
|
||||
d = c;
|
||||
c = ROTL32(b,30);
|
||||
b = a;
|
||||
a = T;
|
||||
} /* End of for */
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pSHA_CTX->HashValue[0] += a;
|
||||
pSHA_CTX->HashValue[1] += b;
|
||||
pSHA_CTX->HashValue[2] += c;
|
||||
pSHA_CTX->HashValue[3] += d;
|
||||
pSHA_CTX->HashValue[4] += e;
|
||||
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA1_BLOCK_SIZE);
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of SHA1_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 64 bytes, the SHA1_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA1_Append (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
if ((pSHA_CTX->BlockLen + diffLen) < SHA1_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pSHA_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
appendLen += (SHA1_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
pSHA_CTX->BlockLen = SHA1_BLOCK_SIZE;
|
||||
SHA1_Hash(pSHA_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
pSHA_CTX->MessageLen += MessageLen;
|
||||
} /* End of SHA1_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 64 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA1_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA1_End (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
|
||||
/* Append bit 1 to end of the message */
|
||||
NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
|
||||
if (pSHA_CTX->BlockLen > 55)
|
||||
SHA1_Hash(pSHA_CTX);
|
||||
/* End of if */
|
||||
|
||||
/* Append the length of message in rightmost 64 bits */
|
||||
message_length_bits = pSHA_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2be64(message_length_bits);
|
||||
NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);
|
||||
SHA1_Hash(pSHA_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT32 hash value to bytes */
|
||||
for (index = 0; index < 5;index++)
|
||||
pSHA_CTX->HashValue[index] = cpu2be32(pSHA_CTX->HashValue[index]);
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA1_DIGEST_SIZE);
|
||||
} /* End of SHA1_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA1 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA1 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
|
||||
SHA1_CTX_STRUC sha_ctx;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA1_CTX_STRUC));
|
||||
RT_SHA1_Init(&sha_ctx);
|
||||
SHA1_Append(&sha_ctx, Message, MessageLen);
|
||||
SHA1_End(&sha_ctx, DigestMessage);
|
||||
} /* End of RT_SHA1 */
|
||||
#endif /* SHA1_SUPPORT */
|
||||
|
||||
|
||||
#ifdef SHA256_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Initial SHA256_CTX_STRUC
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA256_Init (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->HashValue, SHA256_DefaultHashValue,
|
||||
sizeof(SHA256_DefaultHashValue));
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE);
|
||||
pSHA_CTX->MessageLen = 0;
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of SHA256_Init */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA256 computation for one block (512 bits)
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA256_Hash (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX)
|
||||
{
|
||||
UINT32 W_i,t;
|
||||
UINT32 W[64];
|
||||
UINT32 a,b,c,d,e,f,g,h,T1,T2;
|
||||
|
||||
/* Prepare the message schedule, {W_i}, 0 < t < 15 */
|
||||
NdisMoveMemory(W, pSHA_CTX->Block, SHA256_BLOCK_SIZE);
|
||||
for (W_i = 0; W_i < 16; W_i++)
|
||||
W[W_i] = cpu2be32(W[W_i]); /* Endian Swap */
|
||||
/* End of for */
|
||||
|
||||
/* SHA256 hash computation */
|
||||
/* Initialize the working variables */
|
||||
a = pSHA_CTX->HashValue[0];
|
||||
b = pSHA_CTX->HashValue[1];
|
||||
c = pSHA_CTX->HashValue[2];
|
||||
d = pSHA_CTX->HashValue[3];
|
||||
e = pSHA_CTX->HashValue[4];
|
||||
f = pSHA_CTX->HashValue[5];
|
||||
g = pSHA_CTX->HashValue[6];
|
||||
h = pSHA_CTX->HashValue[7];
|
||||
|
||||
/* 64 rounds */
|
||||
for (t = 0;t < 64;t++) {
|
||||
if (t > 15) /* Prepare the message schedule, {W_i}, 16 < t < 63 */
|
||||
W[t] = Sigma_256_1(W[t-2]) + W[t-7] + Sigma_256_0(W[t-15]) + W[t-16];
|
||||
/* End of if */
|
||||
T1 = h + Zsigma_256_1(e) + Ch(e,f,g) + SHA256_K[t] + W[t];
|
||||
T2 = Zsigma_256_0(a) + Maj(a,b,c);
|
||||
h = g;
|
||||
g = f;
|
||||
f = e;
|
||||
e = d + T1;
|
||||
d = c;
|
||||
c = b;
|
||||
b = a;
|
||||
a = T1 + T2;
|
||||
} /* End of for */
|
||||
|
||||
/* Compute the i^th intermediate hash value H^(i) */
|
||||
pSHA_CTX->HashValue[0] += a;
|
||||
pSHA_CTX->HashValue[1] += b;
|
||||
pSHA_CTX->HashValue[2] += c;
|
||||
pSHA_CTX->HashValue[3] += d;
|
||||
pSHA_CTX->HashValue[4] += e;
|
||||
pSHA_CTX->HashValue[5] += f;
|
||||
pSHA_CTX->HashValue[6] += g;
|
||||
pSHA_CTX->HashValue[7] += h;
|
||||
|
||||
NdisZeroMemory(pSHA_CTX->Block, SHA256_BLOCK_SIZE);
|
||||
pSHA_CTX->BlockLen = 0;
|
||||
} /* End of SHA256_Hash */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
The message is appended to block. If block size > 64 bytes, the SHA256_Hash
|
||||
will be called.
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA256_Append (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen)
|
||||
{
|
||||
UINT appendLen = 0;
|
||||
UINT diffLen = 0;
|
||||
|
||||
while (appendLen != MessageLen) {
|
||||
diffLen = MessageLen - appendLen;
|
||||
if ((pSHA_CTX->BlockLen + diffLen) < SHA256_BLOCK_SIZE) {
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, diffLen);
|
||||
pSHA_CTX->BlockLen += diffLen;
|
||||
appendLen += diffLen;
|
||||
}
|
||||
else
|
||||
{
|
||||
NdisMoveMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen,
|
||||
Message + appendLen, SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
appendLen += (SHA256_BLOCK_SIZE - pSHA_CTX->BlockLen);
|
||||
pSHA_CTX->BlockLen = SHA256_BLOCK_SIZE;
|
||||
SHA256_Hash(pSHA_CTX);
|
||||
} /* End of if */
|
||||
} /* End of while */
|
||||
pSHA_CTX->MessageLen += MessageLen;
|
||||
} /* End of SHA256_Append */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
1. Append bit 1 to end of the message
|
||||
2. Append the length of message in rightmost 64 bits
|
||||
3. Transform the Hash Value to digest message
|
||||
|
||||
Arguments:
|
||||
pSHA_CTX Pointer to SHA256_CTX_STRUC
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID SHA256_End (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
UINT index;
|
||||
UINT64 message_length_bits;
|
||||
|
||||
/* Append bit 1 to end of the message */
|
||||
NdisFillMemory(pSHA_CTX->Block + pSHA_CTX->BlockLen, 1, 0x80);
|
||||
|
||||
/* 55 = 64 - 8 - 1: append 1 bit(1 byte) and message length (8 bytes) */
|
||||
if (pSHA_CTX->BlockLen > 55)
|
||||
SHA256_Hash(pSHA_CTX);
|
||||
/* End of if */
|
||||
|
||||
/* Append the length of message in rightmost 64 bits */
|
||||
message_length_bits = pSHA_CTX->MessageLen*8;
|
||||
message_length_bits = cpu2be64(message_length_bits);
|
||||
NdisMoveMemory(&pSHA_CTX->Block[56], &message_length_bits, 8);
|
||||
SHA256_Hash(pSHA_CTX);
|
||||
|
||||
/* Return message digest, transform the UINT32 hash value to bytes */
|
||||
for (index = 0; index < 8;index++)
|
||||
pSHA_CTX->HashValue[index] = cpu2be32(pSHA_CTX->HashValue[index]);
|
||||
/* End of for */
|
||||
NdisMoveMemory(DigestMessage, pSHA_CTX->HashValue, SHA256_DIGEST_SIZE);
|
||||
} /* End of SHA256_End */
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
SHA256 algorithm
|
||||
|
||||
Arguments:
|
||||
message Message context
|
||||
messageLen The length of message in bytes
|
||||
|
||||
Return Value:
|
||||
digestMessage Digest message
|
||||
|
||||
Note:
|
||||
None
|
||||
========================================================================
|
||||
*/
|
||||
VOID RT_SHA256 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[])
|
||||
{
|
||||
SHA256_CTX_STRUC sha_ctx;
|
||||
|
||||
NdisZeroMemory(&sha_ctx, sizeof(SHA256_CTX_STRUC));
|
||||
SHA256_Init(&sha_ctx);
|
||||
SHA256_Append(&sha_ctx, Message, MessageLen);
|
||||
SHA256_End(&sha_ctx, DigestMessage);
|
||||
} /* End of RT_SHA256 */
|
||||
#endif /* SHA256_SUPPORT */
|
||||
|
||||
/* End of crypt_sha2.c */
|
@ -33,7 +33,6 @@
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Fonchi 03-12-2007 created
|
||||
*/
|
||||
|
||||
#include "../rt_config.h"
|
||||
@ -46,10 +45,15 @@ typedef struct _RADAR_DURATION_TABLE
|
||||
} RADAR_DURATION_TABLE, *PRADAR_DURATION_TABLE;
|
||||
|
||||
|
||||
static UCHAR RdIdleTimeTable[MAX_RD_REGION][4] =
|
||||
|
||||
UCHAR RdIdleTimeTable[MAX_RD_REGION][4] =
|
||||
{
|
||||
{9, 250, 250, 250}, // CE
|
||||
#ifdef DFS_FCC_BW40_FIX
|
||||
{1, 250, 250, 250}, // FCC
|
||||
#else
|
||||
{4, 250, 250, 250}, // FCC
|
||||
#endif
|
||||
{4, 250, 250, 250}, // JAP
|
||||
{15, 250, 250, 250}, // JAP_W53
|
||||
{4, 250, 250, 250} // JAP_W56
|
||||
@ -80,11 +84,32 @@ VOID BbpRadarDetectionStart(
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 124, 0x28);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, 125, 0xff);
|
||||
|
||||
#ifdef MERGE_ARCH_TEAM
|
||||
if ((pAd->CommonCfg.RadarDetect.RDDurRegion == JAP) || (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W53) || (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W56))
|
||||
{
|
||||
pAd->CommonCfg.RadarDetect.RDDurRegion = JAP;
|
||||
pAd->CommonCfg.RadarDetect.RDDurRegion = JapRadarType(pAd);
|
||||
if (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W56)
|
||||
{
|
||||
pAd->CommonCfg.RadarDetect.DfsSessionTime = 13;
|
||||
}
|
||||
else if (pAd->CommonCfg.RadarDetect.RDDurRegion == JAP_W53)
|
||||
{
|
||||
pAd->CommonCfg.RadarDetect.DfsSessionTime = 15;
|
||||
}
|
||||
}
|
||||
#endif // MERGE_ARCH_TEAM //
|
||||
|
||||
RadarPeriod = ((UINT)RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + (UINT)pAd->CommonCfg.RadarDetect.DfsSessionTime) < 250 ?
|
||||
(RdIdleTimeTable[pAd->CommonCfg.RadarDetect.RDDurRegion][0] + pAd->CommonCfg.RadarDetect.DfsSessionTime) : 250;
|
||||
|
||||
#ifdef MERGE_ARCH_TEAM
|
||||
|
||||
|
||||
#else // Original RT28xx source code.
|
||||
RTMP_IO_WRITE8(pAd, 0x7020, 0x1d);
|
||||
RTMP_IO_WRITE8(pAd, 0x7021, 0x40);
|
||||
#endif // MERGE_ARCH_TEAM //
|
||||
|
||||
RadarDetectionStart(pAd, 0, RadarPeriod);
|
||||
return;
|
||||
@ -143,6 +168,17 @@ VOID RadarDetectionStart(
|
||||
CtsProtect = 0x03;
|
||||
break;
|
||||
|
||||
case JAP:
|
||||
{
|
||||
UCHAR RDDurRegion;
|
||||
RDDurRegion = JapRadarType(pAd);
|
||||
if (RDDurRegion == JAP_W56)
|
||||
CtsProtect = 0x03;
|
||||
else
|
||||
CtsProtect = 0x02;
|
||||
break;
|
||||
}
|
||||
|
||||
case CE:
|
||||
case JAP_W53:
|
||||
default:
|
||||
@ -210,7 +246,6 @@ BOOLEAN RadarChannelCheck(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Ch)
|
||||
{
|
||||
#if 1
|
||||
INT i;
|
||||
BOOLEAN result = FALSE;
|
||||
|
||||
@ -224,23 +259,6 @@ BOOLEAN RadarChannelCheck(
|
||||
}
|
||||
|
||||
return result;
|
||||
#else
|
||||
INT i;
|
||||
UCHAR Channel[15]={52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140};
|
||||
|
||||
for (i=0; i<15; i++)
|
||||
{
|
||||
if (Ch == Channel[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i != 15)
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
ULONG JapRadarType(
|
||||
@ -399,11 +417,11 @@ VOID RadarDetectPeriodic(
|
||||
*/
|
||||
INT Set_ChMovingTime_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg)
|
||||
IN PSTRING arg)
|
||||
{
|
||||
UINT8 Value;
|
||||
|
||||
Value = simple_strtol(arg, 0, 10);
|
||||
Value = (UINT8) simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->CommonCfg.RadarDetect.ChMovingTime = Value;
|
||||
|
||||
@ -415,11 +433,11 @@ INT Set_ChMovingTime_Proc(
|
||||
|
||||
INT Set_LongPulseRadarTh_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg)
|
||||
IN PSTRING arg)
|
||||
{
|
||||
UINT8 Value;
|
||||
|
||||
Value = simple_strtol(arg, 0, 10) > 10 ? 10 : simple_strtol(arg, 0, 10);
|
||||
Value = (UINT8) simple_strtol(arg, 0, 10) > 10 ? 10 : simple_strtol(arg, 0, 10);
|
||||
|
||||
pAd->CommonCfg.RadarDetect.LongPulseRadarTh = Value;
|
||||
|
||||
|
1525
drivers/staging/rt2860/common/ee_efuse.c
Normal file
1525
drivers/staging/rt2860/common/ee_efuse.c
Normal file
File diff suppressed because it is too large
Load Diff
270
drivers/staging/rt2860/common/ee_prom.c
Normal file
270
drivers/staging/rt2860/common/ee_prom.c
Normal file
@ -0,0 +1,270 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
ee_prom.c
|
||||
|
||||
Abstract:
|
||||
Miniport generic portion header file
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
|
||||
// IRQL = PASSIVE_LEVEL
|
||||
static inline VOID RaiseClock(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 *x)
|
||||
{
|
||||
*x = *x | EESK;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);
|
||||
RTMPusecDelay(1); // Max frequency = 1MHz in Spec. definition
|
||||
}
|
||||
|
||||
// IRQL = PASSIVE_LEVEL
|
||||
static inline VOID LowerClock(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT32 *x)
|
||||
{
|
||||
*x = *x & ~EESK;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, *x);
|
||||
RTMPusecDelay(1);
|
||||
}
|
||||
|
||||
// IRQL = PASSIVE_LEVEL
|
||||
static inline USHORT ShiftInBits(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 x,i;
|
||||
USHORT data=0;
|
||||
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
|
||||
x &= ~( EEDO | EEDI);
|
||||
|
||||
for(i=0; i<16; i++)
|
||||
{
|
||||
data = data << 1;
|
||||
RaiseClock(pAd, &x);
|
||||
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
LowerClock(pAd, &x); //prevent read failed
|
||||
|
||||
x &= ~(EEDI);
|
||||
if(x & EEDO)
|
||||
data |= 1;
|
||||
}
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
// IRQL = PASSIVE_LEVEL
|
||||
static inline VOID ShiftOutBits(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT data,
|
||||
IN USHORT count)
|
||||
{
|
||||
UINT32 x,mask;
|
||||
|
||||
mask = 0x01 << (count - 1);
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
|
||||
x &= ~(EEDO | EEDI);
|
||||
|
||||
do
|
||||
{
|
||||
x &= ~EEDI;
|
||||
if(data & mask) x |= EEDI;
|
||||
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
|
||||
RaiseClock(pAd, &x);
|
||||
LowerClock(pAd, &x);
|
||||
|
||||
mask = mask >> 1;
|
||||
} while(mask);
|
||||
|
||||
x &= ~EEDI;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
}
|
||||
|
||||
|
||||
// IRQL = PASSIVE_LEVEL
|
||||
static inline VOID EEpromCleanup(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 x;
|
||||
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
|
||||
x &= ~(EECS | EEDI);
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
|
||||
RaiseClock(pAd, &x);
|
||||
LowerClock(pAd, &x);
|
||||
}
|
||||
|
||||
|
||||
static inline VOID EWEN(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 x;
|
||||
|
||||
// reset bits and set EECS
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
x &= ~(EEDI | EEDO | EESK);
|
||||
x |= EECS;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
|
||||
// kick a pulse
|
||||
RaiseClock(pAd, &x);
|
||||
LowerClock(pAd, &x);
|
||||
|
||||
// output the read_opcode and six pulse in that order
|
||||
ShiftOutBits(pAd, EEPROM_EWEN_OPCODE, 5);
|
||||
ShiftOutBits(pAd, 0, 6);
|
||||
|
||||
EEpromCleanup(pAd);
|
||||
}
|
||||
|
||||
|
||||
static inline VOID EWDS(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
UINT32 x;
|
||||
|
||||
// reset bits and set EECS
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
x &= ~(EEDI | EEDO | EESK);
|
||||
x |= EECS;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
|
||||
// kick a pulse
|
||||
RaiseClock(pAd, &x);
|
||||
LowerClock(pAd, &x);
|
||||
|
||||
// output the read_opcode and six pulse in that order
|
||||
ShiftOutBits(pAd, EEPROM_EWDS_OPCODE, 5);
|
||||
ShiftOutBits(pAd, 0, 6);
|
||||
|
||||
EEpromCleanup(pAd);
|
||||
}
|
||||
|
||||
|
||||
// IRQL = PASSIVE_LEVEL
|
||||
int rtmp_ee_prom_read16(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT Offset,
|
||||
OUT USHORT *pValue)
|
||||
{
|
||||
UINT32 x;
|
||||
USHORT data;
|
||||
|
||||
|
||||
Offset /= 2;
|
||||
// reset bits and set EECS
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
x &= ~(EEDI | EEDO | EESK);
|
||||
x |= EECS;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
|
||||
// patch can not access e-Fuse issue
|
||||
if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)))
|
||||
{
|
||||
// kick a pulse
|
||||
RaiseClock(pAd, &x);
|
||||
LowerClock(pAd, &x);
|
||||
}
|
||||
|
||||
// output the read_opcode and register number in that order
|
||||
ShiftOutBits(pAd, EEPROM_READ_OPCODE, 3);
|
||||
ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);
|
||||
|
||||
// Now read the data (16 bits) in from the selected EEPROM word
|
||||
data = ShiftInBits(pAd);
|
||||
|
||||
EEpromCleanup(pAd);
|
||||
|
||||
|
||||
*pValue = data;
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
int rtmp_ee_prom_write16(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT Offset,
|
||||
IN USHORT Data)
|
||||
{
|
||||
UINT32 x;
|
||||
|
||||
|
||||
Offset /= 2;
|
||||
|
||||
EWEN(pAd);
|
||||
|
||||
// reset bits and set EECS
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
x &= ~(EEDI | EEDO | EESK);
|
||||
x |= EECS;
|
||||
RTMP_IO_WRITE32(pAd, E2PROM_CSR, x);
|
||||
|
||||
// patch can not access e-Fuse issue
|
||||
if (!(IS_RT3090(pAd) || IS_RT3572(pAd) || IS_RT3390(pAd)))
|
||||
{
|
||||
// kick a pulse
|
||||
RaiseClock(pAd, &x);
|
||||
LowerClock(pAd, &x);
|
||||
}
|
||||
|
||||
// output the read_opcode ,register number and data in that order
|
||||
ShiftOutBits(pAd, EEPROM_WRITE_OPCODE, 3);
|
||||
ShiftOutBits(pAd, Offset, pAd->EEPROMAddressNum);
|
||||
ShiftOutBits(pAd, Data, 16); // 16-bit access
|
||||
|
||||
// read DO status
|
||||
RTMP_IO_READ32(pAd, E2PROM_CSR, &x);
|
||||
|
||||
EEpromCleanup(pAd);
|
||||
|
||||
RTMPusecDelay(10000); //delay for twp(MAX)=10ms
|
||||
|
||||
EWDS(pAd);
|
||||
|
||||
EEpromCleanup(pAd);
|
||||
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -43,7 +43,7 @@
|
||||
/* AUTO GEN PLEASE DO NOT MODIFY IT */
|
||||
|
||||
|
||||
UCHAR FirmwareImage [] = {
|
||||
UCHAR FirmwareImage_2860 [] = {
|
||||
0x02, 0x03, 0x5e, 0x02, 0x02, 0xb1, 0x22, 0x22, 0xff, 0xff, 0xff, 0x02, 0x01, 0x82, 0xff, 0xff,
|
||||
0xff, 0xff, 0xff, 0x02, 0x00, 0x1e, 0xff, 0xff, 0xff, 0xff, 0xff, 0x02, 0x01, 0x33, 0xc0, 0xe0,
|
||||
0xc0, 0xf0, 0xc0, 0x83, 0xc0, 0x82, 0xc0, 0xd0, 0x75, 0xd0, 0x18, 0xc2, 0xaf, 0x30, 0x45, 0x03,
|
||||
|
517
drivers/staging/rt2860/common/firmware_3070.h
Normal file
517
drivers/staging/rt2860/common/firmware_3070.h
Normal file
@ -0,0 +1,517 @@
|
||||
/* AUTO GEN PLEASE DO NOT MODIFY IT */
|
||||
/* AUTO GEN PLEASE DO NOT MODIFY IT */
|
||||
|
||||
|
||||
UCHAR FirmwareImage_3070 [] = {
|
||||
0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02, 0x10, 0x32, 0x02, 0x10, 0x78, 0x02, 0x13, 0x1f, 0x02,
|
||||
0x13, 0x20, 0x02, 0x13, 0x3f, 0x02, 0x13, 0x44, 0x12, 0x13, 0x40, 0x22, 0x02, 0x17, 0xae, 0x02,
|
||||
0x18, 0xd2, 0x02, 0x14, 0x3d, 0x02, 0x13, 0x78, 0x30, 0x05, 0x06, 0x20, 0x0d, 0x03, 0x12, 0x19,
|
||||
0x95, 0x22, 0x90, 0x01, 0x8c, 0xe0, 0x30, 0xe3, 0x1b, 0xe5, 0x4c, 0x30, 0xe0, 0x04, 0x7f, 0x40,
|
||||
0x80, 0x02, 0x7f, 0x00, 0x90, 0x10, 0x2f, 0xef, 0xf0, 0x90, 0x01, 0x8c, 0x74, 0x08, 0xf0, 0xe4,
|
||||
0x90, 0x01, 0xa7, 0xf0, 0x90, 0x01, 0x8c, 0xe0, 0x30, 0xe0, 0x1c, 0x90, 0x01, 0x80, 0xe0, 0xb4,
|
||||
0x02, 0x15, 0xa3, 0xe0, 0xb4, 0x01, 0x10, 0x90, 0x01, 0x84, 0xe0, 0xb4, 0x81, 0x09, 0x90, 0x01,
|
||||
0x8c, 0x74, 0x01, 0xf0, 0x12, 0x0d, 0xc8, 0x22, 0x90, 0x04, 0x14, 0xe0, 0x20, 0xe7, 0x03, 0x02,
|
||||
0x13, 0x1e, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x56, 0x90, 0x04, 0x04, 0xe0, 0x12, 0x0a, 0x9d, 0x10,
|
||||
0xd9, 0x31, 0x10, 0xbd, 0x36, 0x11, 0x02, 0x50, 0x11, 0x39, 0x51, 0x11, 0x42, 0x52, 0x11, 0x42,
|
||||
0x53, 0x11, 0x42, 0x54, 0x11, 0x83, 0x55, 0x11, 0xd2, 0x56, 0x12, 0x25, 0x70, 0x12, 0x50, 0x71,
|
||||
0x12, 0x7e, 0x72, 0x12, 0xd5, 0x73, 0x12, 0xf6, 0x80, 0x00, 0x00, 0x13, 0x1e, 0x90, 0x70, 0x11,
|
||||
0xe0, 0xf5, 0x3c, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe5, 0x56,
|
||||
0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17, 0x20, 0x02, 0x03, 0x30, 0x03, 0x1d, 0x7d,
|
||||
0x02, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13,
|
||||
0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17, 0x85, 0x56, 0x41, 0xd2,
|
||||
0x02, 0x22, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x0a, 0x0d, 0x90, 0x70, 0x11, 0xe0,
|
||||
0xb4, 0x08, 0x06, 0x75, 0x4e, 0x01, 0x75, 0x4f, 0x84, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff,
|
||||
0xbf, 0x02, 0x12, 0x90, 0x70, 0x11, 0xe0, 0x64, 0x08, 0x60, 0x04, 0xe0, 0xb4, 0x20, 0x06, 0x75,
|
||||
0x4e, 0x03, 0x75, 0x4f, 0x20, 0xe4, 0xf5, 0x27, 0x22, 0x90, 0x70, 0x11, 0xe0, 0x24, 0xff, 0x92,
|
||||
0x47, 0x22, 0x90, 0x04, 0x04, 0xe0, 0x25, 0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90, 0x70, 0x10, 0xe0,
|
||||
0xff, 0x74, 0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0x90, 0x70, 0x11, 0xe0, 0xff, 0x74, 0x48,
|
||||
0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0x90, 0x04, 0x14,
|
||||
0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e,
|
||||
0x02, 0x13, 0x17, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x1d, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x17, 0xe5,
|
||||
0x47, 0x64, 0x09, 0x60, 0x11, 0xe5, 0x47, 0x64, 0x0a, 0x60, 0x0b, 0xe5, 0x47, 0x64, 0x0b, 0x60,
|
||||
0x05, 0xe5, 0x47, 0xb4, 0x0c, 0x08, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x0f, 0xf5, 0x3a, 0xe5, 0x47,
|
||||
0xb4, 0x09, 0x08, 0xe5, 0x3a, 0xb4, 0x03, 0x03, 0xe4, 0xf5, 0x46, 0xe5, 0x47, 0xb4, 0x0a, 0x08,
|
||||
0xe5, 0x3a, 0xb4, 0x01, 0x03, 0xe4, 0xf5, 0x46, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0xd2,
|
||||
0x04, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf4, 0xff, 0x90, 0x70, 0x10, 0xe0, 0x5f, 0xff, 0x90, 0x70,
|
||||
0x11, 0xe0, 0x55, 0x27, 0x4f, 0x90, 0x70, 0x18, 0xf0, 0x90, 0x70, 0x11, 0xe0, 0x90, 0x70, 0x19,
|
||||
0xf0, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0x30, 0x15, 0x03, 0xd2, 0x14, 0x22, 0x90, 0x70,
|
||||
0x18, 0xe0, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e,
|
||||
0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90,
|
||||
0x02, 0x28, 0xef, 0xf0, 0x22, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed,
|
||||
0xf8, 0xe6, 0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0,
|
||||
0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17,
|
||||
0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf5, 0x82, 0x8e, 0x83, 0xe0,
|
||||
0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90,
|
||||
0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17, 0x90, 0x10,
|
||||
0x00, 0xe0, 0xf5, 0x57, 0x90, 0x10, 0x02, 0xe0, 0xf5, 0x58, 0xa3, 0xe0, 0xf5, 0x59, 0xe5, 0x58,
|
||||
0xb4, 0x70, 0x1e, 0xe5, 0x59, 0xb4, 0x30, 0x19, 0x90, 0x05, 0x08, 0xe0, 0x44, 0x01, 0xf0, 0xfd,
|
||||
0x90, 0x05, 0x05, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x04, 0xf0, 0xed, 0x54, 0xfe, 0x90, 0x05, 0x08,
|
||||
0xf0, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x75, 0x3a, 0xff, 0x75, 0x3c, 0xff, 0xad, 0x57, 0xaf, 0x56,
|
||||
0x12, 0x0b, 0x91, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56,
|
||||
0xf4, 0x60, 0x4b, 0x80, 0x42, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x93, 0xe4, 0xfd, 0xaf,
|
||||
0x56, 0x12, 0x0b, 0x91, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5,
|
||||
0x56, 0xf4, 0x60, 0x2a, 0x80, 0x21, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05,
|
||||
0xad, 0x57, 0xaf, 0x56, 0x12, 0x0b, 0x91, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70,
|
||||
0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x60, 0x07, 0x90, 0x70, 0x25, 0xe0, 0x44, 0x01, 0xf0, 0x22, 0x22,
|
||||
0xe5, 0x53, 0x70, 0x1a, 0x30, 0x60, 0x09, 0xb2, 0x4d, 0x30, 0x4d, 0x04, 0x05, 0x46, 0xc2, 0x04,
|
||||
0xe5, 0x4f, 0x45, 0x4e, 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f, 0x70, 0x02, 0x15, 0x4e, 0x22, 0x22,
|
||||
0xc2, 0x42, 0xd3, 0x22, 0x30, 0x14, 0x30, 0x90, 0x70, 0x19, 0xe0, 0x55, 0x27, 0xff, 0x90, 0x70,
|
||||
0x18, 0xe0, 0x4f, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef,
|
||||
0x5e, 0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff,
|
||||
0x90, 0x02, 0x28, 0xef, 0xf0, 0xc2, 0x14, 0x22, 0xc2, 0x4b, 0xc2, 0x4c, 0xe5, 0x44, 0x12, 0x0a,
|
||||
0x9d, 0x13, 0x9a, 0x00, 0x14, 0x28, 0x04, 0x14, 0x24, 0x08, 0x14, 0x04, 0x10, 0x13, 0xae, 0x20,
|
||||
0x13, 0xce, 0x60, 0x13, 0xdf, 0xa0, 0x00, 0x00, 0x14, 0x2a, 0x85, 0x48, 0x43, 0x85, 0x4a, 0x42,
|
||||
0x85, 0x4c, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x60, 0x03, 0x02, 0x14, 0x2a, 0x80, 0x1b, 0xe5, 0x48,
|
||||
0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4c, 0xc4, 0x54,
|
||||
0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x61, 0x53, 0x43, 0x0f, 0x80, 0x5c, 0x85, 0x49,
|
||||
0x43, 0x85, 0x4b, 0x42, 0x85, 0x4d, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x4d, 0x80, 0x1b, 0xe5,
|
||||
0x49, 0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4b, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4,
|
||||
0x54, 0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x30, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x10,
|
||||
0xf5, 0x43, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x04, 0x60, 0x05, 0xe5, 0x47, 0xb4, 0x05, 0x06, 0x43,
|
||||
0x5e, 0x04, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x06, 0x10, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x30,
|
||||
0xf5, 0x43, 0x80, 0x06, 0xd2, 0x4b, 0x80, 0x02, 0xd2, 0x4c, 0xe4, 0xf5, 0x25, 0xe5, 0x42, 0xc4,
|
||||
0x54, 0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f, 0xd2, 0x60, 0x22, 0xd2, 0x15, 0xe5,
|
||||
0x47, 0x24, 0xf5, 0x60, 0x0b, 0x24, 0xcb, 0x60, 0x07, 0x24, 0x40, 0x70, 0x06, 0xc2, 0x15, 0x22,
|
||||
0x12, 0x17, 0x79, 0x12, 0x14, 0x5f, 0xc2, 0x15, 0xc2, 0xaf, 0xc2, 0x04, 0xd2, 0xaf, 0x22, 0xc2,
|
||||
0xaf, 0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60, 0x04, 0xd2, 0x18, 0x80, 0x08, 0xe5, 0x4e, 0x45,
|
||||
0x4f, 0x24, 0xff, 0x92, 0x18, 0xd2, 0xaf, 0x90, 0x04, 0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x19, 0x74,
|
||||
0x1e, 0xf0, 0xe5, 0x5f, 0x54, 0x0f, 0xf5, 0x2d, 0xe5, 0x25, 0x70, 0x13, 0x30, 0x18, 0x05, 0xe5,
|
||||
0x5f, 0x20, 0xe5, 0x0b, 0x30, 0x19, 0x19, 0xe5, 0x5f, 0x54, 0x30, 0xff, 0xbf, 0x30, 0x11, 0xe5,
|
||||
0x25, 0x70, 0x05, 0x75, 0x25, 0x0c, 0x80, 0x02, 0x15, 0x25, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f,
|
||||
0xe5, 0x5f, 0x30, 0xe6, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0xe5,
|
||||
0x47, 0x64, 0x03, 0x70, 0x21, 0x30, 0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x18, 0xe5, 0x25,
|
||||
0x70, 0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x25, 0x70, 0x05, 0x75, 0x25, 0x07, 0x80, 0x02,
|
||||
0x15, 0x25, 0xd2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, 0xb4, 0x09, 0x14, 0xe5, 0x44, 0x20, 0xe3, 0x0b,
|
||||
0xe5, 0x3a, 0x64, 0x02, 0x60, 0x05, 0xe5, 0x3a, 0xb4, 0x03, 0x04, 0xc2, 0x6c, 0xd2, 0x6d, 0xe5,
|
||||
0x47, 0xb4, 0x0a, 0x13, 0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x08, 0xe5,
|
||||
0x3a, 0x70, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20, 0xe0, 0x02, 0xb2,
|
||||
0x68, 0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1, 0x02, 0xb2, 0x6a, 0x20, 0x6d, 0x07, 0xe5, 0x5e,
|
||||
0x20, 0xe2, 0x02, 0xb2, 0x6c, 0x75, 0x2e, 0x40, 0x20, 0x69, 0x04, 0xa2, 0x68, 0x80, 0x26, 0x30,
|
||||
0x68, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80,
|
||||
0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e,
|
||||
0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x73, 0x92, 0x72, 0x20, 0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x26,
|
||||
0x30, 0x6a, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, 0x01,
|
||||
0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02,
|
||||
0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x75, 0x92, 0x74, 0x20, 0x6d, 0x04, 0xa2, 0x6c, 0x80,
|
||||
0x26, 0xe5, 0x47, 0x64, 0x0a, 0x70, 0x22, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x17,
|
||||
0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x34, 0xe5, 0x46, 0x20, 0xe4, 0x03,
|
||||
0x30, 0xe5, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x80, 0x26, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe2,
|
||||
0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54,
|
||||
0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92,
|
||||
0x71, 0x92, 0x70, 0x90, 0x10, 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x03, 0xe0, 0xc3,
|
||||
0x94, 0x30, 0x40, 0x14, 0xa2, 0x71, 0x92, 0x77, 0xa2, 0x70, 0x92, 0x76, 0xe5, 0x2e, 0x13, 0x13,
|
||||
0x54, 0x3f, 0xf5, 0x2e, 0xc2, 0x77, 0xd2, 0x76, 0x90, 0x10, 0x2f, 0xe5, 0x2e, 0xf0, 0xe5, 0x47,
|
||||
0x64, 0x06, 0x70, 0x39, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x43, 0xc4, 0x54, 0x0f,
|
||||
0x14, 0x60, 0x0c, 0x24, 0xfe, 0x60, 0x0c, 0x24, 0x03, 0x70, 0x13, 0xc2, 0x38, 0x80, 0x0f, 0xd2,
|
||||
0x38, 0x80, 0x0b, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x38, 0x30, 0x47,
|
||||
0x05, 0xaf, 0x27, 0x02, 0x17, 0x73, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x17, 0x73, 0xe5, 0x47, 0x64,
|
||||
0x07, 0x60, 0x0f, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x03, 0x02,
|
||||
0x16, 0xf2, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x22, 0x14, 0x60,
|
||||
0x25, 0x14, 0x60, 0x2d, 0x24, 0xfc, 0x60, 0x49, 0x24, 0xf9, 0x60, 0x14, 0x24, 0x0e, 0x70, 0x50,
|
||||
0xe5, 0x46, 0x13, 0x13, 0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x24, 0xff, 0x80, 0x3a,
|
||||
0xd2, 0x39, 0xc2, 0x38, 0x80, 0x3e, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x1d, 0xc3, 0x80,
|
||||
0x1a, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f,
|
||||
0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x38, 0xc2, 0x39, 0x80,
|
||||
0x13, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0xc2, 0x38, 0x80, 0x04,
|
||||
0xc2, 0x38, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x02,
|
||||
0x17, 0x73, 0xe5, 0x47, 0x64, 0x0c, 0x60, 0x06, 0xe5, 0x47, 0x64, 0x0b, 0x70, 0x7a, 0x90, 0x02,
|
||||
0x29, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x20, 0x14, 0x60, 0x21, 0x14, 0x60, 0x2b,
|
||||
0x24, 0xfc, 0x60, 0x45, 0x24, 0xf9, 0x60, 0x12, 0x24, 0x0e, 0x70, 0x4a, 0xe5, 0x46, 0x13, 0x13,
|
||||
0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x80, 0x29, 0xd2, 0x39, 0x80, 0x3a, 0xe5, 0x46,
|
||||
0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0x80, 0x2d, 0xe5, 0x46, 0x30, 0xe2, 0x0d,
|
||||
0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f,
|
||||
0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x39, 0x80, 0x0f, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80,
|
||||
0x01, 0xc3, 0x92, 0x39, 0x80, 0x02, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5,
|
||||
0x27, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22, 0xe5, 0x47, 0xb4, 0x0b, 0x10, 0x90, 0x02,
|
||||
0x29, 0xe0, 0x54, 0xeb, 0xf0, 0xe5, 0x27, 0x54, 0xeb, 0x45, 0x45, 0xf5, 0x27, 0x22, 0xe4, 0x90,
|
||||
0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02,
|
||||
0x28, 0xef, 0xf0, 0x22, 0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54, 0xd2, 0x58, 0x22, 0xe4, 0xf5,
|
||||
0x62, 0xc2, 0xaf, 0xe5, 0x51, 0x14, 0x60, 0x48, 0x14, 0x60, 0x66, 0x24, 0x02, 0x60, 0x03, 0x02,
|
||||
0x18, 0xb6, 0xd2, 0x59, 0x75, 0x55, 0x01, 0x90, 0x02, 0xa2, 0xe0, 0x54, 0x7f, 0xf0, 0xa3, 0xe0,
|
||||
0x20, 0xe7, 0x23, 0x90, 0x04, 0x34, 0xe0, 0xb4, 0x02, 0x1c, 0xa3, 0xe0, 0xb4, 0x02, 0x17, 0xa3,
|
||||
0xe0, 0xb4, 0x02, 0x12, 0x7f, 0x20, 0x12, 0x17, 0xa4, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf3, 0xf0,
|
||||
0x75, 0x51, 0x01, 0x02, 0x18, 0xb6, 0xe5, 0x50, 0x70, 0x06, 0x75, 0x62, 0x03, 0x02, 0x18, 0xb6,
|
||||
0x90, 0x12, 0x00, 0xe0, 0x54, 0x03, 0x70, 0x12, 0x7f, 0x20, 0x12, 0x17, 0xa4, 0x90, 0x02, 0xa2,
|
||||
0xe0, 0x54, 0xbf, 0xf0, 0x75, 0x51, 0x02, 0x02, 0x18, 0xb6, 0xe5, 0x50, 0x70, 0x03, 0x02, 0x18,
|
||||
0xb1, 0x90, 0x02, 0xa3, 0xe0, 0x30, 0xe6, 0x03, 0x02, 0x18, 0xad, 0x90, 0x04, 0x37, 0xe0, 0x64,
|
||||
0x22, 0x70, 0x7a, 0x90, 0x01, 0x8a, 0x74, 0x7e, 0xf0, 0x90, 0x01, 0x96, 0xf0, 0x90, 0x12, 0x04,
|
||||
0x74, 0x0a, 0xf0, 0xe5, 0x58, 0xb4, 0x72, 0x15, 0xe5, 0x59, 0xb4, 0x35, 0x10, 0xe4, 0x90, 0x05,
|
||||
0x00, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12,
|
||||
0x0d, 0x2a, 0x90, 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xf0, 0xf0, 0xe5, 0x59,
|
||||
0xb4, 0x35, 0x14, 0xe5, 0x3c, 0xf4, 0x60, 0x06, 0xa3, 0xe0, 0x54, 0xf3, 0x80, 0x14, 0x90, 0x13,
|
||||
0x2a, 0xe0, 0x54, 0xfb, 0xf0, 0x80, 0x14, 0xe5, 0x3c, 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x08, 0xe0,
|
||||
0x54, 0xf2, 0x45, 0x3c, 0xf0, 0x80, 0x04, 0xe0, 0x54, 0xfa, 0xf0, 0x90, 0x04, 0x01, 0xe0, 0x54,
|
||||
0xfd, 0xf0, 0x75, 0x62, 0x01, 0x75, 0x55, 0x02, 0xe4, 0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70,
|
||||
0x05, 0x75, 0x62, 0x03, 0xf5, 0x51, 0xe5, 0x62, 0x60, 0x15, 0xc2, 0x01, 0xe4, 0xf5, 0x51, 0xc2,
|
||||
0x59, 0xad, 0x62, 0xaf, 0x40, 0x12, 0x19, 0x61, 0xe5, 0x62, 0xb4, 0x03, 0x02, 0xd2, 0x03, 0xd2,
|
||||
0xaf, 0x22, 0xc2, 0xaf, 0x30, 0x01, 0x12, 0xe4, 0x90, 0x01, 0x96, 0xf0, 0xf5, 0x51, 0xc2, 0x59,
|
||||
0xc2, 0x01, 0x7d, 0x02, 0xaf, 0x40, 0x12, 0x19, 0x61, 0xe5, 0x52, 0x14, 0x60, 0x09, 0x04, 0x70,
|
||||
0x6d, 0x75, 0x52, 0x01, 0x75, 0x55, 0x03, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0, 0x90, 0x13,
|
||||
0x28, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90,
|
||||
0x12, 0x04, 0x74, 0x03, 0xf0, 0xe5, 0x58, 0xb4, 0x72, 0x16, 0xe5, 0x59, 0xb4, 0x35, 0x11, 0x90,
|
||||
0x05, 0x00, 0x74, 0xe2, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0,
|
||||
0x7f, 0x01, 0x12, 0x0d, 0x2a, 0x90, 0x02, 0xa2, 0xe0, 0x44, 0xc0, 0xf0, 0x90, 0x10, 0x04, 0xe0,
|
||||
0x44, 0x0c, 0xf0, 0xe4, 0xf5, 0x52, 0xf5, 0x55, 0x30, 0x02, 0x09, 0xc2, 0x02, 0x7d, 0x01, 0xaf,
|
||||
0x41, 0x12, 0x19, 0x61, 0x30, 0x03, 0x02, 0xc2, 0x03, 0xe4, 0x90, 0x01, 0x96, 0xf0, 0xd2, 0xaf,
|
||||
0x22, 0xef, 0xf4, 0x60, 0x2d, 0xe4, 0xfe, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5,
|
||||
0x83, 0xe0, 0xb4, 0xff, 0x19, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef,
|
||||
0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, 0x22, 0x0e, 0xbe,
|
||||
0x04, 0xd5, 0x22, 0x22, 0x22, 0x90, 0x70, 0x2a, 0xe0, 0x30, 0xe1, 0x4d, 0xc2, 0xaf, 0x90, 0x70,
|
||||
0x28, 0xe0, 0x90, 0x10, 0x1c, 0xf0, 0x90, 0x70, 0x29, 0xe0, 0x90, 0x10, 0x1d, 0xf0, 0x90, 0x70,
|
||||
0x2a, 0xe0, 0x90, 0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x62, 0x90, 0x10, 0x1e, 0xe0,
|
||||
0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, 0x70, 0x28, 0xf0, 0x90, 0x10, 0x1d, 0xe0, 0x90,
|
||||
0x70, 0x29, 0xf0, 0x90, 0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0, 0x30, 0x4a, 0x07, 0x90, 0x70,
|
||||
0x24, 0xe0, 0x44, 0x01, 0xf0, 0xc2, 0x05, 0xd2, 0xaf, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x7b, 0xc4,
|
||||
0xff, 0xff, 0xff, 0x02, 0x10, 0x28, 0x02, 0x10, 0x32, 0x02, 0x10, 0x78, 0x02, 0x13, 0x1f, 0x02,
|
||||
0x13, 0x20, 0x02, 0x13, 0x3f, 0x02, 0x13, 0x44, 0x12, 0x13, 0x40, 0x22, 0x02, 0x17, 0xae, 0x02,
|
||||
0x18, 0xd2, 0x02, 0x14, 0x3d, 0x02, 0x13, 0x78, 0x30, 0x05, 0x06, 0x20, 0x0d, 0x03, 0x12, 0x19,
|
||||
0x95, 0x22, 0x90, 0x01, 0x8c, 0xe0, 0x30, 0xe3, 0x1b, 0xe5, 0x4c, 0x30, 0xe0, 0x04, 0x7f, 0x40,
|
||||
0x80, 0x02, 0x7f, 0x00, 0x90, 0x10, 0x2f, 0xef, 0xf0, 0x90, 0x01, 0x8c, 0x74, 0x08, 0xf0, 0xe4,
|
||||
0x90, 0x01, 0xa7, 0xf0, 0x90, 0x01, 0x8c, 0xe0, 0x30, 0xe0, 0x1c, 0x90, 0x01, 0x80, 0xe0, 0xb4,
|
||||
0x02, 0x15, 0xa3, 0xe0, 0xb4, 0x01, 0x10, 0x90, 0x01, 0x84, 0xe0, 0xb4, 0x81, 0x09, 0x90, 0x01,
|
||||
0x8c, 0x74, 0x01, 0xf0, 0x12, 0x0d, 0xdd, 0x22, 0x90, 0x04, 0x14, 0xe0, 0x20, 0xe7, 0x03, 0x02,
|
||||
0x13, 0x1e, 0x90, 0x70, 0x12, 0xe0, 0xf5, 0x56, 0x90, 0x04, 0x04, 0xe0, 0x12, 0x0a, 0xb6, 0x10,
|
||||
0xd9, 0x31, 0x10, 0xbd, 0x36, 0x11, 0x02, 0x50, 0x11, 0x39, 0x51, 0x11, 0x42, 0x52, 0x11, 0x42,
|
||||
0x53, 0x11, 0x42, 0x54, 0x11, 0x83, 0x55, 0x11, 0xd2, 0x56, 0x12, 0x25, 0x70, 0x12, 0x50, 0x71,
|
||||
0x12, 0x7e, 0x72, 0x12, 0xd5, 0x73, 0x12, 0xf6, 0x80, 0x00, 0x00, 0x13, 0x1e, 0x90, 0x70, 0x11,
|
||||
0xe0, 0xf5, 0x3c, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe5, 0x56,
|
||||
0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17, 0x20, 0x02, 0x03, 0x30, 0x03, 0x1d, 0x7d,
|
||||
0x02, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13,
|
||||
0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17, 0x85, 0x56, 0x41, 0xd2,
|
||||
0x02, 0x22, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff, 0xbf, 0x0a, 0x0d, 0x90, 0x70, 0x11, 0xe0,
|
||||
0xb4, 0x08, 0x06, 0x75, 0x4e, 0x01, 0x75, 0x4f, 0x84, 0x90, 0x70, 0x10, 0xe0, 0x54, 0x7f, 0xff,
|
||||
0xbf, 0x02, 0x12, 0x90, 0x70, 0x11, 0xe0, 0x64, 0x08, 0x60, 0x04, 0xe0, 0xb4, 0x20, 0x06, 0x75,
|
||||
0x4e, 0x03, 0x75, 0x4f, 0x20, 0xe4, 0xf5, 0x27, 0x22, 0x90, 0x70, 0x11, 0xe0, 0x24, 0xff, 0x92,
|
||||
0x47, 0x22, 0x90, 0x04, 0x04, 0xe0, 0x25, 0xe0, 0x24, 0x5d, 0xf5, 0x57, 0x90, 0x70, 0x10, 0xe0,
|
||||
0xff, 0x74, 0x47, 0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0x90, 0x70, 0x11, 0xe0, 0xff, 0x74, 0x48,
|
||||
0x25, 0x57, 0xf8, 0xc6, 0xef, 0xc6, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14,
|
||||
0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e,
|
||||
0x02, 0x13, 0x17, 0xe5, 0x47, 0x64, 0x07, 0x60, 0x1d, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x17, 0xe5,
|
||||
0x47, 0x64, 0x09, 0x60, 0x11, 0xe5, 0x47, 0x64, 0x0a, 0x60, 0x0b, 0xe5, 0x47, 0x64, 0x0b, 0x60,
|
||||
0x05, 0xe5, 0x47, 0xb4, 0x0c, 0x08, 0x90, 0x70, 0x11, 0xe0, 0x54, 0x0f, 0xf5, 0x3a, 0xe5, 0x47,
|
||||
0xb4, 0x09, 0x08, 0xe5, 0x3a, 0xb4, 0x03, 0x03, 0xe4, 0xf5, 0x46, 0xe5, 0x47, 0xb4, 0x0a, 0x08,
|
||||
0xe5, 0x3a, 0xb4, 0x01, 0x03, 0xe4, 0xf5, 0x46, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0xd2,
|
||||
0x04, 0x22, 0x90, 0x70, 0x11, 0xe0, 0xf4, 0xff, 0x90, 0x70, 0x10, 0xe0, 0x5f, 0xff, 0x90, 0x70,
|
||||
0x11, 0xe0, 0x55, 0x27, 0x4f, 0x90, 0x70, 0x18, 0xf0, 0x90, 0x70, 0x11, 0xe0, 0x90, 0x70, 0x19,
|
||||
0xf0, 0xe4, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0x30, 0x15, 0x03, 0xd2, 0x14, 0x22, 0x90, 0x70,
|
||||
0x18, 0xe0, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef, 0x5e,
|
||||
0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x90,
|
||||
0x02, 0x28, 0xef, 0xf0, 0x22, 0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed,
|
||||
0xf8, 0xe6, 0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0,
|
||||
0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17,
|
||||
0x90, 0x70, 0x10, 0xe0, 0xfe, 0x90, 0x70, 0x11, 0xe0, 0xfd, 0xed, 0xf5, 0x82, 0x8e, 0x83, 0xe0,
|
||||
0xf5, 0x57, 0xfd, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90,
|
||||
0x70, 0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x70, 0x03, 0x02, 0x13, 0x1e, 0x02, 0x13, 0x17, 0x90, 0x10,
|
||||
0x00, 0xe0, 0xf5, 0x57, 0x90, 0x10, 0x02, 0xe0, 0xf5, 0x58, 0xa3, 0xe0, 0xf5, 0x59, 0xe5, 0x58,
|
||||
0xb4, 0x70, 0x1e, 0xe5, 0x59, 0xb4, 0x30, 0x19, 0x90, 0x05, 0x08, 0xe0, 0x44, 0x01, 0xf0, 0xfd,
|
||||
0x90, 0x05, 0x05, 0xe0, 0x54, 0xfb, 0xf0, 0x44, 0x04, 0xf0, 0xed, 0x54, 0xfe, 0x90, 0x05, 0x08,
|
||||
0xf0, 0xe4, 0xf5, 0x4e, 0xf5, 0x4f, 0x75, 0x3a, 0xff, 0x75, 0x3c, 0xff, 0xad, 0x57, 0xaf, 0x56,
|
||||
0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5, 0x56,
|
||||
0xf4, 0x60, 0x4b, 0x80, 0x42, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x93, 0xe4, 0xfd, 0xaf,
|
||||
0x56, 0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70, 0x13, 0xf0, 0xe5,
|
||||
0x56, 0xf4, 0x60, 0x2a, 0x80, 0x21, 0x90, 0x70, 0x10, 0xe0, 0x24, 0xff, 0x92, 0x4a, 0xd2, 0x05,
|
||||
0xad, 0x57, 0xaf, 0x56, 0x12, 0x0b, 0xaa, 0x90, 0x04, 0x14, 0x74, 0x80, 0xf0, 0xe4, 0x90, 0x70,
|
||||
0x13, 0xf0, 0xe5, 0x56, 0xf4, 0x60, 0x07, 0x90, 0x70, 0x25, 0xe0, 0x44, 0x01, 0xf0, 0x22, 0x22,
|
||||
0xe5, 0x53, 0x70, 0x1a, 0x30, 0x60, 0x09, 0xb2, 0x4d, 0x30, 0x4d, 0x04, 0x05, 0x46, 0xc2, 0x04,
|
||||
0xe5, 0x4f, 0x45, 0x4e, 0x60, 0x08, 0xe5, 0x4f, 0x15, 0x4f, 0x70, 0x02, 0x15, 0x4e, 0x22, 0x22,
|
||||
0xc2, 0x42, 0xd3, 0x22, 0x30, 0x14, 0x30, 0x90, 0x70, 0x19, 0xe0, 0x55, 0x27, 0xff, 0x90, 0x70,
|
||||
0x18, 0xe0, 0x4f, 0xf5, 0x27, 0x90, 0x02, 0x29, 0xe0, 0xff, 0x90, 0x70, 0x19, 0xe0, 0xfe, 0xef,
|
||||
0x5e, 0x90, 0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff,
|
||||
0x90, 0x02, 0x28, 0xef, 0xf0, 0xc2, 0x14, 0x22, 0xc2, 0x4b, 0xc2, 0x4c, 0xe5, 0x44, 0x12, 0x0a,
|
||||
0xb6, 0x13, 0x9a, 0x00, 0x14, 0x28, 0x04, 0x14, 0x24, 0x08, 0x14, 0x04, 0x10, 0x13, 0xae, 0x20,
|
||||
0x13, 0xce, 0x60, 0x13, 0xdf, 0xa0, 0x00, 0x00, 0x14, 0x2a, 0x85, 0x48, 0x43, 0x85, 0x4a, 0x42,
|
||||
0x85, 0x4c, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x60, 0x03, 0x02, 0x14, 0x2a, 0x80, 0x1b, 0xe5, 0x48,
|
||||
0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4a, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4c, 0xc4, 0x54,
|
||||
0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x61, 0x53, 0x43, 0x0f, 0x80, 0x5c, 0x85, 0x49,
|
||||
0x43, 0x85, 0x4b, 0x42, 0x85, 0x4d, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x4d, 0x80, 0x1b, 0xe5,
|
||||
0x49, 0xc4, 0x54, 0x0f, 0xf5, 0x43, 0xe5, 0x4b, 0xc4, 0x54, 0x0f, 0xf5, 0x42, 0xe5, 0x4d, 0xc4,
|
||||
0x54, 0x0f, 0xf5, 0x5e, 0xe5, 0x47, 0x64, 0x06, 0x70, 0x30, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x10,
|
||||
0xf5, 0x43, 0x80, 0x26, 0xe5, 0x47, 0x64, 0x04, 0x60, 0x05, 0xe5, 0x47, 0xb4, 0x05, 0x06, 0x43,
|
||||
0x5e, 0x04, 0x75, 0x42, 0x09, 0xe5, 0x47, 0xb4, 0x06, 0x10, 0xe5, 0x43, 0x54, 0x0f, 0x44, 0x30,
|
||||
0xf5, 0x43, 0x80, 0x06, 0xd2, 0x4b, 0x80, 0x02, 0xd2, 0x4c, 0xe4, 0xf5, 0x25, 0xe5, 0x42, 0xc4,
|
||||
0x54, 0xf0, 0xff, 0xe5, 0x43, 0x54, 0x0f, 0x4f, 0xf5, 0x5f, 0xd2, 0x60, 0x22, 0xd2, 0x15, 0xe5,
|
||||
0x47, 0x24, 0xf5, 0x60, 0x0b, 0x24, 0xcb, 0x60, 0x07, 0x24, 0x40, 0x70, 0x06, 0xc2, 0x15, 0x22,
|
||||
0x12, 0x17, 0x79, 0x12, 0x14, 0x5f, 0xc2, 0x15, 0xc2, 0xaf, 0xc2, 0x04, 0xd2, 0xaf, 0x22, 0xc2,
|
||||
0xaf, 0x90, 0x04, 0x14, 0xe0, 0x54, 0x0e, 0x60, 0x04, 0xd2, 0x18, 0x80, 0x08, 0xe5, 0x4e, 0x45,
|
||||
0x4f, 0x24, 0xff, 0x92, 0x18, 0xd2, 0xaf, 0x90, 0x04, 0x14, 0xe0, 0xa2, 0xe4, 0x92, 0x19, 0x74,
|
||||
0x1e, 0xf0, 0xe5, 0x5f, 0x54, 0x0f, 0xf5, 0x2d, 0xe5, 0x25, 0x70, 0x13, 0x30, 0x18, 0x05, 0xe5,
|
||||
0x5f, 0x20, 0xe5, 0x0b, 0x30, 0x19, 0x19, 0xe5, 0x5f, 0x54, 0x30, 0xff, 0xbf, 0x30, 0x11, 0xe5,
|
||||
0x25, 0x70, 0x05, 0x75, 0x25, 0x0c, 0x80, 0x02, 0x15, 0x25, 0xd2, 0x6c, 0xd2, 0x6d, 0x80, 0x0f,
|
||||
0xe5, 0x5f, 0x30, 0xe6, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0xe5,
|
||||
0x47, 0x64, 0x03, 0x70, 0x21, 0x30, 0x4b, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x18, 0xe5, 0x25,
|
||||
0x70, 0x03, 0x30, 0x4c, 0x11, 0xc2, 0x4c, 0xe5, 0x25, 0x70, 0x05, 0x75, 0x25, 0x07, 0x80, 0x02,
|
||||
0x15, 0x25, 0xd2, 0x6c, 0xd2, 0x6d, 0xe5, 0x47, 0xb4, 0x09, 0x14, 0xe5, 0x44, 0x20, 0xe3, 0x0b,
|
||||
0xe5, 0x3a, 0x64, 0x02, 0x60, 0x05, 0xe5, 0x3a, 0xb4, 0x03, 0x04, 0xc2, 0x6c, 0xd2, 0x6d, 0xe5,
|
||||
0x47, 0xb4, 0x0a, 0x13, 0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xc2, 0x6c, 0xd2, 0x6d, 0x80, 0x08, 0xe5,
|
||||
0x3a, 0x70, 0x04, 0xd2, 0x6c, 0xc2, 0x6d, 0x20, 0x69, 0x07, 0xe5, 0x5e, 0x20, 0xe0, 0x02, 0xb2,
|
||||
0x68, 0x20, 0x6b, 0x07, 0xe5, 0x5e, 0x20, 0xe1, 0x02, 0xb2, 0x6a, 0x20, 0x6d, 0x07, 0xe5, 0x5e,
|
||||
0x20, 0xe2, 0x02, 0xb2, 0x6c, 0x75, 0x2e, 0x40, 0x20, 0x69, 0x04, 0xa2, 0x68, 0x80, 0x26, 0x30,
|
||||
0x68, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe2, 0x04, 0x7f, 0x01, 0x80,
|
||||
0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e,
|
||||
0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x73, 0x92, 0x72, 0x20, 0x6b, 0x04, 0xa2, 0x6a, 0x80, 0x26,
|
||||
0x30, 0x6a, 0x06, 0xe5, 0x46, 0xa2, 0xe2, 0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe0, 0x04, 0x7f, 0x01,
|
||||
0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54, 0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02,
|
||||
0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92, 0x75, 0x92, 0x74, 0x20, 0x6d, 0x04, 0xa2, 0x6c, 0x80,
|
||||
0x26, 0xe5, 0x47, 0x64, 0x0a, 0x70, 0x22, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x17,
|
||||
0xe5, 0x3a, 0xb4, 0x01, 0x06, 0xe5, 0x46, 0xa2, 0xe3, 0x80, 0x34, 0xe5, 0x46, 0x20, 0xe4, 0x03,
|
||||
0x30, 0xe5, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x80, 0x26, 0x30, 0x6c, 0x06, 0xe5, 0x46, 0xa2, 0xe2,
|
||||
0x80, 0x1d, 0xe5, 0x5e, 0x20, 0xe1, 0x04, 0x7f, 0x01, 0x80, 0x02, 0x7f, 0x00, 0xe5, 0x46, 0x54,
|
||||
0xf0, 0xfe, 0xbe, 0xf0, 0x04, 0x7e, 0x01, 0x80, 0x02, 0x7e, 0x00, 0xee, 0x6f, 0x24, 0xff, 0x92,
|
||||
0x71, 0x92, 0x70, 0x90, 0x10, 0x00, 0xe0, 0x90, 0x10, 0x2c, 0xf0, 0x90, 0x10, 0x03, 0xe0, 0xc3,
|
||||
0x94, 0x30, 0x40, 0x14, 0xa2, 0x71, 0x92, 0x77, 0xa2, 0x70, 0x92, 0x76, 0xe5, 0x2e, 0x13, 0x13,
|
||||
0x54, 0x3f, 0xf5, 0x2e, 0xc2, 0x77, 0xd2, 0x76, 0x90, 0x10, 0x2f, 0xe5, 0x2e, 0xf0, 0xe5, 0x47,
|
||||
0x64, 0x06, 0x70, 0x39, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfe, 0xf0, 0xe5, 0x43, 0xc4, 0x54, 0x0f,
|
||||
0x14, 0x60, 0x0c, 0x24, 0xfe, 0x60, 0x0c, 0x24, 0x03, 0x70, 0x13, 0xc2, 0x38, 0x80, 0x0f, 0xd2,
|
||||
0x38, 0x80, 0x0b, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x38, 0x30, 0x47,
|
||||
0x05, 0xaf, 0x27, 0x02, 0x17, 0x73, 0xe5, 0x27, 0xf4, 0xff, 0x02, 0x17, 0x73, 0xe5, 0x47, 0x64,
|
||||
0x07, 0x60, 0x0f, 0xe5, 0x47, 0x64, 0x08, 0x60, 0x09, 0xe5, 0x47, 0x64, 0x09, 0x60, 0x03, 0x02,
|
||||
0x16, 0xf2, 0x90, 0x02, 0x29, 0xe0, 0x54, 0xfc, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x22, 0x14, 0x60,
|
||||
0x25, 0x14, 0x60, 0x2d, 0x24, 0xfc, 0x60, 0x49, 0x24, 0xf9, 0x60, 0x14, 0x24, 0x0e, 0x70, 0x50,
|
||||
0xe5, 0x46, 0x13, 0x13, 0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x24, 0xff, 0x80, 0x3a,
|
||||
0xd2, 0x39, 0xc2, 0x38, 0x80, 0x3e, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x1d, 0xc3, 0x80,
|
||||
0x1a, 0xe5, 0x46, 0x30, 0xe2, 0x0d, 0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f,
|
||||
0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f, 0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x38, 0xc2, 0x39, 0x80,
|
||||
0x13, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0xc2, 0x38, 0x80, 0x04,
|
||||
0xc2, 0x38, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5, 0x27, 0xf4, 0xff, 0x02,
|
||||
0x17, 0x73, 0xe5, 0x47, 0x64, 0x0c, 0x60, 0x06, 0xe5, 0x47, 0x64, 0x0b, 0x70, 0x7a, 0x90, 0x02,
|
||||
0x29, 0xe0, 0x54, 0xfd, 0xf0, 0xe5, 0x3a, 0x14, 0x60, 0x20, 0x14, 0x60, 0x21, 0x14, 0x60, 0x2b,
|
||||
0x24, 0xfc, 0x60, 0x45, 0x24, 0xf9, 0x60, 0x12, 0x24, 0x0e, 0x70, 0x4a, 0xe5, 0x46, 0x13, 0x13,
|
||||
0x54, 0x3f, 0x75, 0xf0, 0x03, 0x84, 0xe5, 0xf0, 0x80, 0x29, 0xd2, 0x39, 0x80, 0x3a, 0xe5, 0x46,
|
||||
0x30, 0xe2, 0x03, 0xd3, 0x80, 0x01, 0xc3, 0x92, 0x39, 0x80, 0x2d, 0xe5, 0x46, 0x30, 0xe2, 0x0d,
|
||||
0x54, 0x38, 0xc3, 0x94, 0x30, 0x50, 0x06, 0x7e, 0x00, 0x7f, 0x01, 0x80, 0x04, 0x7e, 0x00, 0x7f,
|
||||
0x00, 0xee, 0x4f, 0x24, 0xff, 0x92, 0x39, 0x80, 0x0f, 0xe5, 0x46, 0x30, 0xe2, 0x03, 0xd3, 0x80,
|
||||
0x01, 0xc3, 0x92, 0x39, 0x80, 0x02, 0xc2, 0x39, 0x30, 0x47, 0x04, 0xaf, 0x27, 0x80, 0x04, 0xe5,
|
||||
0x27, 0xf4, 0xff, 0x90, 0x02, 0x28, 0xef, 0xf0, 0x22, 0xe5, 0x47, 0xb4, 0x0b, 0x10, 0x90, 0x02,
|
||||
0x29, 0xe0, 0x54, 0xeb, 0xf0, 0xe5, 0x27, 0x54, 0xeb, 0x45, 0x45, 0xf5, 0x27, 0x22, 0xe4, 0x90,
|
||||
0x02, 0x29, 0xf0, 0x30, 0x47, 0x04, 0xaf, 0x45, 0x80, 0x04, 0xe5, 0x45, 0xf4, 0xff, 0x90, 0x02,
|
||||
0x28, 0xef, 0xf0, 0x22, 0x8f, 0x50, 0xd2, 0x59, 0x22, 0x8f, 0x54, 0xd2, 0x58, 0x22, 0xe4, 0xf5,
|
||||
0x62, 0xc2, 0xaf, 0xe5, 0x51, 0x14, 0x60, 0x48, 0x14, 0x60, 0x66, 0x24, 0x02, 0x60, 0x03, 0x02,
|
||||
0x18, 0xb6, 0xd2, 0x59, 0x75, 0x55, 0x01, 0x90, 0x02, 0xa2, 0xe0, 0x54, 0x7f, 0xf0, 0xa3, 0xe0,
|
||||
0x20, 0xe7, 0x23, 0x90, 0x04, 0x34, 0xe0, 0xb4, 0x02, 0x1c, 0xa3, 0xe0, 0xb4, 0x02, 0x17, 0xa3,
|
||||
0xe0, 0xb4, 0x02, 0x12, 0x7f, 0x20, 0x12, 0x17, 0xa4, 0x90, 0x10, 0x04, 0xe0, 0x54, 0xf3, 0xf0,
|
||||
0x75, 0x51, 0x01, 0x02, 0x18, 0xb6, 0xe5, 0x50, 0x70, 0x06, 0x75, 0x62, 0x03, 0x02, 0x18, 0xb6,
|
||||
0x90, 0x12, 0x00, 0xe0, 0x54, 0x03, 0x70, 0x12, 0x7f, 0x20, 0x12, 0x17, 0xa4, 0x90, 0x02, 0xa2,
|
||||
0xe0, 0x54, 0xbf, 0xf0, 0x75, 0x51, 0x02, 0x02, 0x18, 0xb6, 0xe5, 0x50, 0x70, 0x03, 0x02, 0x18,
|
||||
0xb1, 0x90, 0x02, 0xa3, 0xe0, 0x30, 0xe6, 0x03, 0x02, 0x18, 0xad, 0x90, 0x04, 0x37, 0xe0, 0x64,
|
||||
0x22, 0x70, 0x7a, 0x90, 0x01, 0x8a, 0x74, 0x7e, 0xf0, 0x90, 0x01, 0x96, 0xf0, 0x90, 0x12, 0x04,
|
||||
0x74, 0x0a, 0xf0, 0xe5, 0x58, 0xb4, 0x72, 0x15, 0xe5, 0x59, 0xb4, 0x35, 0x10, 0xe4, 0x90, 0x05,
|
||||
0x00, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0, 0x7f, 0x01, 0x12,
|
||||
0x0d, 0x48, 0x90, 0x13, 0x28, 0xe0, 0x54, 0xf0, 0xf0, 0xa3, 0xe0, 0x54, 0xf0, 0xf0, 0xe5, 0x59,
|
||||
0xb4, 0x35, 0x14, 0xe5, 0x3c, 0xf4, 0x60, 0x06, 0xa3, 0xe0, 0x54, 0xf3, 0x80, 0x14, 0x90, 0x13,
|
||||
0x2a, 0xe0, 0x54, 0xfb, 0xf0, 0x80, 0x14, 0xe5, 0x3c, 0xf4, 0x90, 0x13, 0x2a, 0x60, 0x08, 0xe0,
|
||||
0x54, 0xf2, 0x45, 0x3c, 0xf0, 0x80, 0x04, 0xe0, 0x54, 0xfa, 0xf0, 0x90, 0x04, 0x01, 0xe0, 0x54,
|
||||
0xfd, 0xf0, 0x75, 0x62, 0x01, 0x75, 0x55, 0x02, 0xe4, 0xf5, 0x51, 0x80, 0x09, 0xe5, 0x50, 0x70,
|
||||
0x05, 0x75, 0x62, 0x03, 0xf5, 0x51, 0xe5, 0x62, 0x60, 0x15, 0xc2, 0x01, 0xe4, 0xf5, 0x51, 0xc2,
|
||||
0x59, 0xad, 0x62, 0xaf, 0x40, 0x12, 0x19, 0x61, 0xe5, 0x62, 0xb4, 0x03, 0x02, 0xd2, 0x03, 0xd2,
|
||||
0xaf, 0x22, 0xc2, 0xaf, 0x30, 0x01, 0x12, 0xe4, 0x90, 0x01, 0x96, 0xf0, 0xf5, 0x51, 0xc2, 0x59,
|
||||
0xc2, 0x01, 0x7d, 0x02, 0xaf, 0x40, 0x12, 0x19, 0x61, 0xe5, 0x52, 0x14, 0x60, 0x09, 0x04, 0x70,
|
||||
0x6d, 0x75, 0x52, 0x01, 0x75, 0x55, 0x03, 0x90, 0x04, 0x01, 0xe0, 0x44, 0x0e, 0xf0, 0x90, 0x13,
|
||||
0x28, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x0f, 0xf0, 0xa3, 0xe0, 0x44, 0x05, 0xf0, 0x90,
|
||||
0x12, 0x04, 0x74, 0x03, 0xf0, 0xe5, 0x58, 0xb4, 0x72, 0x16, 0xe5, 0x59, 0xb4, 0x35, 0x11, 0x90,
|
||||
0x05, 0x00, 0x74, 0xe2, 0xf0, 0xa3, 0x74, 0x08, 0xf0, 0xa3, 0x74, 0x01, 0xf0, 0x74, 0x03, 0xf0,
|
||||
0x7f, 0x01, 0x12, 0x0d, 0x48, 0x90, 0x02, 0xa2, 0xe0, 0x44, 0xc0, 0xf0, 0x90, 0x10, 0x04, 0xe0,
|
||||
0x44, 0x0c, 0xf0, 0xe4, 0xf5, 0x52, 0xf5, 0x55, 0x30, 0x02, 0x09, 0xc2, 0x02, 0x7d, 0x01, 0xaf,
|
||||
0x41, 0x12, 0x19, 0x61, 0x30, 0x03, 0x02, 0xc2, 0x03, 0xe4, 0x90, 0x01, 0x96, 0xf0, 0xd2, 0xaf,
|
||||
0x22, 0xef, 0xf4, 0x60, 0x2d, 0xe4, 0xfe, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5,
|
||||
0x83, 0xe0, 0xb4, 0xff, 0x19, 0x74, 0x14, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xef,
|
||||
0xf0, 0x74, 0x1c, 0x2e, 0xf5, 0x82, 0xe4, 0x34, 0x70, 0xf5, 0x83, 0xed, 0xf0, 0x22, 0x0e, 0xbe,
|
||||
0x04, 0xd5, 0x22, 0x22, 0x22, 0x90, 0x70, 0x2a, 0xe0, 0x30, 0xe1, 0x4d, 0xc2, 0xaf, 0x90, 0x70,
|
||||
0x28, 0xe0, 0x90, 0x10, 0x1c, 0xf0, 0x90, 0x70, 0x29, 0xe0, 0x90, 0x10, 0x1d, 0xf0, 0x90, 0x70,
|
||||
0x2a, 0xe0, 0x90, 0x10, 0x1e, 0xf0, 0x90, 0x10, 0x1c, 0xe0, 0xf5, 0x62, 0x90, 0x10, 0x1e, 0xe0,
|
||||
0x20, 0xe1, 0xf3, 0x90, 0x10, 0x1c, 0xe0, 0x90, 0x70, 0x28, 0xf0, 0x90, 0x10, 0x1d, 0xe0, 0x90,
|
||||
0x70, 0x29, 0xf0, 0x90, 0x10, 0x1e, 0xe0, 0x90, 0x70, 0x2a, 0xf0, 0x30, 0x4a, 0x07, 0x90, 0x70,
|
||||
0x24, 0xe0, 0x44, 0x01, 0xf0, 0xc2, 0x05, 0xd2, 0xaf, 0x22, 0x22, 0x22, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
|
||||
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x65, 0xd3, } ;
|
File diff suppressed because it is too large
Load Diff
1280
drivers/staging/rt2860/common/rt_channel.c
Normal file
1280
drivers/staging/rt2860/common/rt_channel.c
Normal file
File diff suppressed because it is too large
Load Diff
194
drivers/staging/rt2860/common/rt_rf.c
Normal file
194
drivers/staging/rt2860/common/rt_rf.c
Normal file
@ -0,0 +1,194 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_rf.c
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless driver RF related functions
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
#ifdef RTMP_RF_RW_SUPPORT
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description: Write RT30xx RF register through MAC
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RT30xxWriteRFRegister(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR regID,
|
||||
IN UCHAR value)
|
||||
{
|
||||
RF_CSR_CFG_STRUC rfcsr;
|
||||
UINT i = 0;
|
||||
|
||||
do
|
||||
{
|
||||
RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
|
||||
|
||||
if (!rfcsr.field.RF_CSR_KICK)
|
||||
break;
|
||||
i++;
|
||||
}
|
||||
while ((i < RETRY_LIMIT) && (!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)));
|
||||
|
||||
if ((i == RETRY_LIMIT) || (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Retry count exhausted or device removed!!!\n"));
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
rfcsr.field.RF_CSR_WR = 1;
|
||||
rfcsr.field.RF_CSR_KICK = 1;
|
||||
rfcsr.field.TESTCSR_RFACC_REGNUM = regID;
|
||||
rfcsr.field.RF_CSR_DATA = value;
|
||||
|
||||
RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description: Read RT30xx RF register through MAC
|
||||
|
||||
Arguments:
|
||||
|
||||
Return Value:
|
||||
|
||||
IRQL =
|
||||
|
||||
Note:
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RT30xxReadRFRegister(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR regID,
|
||||
IN PUCHAR pValue)
|
||||
{
|
||||
RF_CSR_CFG_STRUC rfcsr;
|
||||
UINT i=0, k=0;
|
||||
|
||||
for (i=0; i<MAX_BUSY_COUNT; i++)
|
||||
{
|
||||
RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
|
||||
|
||||
if (rfcsr.field.RF_CSR_KICK == BUSY)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
rfcsr.word = 0;
|
||||
rfcsr.field.RF_CSR_WR = 0;
|
||||
rfcsr.field.RF_CSR_KICK = 1;
|
||||
rfcsr.field.TESTCSR_RFACC_REGNUM = regID;
|
||||
RTMP_IO_WRITE32(pAd, RF_CSR_CFG, rfcsr.word);
|
||||
for (k=0; k<MAX_BUSY_COUNT; k++)
|
||||
{
|
||||
RTMP_IO_READ32(pAd, RF_CSR_CFG, &rfcsr.word);
|
||||
|
||||
if (rfcsr.field.RF_CSR_KICK == IDLE)
|
||||
break;
|
||||
}
|
||||
if ((rfcsr.field.RF_CSR_KICK == IDLE) &&
|
||||
(rfcsr.field.TESTCSR_RFACC_REGNUM == regID))
|
||||
{
|
||||
*pValue = (UCHAR)rfcsr.field.RF_CSR_DATA;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (rfcsr.field.RF_CSR_KICK == BUSY)
|
||||
{
|
||||
DBGPRINT_ERR(("RF read R%d=0x%x fail, i[%d], k[%d]\n", regID, rfcsr.word,i,k));
|
||||
return STATUS_UNSUCCESSFUL;
|
||||
}
|
||||
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
VOID NICInitRFRegisters(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
if (pAd->chipOps.AsicRfInit)
|
||||
pAd->chipOps.AsicRfInit(pAd);
|
||||
}
|
||||
|
||||
|
||||
VOID RtmpChipOpsRFHook(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_CHIP_OP *pChipOps = &pAd->chipOps;
|
||||
|
||||
pChipOps->pRFRegTable = NULL;
|
||||
pChipOps->AsicRfInit = NULL;
|
||||
pChipOps->AsicRfTurnOn = NULL;
|
||||
pChipOps->AsicRfTurnOff = NULL;
|
||||
pChipOps->AsicReverseRfFromSleepMode = NULL;
|
||||
pChipOps->AsicHaltAction = NULL;
|
||||
/* We depends on RfICType and MACVersion to assign the corresponding operation callbacks. */
|
||||
|
||||
#ifdef RT30xx
|
||||
if (IS_RT30xx(pAd))
|
||||
{
|
||||
pChipOps->pRFRegTable = RT30xx_RFRegTable;
|
||||
pChipOps->AsicHaltAction = RT30xxHaltAction;
|
||||
#ifdef RT3070
|
||||
if((IS_RT3070(pAd) || IS_RT3071(pAd)) && (pAd->infType == RTMP_DEV_INF_USB))
|
||||
{
|
||||
pChipOps->AsicRfInit = NICInitRT3070RFRegisters;
|
||||
if (IS_RT3071(pAd))
|
||||
{
|
||||
pChipOps->AsicRfTurnOff = RT30xxLoadRFSleepModeSetup;
|
||||
pChipOps->AsicReverseRfFromSleepMode = RT30xxReverseRFSleepModeSetup;
|
||||
}
|
||||
}
|
||||
#endif // RT3070 //
|
||||
}
|
||||
#endif // RT30xx //
|
||||
}
|
||||
|
||||
#endif // RTMP_RF_RW_SUPPORT //
|
File diff suppressed because it is too large
Load Diff
233
drivers/staging/rt2860/common/rtmp_mcu.c
Normal file
233
drivers/staging/rt2860/common/rtmp_mcu.c
Normal file
@ -0,0 +1,233 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_mcu.c
|
||||
|
||||
Abstract:
|
||||
Miniport generic portion header file
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
#ifdef RT2860
|
||||
#include "firmware.h"
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
#include "../../rt3070/firmware.h"
|
||||
#include "firmware_3070.h"
|
||||
#endif
|
||||
|
||||
#include <linux/bitrev.h>
|
||||
|
||||
//#define BIN_IN_FILE /* use *.bin firmware */
|
||||
|
||||
#ifdef RTMP_MAC_USB
|
||||
//
|
||||
// RT2870 Firmware Spec only used 1 oct for version expression
|
||||
//
|
||||
#define FIRMWARE_MINOR_VERSION 7
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
// New 8k byte firmware size for RT3071/RT3072
|
||||
#define FIRMWAREIMAGE_MAX_LENGTH 0x2000
|
||||
#define FIRMWAREIMAGE_LENGTH (sizeof (FirmwareImage) / sizeof(UCHAR))
|
||||
#define FIRMWARE_MAJOR_VERSION 0
|
||||
|
||||
#define FIRMWAREIMAGEV1_LENGTH 0x1000
|
||||
#define FIRMWAREIMAGEV2_LENGTH 0x1000
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#define FIRMWARE_MINOR_VERSION 2
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
erase 8051 firmware image in MAC ASIC
|
||||
|
||||
Arguments:
|
||||
Adapter Pointer to our adapter
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
INT RtmpAsicEraseFirmware(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
ULONG i;
|
||||
|
||||
for(i=0; i<MAX_FIRMWARE_IMAGE_SIZE; i+=4)
|
||||
RTMP_IO_WRITE32(pAd, FIRMWARE_IMAGE_BASE + i, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
Load 8051 firmware file into MAC ASIC
|
||||
|
||||
Arguments:
|
||||
Adapter Pointer to our adapter
|
||||
|
||||
Return Value:
|
||||
NDIS_STATUS_SUCCESS firmware image load ok
|
||||
NDIS_STATUS_FAILURE image not found
|
||||
|
||||
IRQL = PASSIVE_LEVEL
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RtmpAsicLoadFirmware(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
|
||||
NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
|
||||
PUCHAR pFirmwareImage;
|
||||
ULONG FileLength, Index;
|
||||
//ULONG firm;
|
||||
UINT32 MacReg = 0;
|
||||
UINT32 Version = (pAd->MACVersion >> 16);
|
||||
|
||||
// pFirmwareImage = FirmwareImage;
|
||||
// FileLength = sizeof(FirmwareImage);
|
||||
|
||||
// New 8k byte firmware size for RT3071/RT3072
|
||||
{
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if ((Version == 0x2860) || (Version == 0x3572) || IS_RT3090(pAd))
|
||||
{
|
||||
pFirmwareImage = FirmwareImage_2860;
|
||||
FileLength = FIRMWAREIMAGE_MAX_LENGTH;
|
||||
}
|
||||
#endif // RTMP_MAC_PCI //
|
||||
#ifdef RTMP_MAC_USB
|
||||
/* the firmware image consists of two parts */
|
||||
if ((Version != 0x2860) && (Version != 0x2872) && (Version != 0x3070))
|
||||
{ /* use the second part */
|
||||
//printk("KH:Use New Version,part2\n");
|
||||
pFirmwareImage = (PUCHAR)&FirmwareImage_3070[FIRMWAREIMAGEV1_LENGTH];
|
||||
FileLength = FIRMWAREIMAGEV2_LENGTH;
|
||||
}
|
||||
else
|
||||
{
|
||||
//printk("KH:Use New Version,part1\n");
|
||||
if (Version == 0x3070)
|
||||
pFirmwareImage = FirmwareImage_3070;
|
||||
else
|
||||
pFirmwareImage = FirmwareImage_2870;
|
||||
FileLength = FIRMWAREIMAGEV1_LENGTH;
|
||||
}
|
||||
#endif // RTMP_MAC_USB //
|
||||
}
|
||||
|
||||
RTMP_WRITE_FIRMWARE(pAd, pFirmwareImage, FileLength);
|
||||
|
||||
|
||||
/* check if MCU is ready */
|
||||
Index = 0;
|
||||
do
|
||||
{
|
||||
RTMP_IO_READ32(pAd, PBF_SYS_CTRL, &MacReg);
|
||||
|
||||
if (MacReg & 0x80)
|
||||
break;
|
||||
|
||||
RTMPusecDelay(1000);
|
||||
} while (Index++ < 1000);
|
||||
|
||||
if (Index > 1000)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("NICLoadFirmware: MCU is not ready\n\n\n"));
|
||||
Status = NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== %s (status=%d)\n", __func__, Status));
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
INT RtmpAsicSendCommandToMcu(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Command,
|
||||
IN UCHAR Token,
|
||||
IN UCHAR Arg0,
|
||||
IN UCHAR Arg1)
|
||||
{
|
||||
HOST_CMD_CSR_STRUC H2MCmd;
|
||||
H2M_MAILBOX_STRUC H2MMailbox;
|
||||
ULONG i = 0;
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
do
|
||||
{
|
||||
RTMP_IO_READ32(pAd, H2M_MAILBOX_CSR, &H2MMailbox.word);
|
||||
if (H2MMailbox.field.Owner == 0)
|
||||
break;
|
||||
|
||||
RTMPusecDelay(2);
|
||||
} while(i++ < 100);
|
||||
|
||||
if (i > 100)
|
||||
{
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#endif // RTMP_MAC_PCI //
|
||||
{
|
||||
DBGPRINT_ERR(("H2M_MAILBOX still hold by MCU. command fail\n"));
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
H2MMailbox.field.Owner = 1; // pass ownership to MCU
|
||||
H2MMailbox.field.CmdToken = Token;
|
||||
H2MMailbox.field.HighByte = Arg1;
|
||||
H2MMailbox.field.LowByte = Arg0;
|
||||
RTMP_IO_WRITE32(pAd, H2M_MAILBOX_CSR, H2MMailbox.word);
|
||||
|
||||
H2MCmd.word = 0;
|
||||
H2MCmd.field.HostCommand = Command;
|
||||
RTMP_IO_WRITE32(pAd, HOST_CMD_CSR, H2MCmd.word);
|
||||
|
||||
if (Command != 0x80)
|
||||
{
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
323
drivers/staging/rt2860/common/rtmp_timer.c
Normal file
323
drivers/staging/rt2860/common/rtmp_timer.c
Normal file
@ -0,0 +1,323 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_timer.c
|
||||
|
||||
Abstract:
|
||||
task for timer handling
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
Shiang Tu 08-28-2008 init version
|
||||
|
||||
*/
|
||||
|
||||
#include "../rt_config.h"
|
||||
|
||||
|
||||
BUILD_TIMER_FUNCTION(MlmePeriodicExec);
|
||||
//BUILD_TIMER_FUNCTION(MlmeRssiReportExec);
|
||||
BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);
|
||||
BUILD_TIMER_FUNCTION(APSDPeriodicExec);
|
||||
BUILD_TIMER_FUNCTION(AsicRfTuningExec);
|
||||
#ifdef RTMP_MAC_USB
|
||||
BUILD_TIMER_FUNCTION(BeaconUpdateExec);
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
BUILD_TIMER_FUNCTION(BeaconTimeout);
|
||||
BUILD_TIMER_FUNCTION(ScanTimeout);
|
||||
BUILD_TIMER_FUNCTION(AuthTimeout);
|
||||
BUILD_TIMER_FUNCTION(AssocTimeout);
|
||||
BUILD_TIMER_FUNCTION(ReassocTimeout);
|
||||
BUILD_TIMER_FUNCTION(DisassocTimeout);
|
||||
BUILD_TIMER_FUNCTION(LinkDownExec);
|
||||
BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
|
||||
BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
|
||||
#ifdef RTMP_PCI_SUPPORT
|
||||
BUILD_TIMER_FUNCTION(PsPollWakeExec);
|
||||
BUILD_TIMER_FUNCTION(RadioOnExec);
|
||||
#endif // RTMP_PCI_SUPPORT //
|
||||
#ifdef RTMP_MAC_USB
|
||||
BUILD_TIMER_FUNCTION(RtmpUsbStaAsicForceWakeupTimeout);
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
#if defined(AP_LED) || defined(STA_LED)
|
||||
extern void LedCtrlMain(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
BUILD_TIMER_FUNCTION(LedCtrlMain);
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef RTMP_TIMER_TASK_SUPPORT
|
||||
static void RtmpTimerQHandle(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
int status;
|
||||
#endif
|
||||
RALINK_TIMER_STRUCT *pTimer;
|
||||
RTMP_TIMER_TASK_ENTRY *pEntry;
|
||||
unsigned long irqFlag;
|
||||
RTMP_OS_TASK *pTask;
|
||||
|
||||
|
||||
pTask = &pAd->timerTask;
|
||||
while(!pTask->task_killed)
|
||||
{
|
||||
pTimer = NULL;
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
|
||||
#else
|
||||
RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
|
||||
#endif
|
||||
|
||||
if (pAd->TimerQ.status == RTMP_TASK_STAT_STOPED)
|
||||
break;
|
||||
|
||||
// event happened.
|
||||
while(pAd->TimerQ.pQHead)
|
||||
{
|
||||
RTMP_INT_LOCK(&pAd->TimerQLock, irqFlag);
|
||||
pEntry = pAd->TimerQ.pQHead;
|
||||
if (pEntry)
|
||||
{
|
||||
pTimer = pEntry->pRaTimer;
|
||||
|
||||
// update pQHead
|
||||
pAd->TimerQ.pQHead = pEntry->pNext;
|
||||
if (pEntry == pAd->TimerQ.pQTail)
|
||||
pAd->TimerQ.pQTail = NULL;
|
||||
|
||||
// return this queue entry to timerQFreeList.
|
||||
pEntry->pNext = pAd->TimerQ.pQPollFreeList;
|
||||
pAd->TimerQ.pQPollFreeList = pEntry;
|
||||
}
|
||||
RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlag);
|
||||
|
||||
if (pTimer)
|
||||
{
|
||||
if ((pTimer->handle != NULL) && (!pAd->PM_FlgSuspend))
|
||||
pTimer->handle(NULL, (PVOID) pTimer->cookie, NULL, pTimer);
|
||||
if ((pTimer->Repeat) && (pTimer->State == FALSE))
|
||||
RTMP_OS_Add_Timer(&pTimer->TimerObj, pTimer->TimerValue);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
if (status != 0)
|
||||
{
|
||||
pAd->TimerQ.status = RTMP_TASK_STAT_STOPED;
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
INT RtmpTimerQThread(
|
||||
IN OUT PVOID Context)
|
||||
{
|
||||
RTMP_OS_TASK *pTask;
|
||||
PRTMP_ADAPTER pAd;
|
||||
|
||||
|
||||
pTask = (RTMP_OS_TASK *)Context;
|
||||
pAd = (PRTMP_ADAPTER)pTask->priv;
|
||||
|
||||
RtmpOSTaskCustomize(pTask);
|
||||
|
||||
RtmpTimerQHandle(pAd);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__func__));
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
pTask->taskPID = THREAD_PID_INIT_VALUE;
|
||||
#endif
|
||||
/* notify the exit routine that we're actually exiting now
|
||||
*
|
||||
* complete()/wait_for_completion() is similar to up()/down(),
|
||||
* except that complete() is safe in the case where the structure
|
||||
* is getting deleted in a parallel mode of execution (i.e. just
|
||||
* after the down() -- that's necessary for the thread-shutdown
|
||||
* case.
|
||||
*
|
||||
* complete_and_exit() goes even further than this -- it is safe in
|
||||
* the case that the thread of the caller is going away (not just
|
||||
* the structure) -- this is necessary for the module-remove case.
|
||||
* This is important in preemption kernels, which transfer the flow
|
||||
* of execution immediately upon a complete().
|
||||
*/
|
||||
RtmpOSTaskNotifyToExit(pTask);
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
RTMP_TIMER_TASK_ENTRY *RtmpTimerQInsert(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN RALINK_TIMER_STRUCT *pTimer)
|
||||
{
|
||||
RTMP_TIMER_TASK_ENTRY *pQNode = NULL, *pQTail;
|
||||
unsigned long irqFlags;
|
||||
RTMP_OS_TASK *pTask = &pAd->timerTask;
|
||||
|
||||
RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
|
||||
if (pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)
|
||||
{
|
||||
if(pAd->TimerQ.pQPollFreeList)
|
||||
{
|
||||
pQNode = pAd->TimerQ.pQPollFreeList;
|
||||
pAd->TimerQ.pQPollFreeList = pQNode->pNext;
|
||||
|
||||
pQNode->pRaTimer = pTimer;
|
||||
pQNode->pNext = NULL;
|
||||
|
||||
pQTail = pAd->TimerQ.pQTail;
|
||||
if (pAd->TimerQ.pQTail != NULL)
|
||||
pQTail->pNext = pQNode;
|
||||
pAd->TimerQ.pQTail = pQNode;
|
||||
if (pAd->TimerQ.pQHead == NULL)
|
||||
pAd->TimerQ.pQHead = pQNode;
|
||||
}
|
||||
}
|
||||
RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
|
||||
|
||||
if (pQNode)
|
||||
{
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
WAKE_UP(pTask);
|
||||
#else
|
||||
RTMP_SEM_EVENT_UP(&pTask->taskSema);
|
||||
#endif
|
||||
}
|
||||
|
||||
return pQNode;
|
||||
}
|
||||
|
||||
|
||||
BOOLEAN RtmpTimerQRemove(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN RALINK_TIMER_STRUCT *pTimer)
|
||||
{
|
||||
RTMP_TIMER_TASK_ENTRY *pNode, *pPrev = NULL;
|
||||
unsigned long irqFlags;
|
||||
|
||||
RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
|
||||
if (pAd->TimerQ.status >= RTMP_TASK_STAT_INITED)
|
||||
{
|
||||
pNode = pAd->TimerQ.pQHead;
|
||||
while (pNode)
|
||||
{
|
||||
if (pNode->pRaTimer == pTimer)
|
||||
break;
|
||||
pPrev = pNode;
|
||||
pNode = pNode->pNext;
|
||||
}
|
||||
|
||||
// Now move it to freeList queue.
|
||||
if (pNode)
|
||||
{
|
||||
if (pNode == pAd->TimerQ.pQHead)
|
||||
pAd->TimerQ.pQHead = pNode->pNext;
|
||||
if (pNode == pAd->TimerQ.pQTail)
|
||||
pAd->TimerQ.pQTail = pPrev;
|
||||
if (pPrev != NULL)
|
||||
pPrev->pNext = pNode->pNext;
|
||||
|
||||
// return this queue entry to timerQFreeList.
|
||||
pNode->pNext = pAd->TimerQ.pQPollFreeList;
|
||||
pAd->TimerQ.pQPollFreeList = pNode;
|
||||
}
|
||||
}
|
||||
RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
void RtmpTimerQExit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_TIMER_TASK_ENTRY *pTimerQ;
|
||||
unsigned long irqFlags;
|
||||
|
||||
RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
|
||||
while (pAd->TimerQ.pQHead)
|
||||
{
|
||||
pTimerQ = pAd->TimerQ.pQHead;
|
||||
pAd->TimerQ.pQHead = pTimerQ->pNext;
|
||||
// remove the timeQ
|
||||
}
|
||||
pAd->TimerQ.pQPollFreeList = NULL;
|
||||
os_free_mem(pAd, pAd->TimerQ.pTimerQPoll);
|
||||
pAd->TimerQ.pQTail = NULL;
|
||||
pAd->TimerQ.pQHead = NULL;
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
pAd->TimerQ.status = RTMP_TASK_STAT_STOPED;
|
||||
#endif
|
||||
RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void RtmpTimerQInit(RTMP_ADAPTER *pAd)
|
||||
{
|
||||
int i;
|
||||
RTMP_TIMER_TASK_ENTRY *pQNode, *pEntry;
|
||||
unsigned long irqFlags;
|
||||
|
||||
NdisAllocateSpinLock(&pAd->TimerQLock);
|
||||
|
||||
NdisZeroMemory(&pAd->TimerQ, sizeof(pAd->TimerQ));
|
||||
|
||||
os_alloc_mem(pAd, &pAd->TimerQ.pTimerQPoll, sizeof(RTMP_TIMER_TASK_ENTRY) * TIMER_QUEUE_SIZE_MAX);
|
||||
if (pAd->TimerQ.pTimerQPoll)
|
||||
{
|
||||
pEntry = NULL;
|
||||
pQNode = (RTMP_TIMER_TASK_ENTRY *)pAd->TimerQ.pTimerQPoll;
|
||||
NdisZeroMemory(pAd->TimerQ.pTimerQPoll, sizeof(RTMP_TIMER_TASK_ENTRY) * TIMER_QUEUE_SIZE_MAX);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->TimerQLock, irqFlags);
|
||||
for (i = 0 ;i <TIMER_QUEUE_SIZE_MAX; i++)
|
||||
{
|
||||
pQNode->pNext = pEntry;
|
||||
pEntry = pQNode;
|
||||
pQNode++;
|
||||
}
|
||||
pAd->TimerQ.pQPollFreeList = pEntry;
|
||||
pAd->TimerQ.pQHead = NULL;
|
||||
pAd->TimerQ.pQTail = NULL;
|
||||
pAd->TimerQ.status = RTMP_TASK_STAT_INITED;
|
||||
RTMP_INT_UNLOCK(&pAd->TimerQLock, irqFlags);
|
||||
}
|
||||
}
|
||||
#endif // RTMP_TIMER_TASK_SUPPORT //
|
@ -40,6 +40,239 @@
|
||||
#include "../rt_config.h"
|
||||
#include "action.h"
|
||||
|
||||
|
||||
/* The regulatory information in the USA (US) */
|
||||
DOT11_REGULATORY_INFORMATION USARegulatoryInfo[] =
|
||||
{
|
||||
/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */
|
||||
{0, {0, 0, {0}}}, // Invlid entry
|
||||
{1, {4, 16, {36, 40, 44, 48}}},
|
||||
{2, {4, 23, {52, 56, 60, 64}}},
|
||||
{3, {4, 29, {149, 153, 157, 161}}},
|
||||
{4, {11, 23, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}},
|
||||
{5, {5, 30, {149, 153, 157, 161, 165}}},
|
||||
{6, {10, 14, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}},
|
||||
{7, {10, 27, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}},
|
||||
{8, {5, 17, {11, 13, 15, 17, 19}}},
|
||||
{9, {5, 30, {11, 13, 15, 17, 19}}},
|
||||
{10, {2, 20, {21, 25}}},
|
||||
{11, {2, 33, {21, 25}}},
|
||||
{12, {11, 30, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}}}
|
||||
};
|
||||
#define USA_REGULATORY_INFO_SIZE (sizeof(USARegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION))
|
||||
|
||||
|
||||
/* The regulatory information in Europe */
|
||||
DOT11_REGULATORY_INFORMATION EuropeRegulatoryInfo[] =
|
||||
{
|
||||
/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */
|
||||
{0, {0, 0, {0}}}, // Invalid entry
|
||||
{1, {4, 20, {36, 40, 44, 48}}},
|
||||
{2, {4, 20, {52, 56, 60, 64}}},
|
||||
{3, {11, 30, {100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140}}},
|
||||
{4, {13, 20, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}}
|
||||
};
|
||||
#define EU_REGULATORY_INFO_SIZE (sizeof(EuropeRegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION))
|
||||
|
||||
|
||||
/* The regulatory information in Japan */
|
||||
DOT11_REGULATORY_INFORMATION JapanRegulatoryInfo[] =
|
||||
{
|
||||
/* "regulatory class" "number of channels" "Max Tx Pwr" "channel list" */
|
||||
{0, {0, 0, {0}}}, // Invalid entry
|
||||
{1, {4, 22, {34, 38, 42, 46}}},
|
||||
{2, {3, 24, {8, 12, 16}}},
|
||||
{3, {3, 24, {8, 12, 16}}},
|
||||
{4, {3, 24, {8, 12, 16}}},
|
||||
{5, {3, 24, {8, 12, 16}}},
|
||||
{6, {3, 22, {8, 12, 16}}},
|
||||
{7, {4, 24, {184, 188, 192, 196}}},
|
||||
{8, {4, 24, {184, 188, 192, 196}}},
|
||||
{9, {4, 24, {184, 188, 192, 196}}},
|
||||
{10, {4, 24, {184, 188, 192, 196}}},
|
||||
{11, {4, 22, {184, 188, 192, 196}}},
|
||||
{12, {4, 24, {7, 8, 9, 11}}},
|
||||
{13, {4, 24, {7, 8, 9, 11}}},
|
||||
{14, {4, 24, {7, 8, 9, 11}}},
|
||||
{15, {4, 24, {7, 8, 9, 11}}},
|
||||
{16, {6, 24, {183, 184, 185, 187, 188, 189}}},
|
||||
{17, {6, 24, {183, 184, 185, 187, 188, 189}}},
|
||||
{18, {6, 24, {183, 184, 185, 187, 188, 189}}},
|
||||
{19, {6, 24, {183, 184, 185, 187, 188, 189}}},
|
||||
{20, {6, 17, {183, 184, 185, 187, 188, 189}}},
|
||||
{21, {6, 24, {6, 7, 8, 9, 10, 11}}},
|
||||
{22, {6, 24, {6, 7, 8, 9, 10, 11}}},
|
||||
{23, {6, 24, {6, 7, 8, 9, 10, 11}}},
|
||||
{24, {6, 24, {6, 7, 8, 9, 10, 11}}},
|
||||
{25, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}},
|
||||
{26, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}},
|
||||
{27, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}},
|
||||
{28, {8, 24, {182, 183, 184, 185, 186, 187, 188, 189}}},
|
||||
{29, {8, 17, {182, 183, 184, 185, 186, 187, 188, 189}}},
|
||||
{30, {13, 23, {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}}},
|
||||
{31, {1, 23, {14}}},
|
||||
{32, {4, 22, {52, 56, 60, 64}}}
|
||||
};
|
||||
#define JP_REGULATORY_INFO_SIZE (sizeof(JapanRegulatoryInfo) / sizeof(DOT11_REGULATORY_INFORMATION))
|
||||
|
||||
|
||||
CHAR RTMP_GetTxPwr(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN HTTRANSMIT_SETTING HTTxMode)
|
||||
{
|
||||
typedef struct __TX_PWR_CFG
|
||||
{
|
||||
UINT8 Mode;
|
||||
UINT8 MCS;
|
||||
UINT16 req;
|
||||
UINT8 shift;
|
||||
UINT32 BitMask;
|
||||
} TX_PWR_CFG;
|
||||
|
||||
UINT32 Value;
|
||||
INT Idx;
|
||||
UINT8 PhyMode;
|
||||
CHAR CurTxPwr;
|
||||
UINT8 TxPwrRef = 0;
|
||||
CHAR DaltaPwr;
|
||||
ULONG TxPwr[5];
|
||||
|
||||
|
||||
TX_PWR_CFG TxPwrCfg[] = {
|
||||
{MODE_CCK, 0, 0, 4, 0x000000f0},
|
||||
{MODE_CCK, 1, 0, 0, 0x0000000f},
|
||||
{MODE_CCK, 2, 0, 12, 0x0000f000},
|
||||
{MODE_CCK, 3, 0, 8, 0x00000f00},
|
||||
|
||||
{MODE_OFDM, 0, 0, 20, 0x00f00000},
|
||||
{MODE_OFDM, 1, 0, 16, 0x000f0000},
|
||||
{MODE_OFDM, 2, 0, 28, 0xf0000000},
|
||||
{MODE_OFDM, 3, 0, 24, 0x0f000000},
|
||||
{MODE_OFDM, 4, 1, 4, 0x000000f0},
|
||||
{MODE_OFDM, 5, 1, 0, 0x0000000f},
|
||||
{MODE_OFDM, 6, 1, 12, 0x0000f000},
|
||||
{MODE_OFDM, 7, 1, 8, 0x00000f00}
|
||||
,{MODE_HTMIX, 0, 1, 20, 0x00f00000},
|
||||
{MODE_HTMIX, 1, 1, 16, 0x000f0000},
|
||||
{MODE_HTMIX, 2, 1, 28, 0xf0000000},
|
||||
{MODE_HTMIX, 3, 1, 24, 0x0f000000},
|
||||
{MODE_HTMIX, 4, 2, 4, 0x000000f0},
|
||||
{MODE_HTMIX, 5, 2, 0, 0x0000000f},
|
||||
{MODE_HTMIX, 6, 2, 12, 0x0000f000},
|
||||
{MODE_HTMIX, 7, 2, 8, 0x00000f00},
|
||||
{MODE_HTMIX, 8, 2, 20, 0x00f00000},
|
||||
{MODE_HTMIX, 9, 2, 16, 0x000f0000},
|
||||
{MODE_HTMIX, 10, 2, 28, 0xf0000000},
|
||||
{MODE_HTMIX, 11, 2, 24, 0x0f000000},
|
||||
{MODE_HTMIX, 12, 3, 4, 0x000000f0},
|
||||
{MODE_HTMIX, 13, 3, 0, 0x0000000f},
|
||||
{MODE_HTMIX, 14, 3, 12, 0x0000f000},
|
||||
{MODE_HTMIX, 15, 3, 8, 0x00000f00}
|
||||
};
|
||||
#define MAX_TXPWR_TAB_SIZE (sizeof(TxPwrCfg) / sizeof(TX_PWR_CFG))
|
||||
|
||||
CurTxPwr = 19;
|
||||
|
||||
/* check Tx Power setting from UI. */
|
||||
if (pAd->CommonCfg.TxPowerPercentage > 90)
|
||||
;
|
||||
else if (pAd->CommonCfg.TxPowerPercentage > 60) /* reduce Pwr for 1 dB. */
|
||||
CurTxPwr -= 1;
|
||||
else if (pAd->CommonCfg.TxPowerPercentage > 30) /* reduce Pwr for 3 dB. */
|
||||
CurTxPwr -= 3;
|
||||
else if (pAd->CommonCfg.TxPowerPercentage > 15) /* reduce Pwr for 6 dB. */
|
||||
CurTxPwr -= 6;
|
||||
else if (pAd->CommonCfg.TxPowerPercentage > 9) /* reduce Pwr for 9 dB. */
|
||||
CurTxPwr -= 9;
|
||||
else /* reduce Pwr for 12 dB. */
|
||||
CurTxPwr -= 12;
|
||||
|
||||
if (pAd->CommonCfg.BBPCurrentBW == BW_40)
|
||||
{
|
||||
if (pAd->CommonCfg.CentralChannel > 14)
|
||||
{
|
||||
TxPwr[0] = pAd->Tx40MPwrCfgABand[0];
|
||||
TxPwr[1] = pAd->Tx40MPwrCfgABand[1];
|
||||
TxPwr[2] = pAd->Tx40MPwrCfgABand[2];
|
||||
TxPwr[3] = pAd->Tx40MPwrCfgABand[3];
|
||||
TxPwr[4] = pAd->Tx40MPwrCfgABand[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPwr[0] = pAd->Tx40MPwrCfgGBand[0];
|
||||
TxPwr[1] = pAd->Tx40MPwrCfgGBand[1];
|
||||
TxPwr[2] = pAd->Tx40MPwrCfgGBand[2];
|
||||
TxPwr[3] = pAd->Tx40MPwrCfgGBand[3];
|
||||
TxPwr[4] = pAd->Tx40MPwrCfgGBand[4];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (pAd->CommonCfg.Channel > 14)
|
||||
{
|
||||
TxPwr[0] = pAd->Tx20MPwrCfgABand[0];
|
||||
TxPwr[1] = pAd->Tx20MPwrCfgABand[1];
|
||||
TxPwr[2] = pAd->Tx20MPwrCfgABand[2];
|
||||
TxPwr[3] = pAd->Tx20MPwrCfgABand[3];
|
||||
TxPwr[4] = pAd->Tx20MPwrCfgABand[4];
|
||||
}
|
||||
else
|
||||
{
|
||||
TxPwr[0] = pAd->Tx20MPwrCfgGBand[0];
|
||||
TxPwr[1] = pAd->Tx20MPwrCfgGBand[1];
|
||||
TxPwr[2] = pAd->Tx20MPwrCfgGBand[2];
|
||||
TxPwr[3] = pAd->Tx20MPwrCfgGBand[3];
|
||||
TxPwr[4] = pAd->Tx20MPwrCfgGBand[4];
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
switch(HTTxMode.field.MODE)
|
||||
{
|
||||
case MODE_CCK:
|
||||
case MODE_OFDM:
|
||||
Value = TxPwr[1];
|
||||
TxPwrRef = (Value & 0x00000f00) >> 8;
|
||||
|
||||
break;
|
||||
|
||||
case MODE_HTMIX:
|
||||
case MODE_HTGREENFIELD:
|
||||
if (pAd->CommonCfg.TxStream == 1)
|
||||
{
|
||||
Value = TxPwr[2];
|
||||
TxPwrRef = (Value & 0x00000f00) >> 8;
|
||||
}
|
||||
else if (pAd->CommonCfg.TxStream == 2)
|
||||
{
|
||||
Value = TxPwr[3];
|
||||
TxPwrRef = (Value & 0x00000f00) >> 8;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
PhyMode =
|
||||
(HTTxMode.field.MODE == MODE_HTGREENFIELD)
|
||||
? MODE_HTMIX :
|
||||
HTTxMode.field.MODE;
|
||||
|
||||
for (Idx = 0; Idx < MAX_TXPWR_TAB_SIZE; Idx++)
|
||||
{
|
||||
if ((TxPwrCfg[Idx].Mode == PhyMode)
|
||||
&& (TxPwrCfg[Idx].MCS == HTTxMode.field.MCS))
|
||||
{
|
||||
Value = TxPwr[TxPwrCfg[Idx].req];
|
||||
DaltaPwr = TxPwrRef - (CHAR)((Value & TxPwrCfg[Idx].BitMask)
|
||||
>> TxPwrCfg[Idx].shift);
|
||||
CurTxPwr -= DaltaPwr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return CurTxPwr;
|
||||
}
|
||||
|
||||
|
||||
VOID MeasureReqTabInit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
@ -57,7 +290,7 @@ VOID MeasureReqTabInit(
|
||||
VOID MeasureReqTabExit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
NdisFreeSpinLock(pAd->CommonCfg.MeasureReqTabLock);
|
||||
NdisFreeSpinLock(&pAd->CommonCfg.MeasureReqTabLock);
|
||||
|
||||
if (pAd->CommonCfg.pMeasureReqTab)
|
||||
kfree(pAd->CommonCfg.pMeasureReqTab);
|
||||
@ -66,7 +299,7 @@ VOID MeasureReqTabExit(
|
||||
return;
|
||||
}
|
||||
|
||||
static PMEASURE_REQ_ENTRY MeasureReqLookUp(
|
||||
PMEASURE_REQ_ENTRY MeasureReqLookUp(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 DialogToken)
|
||||
{
|
||||
@ -102,7 +335,7 @@ static PMEASURE_REQ_ENTRY MeasureReqLookUp(
|
||||
return pEntry;
|
||||
}
|
||||
|
||||
static PMEASURE_REQ_ENTRY MeasureReqInsert(
|
||||
PMEASURE_REQ_ENTRY MeasureReqInsert(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 DialogToken)
|
||||
{
|
||||
@ -201,7 +434,7 @@ static PMEASURE_REQ_ENTRY MeasureReqInsert(
|
||||
return pEntry;
|
||||
}
|
||||
|
||||
static VOID MeasureReqDelete(
|
||||
VOID MeasureReqDelete(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 DialogToken)
|
||||
{
|
||||
@ -275,7 +508,7 @@ VOID TpcReqTabInit(
|
||||
VOID TpcReqTabExit(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
NdisFreeSpinLock(pAd->CommonCfg.TpcReqTabLock);
|
||||
NdisFreeSpinLock(&pAd->CommonCfg.TpcReqTabLock);
|
||||
|
||||
if (pAd->CommonCfg.pTpcReqTab)
|
||||
kfree(pAd->CommonCfg.pTpcReqTab);
|
||||
@ -511,6 +744,72 @@ static UINT8 GetCurTxPwr(
|
||||
return 16; /* 16 dBm */
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Get Current Transmit Power.
|
||||
|
||||
Parametrs:
|
||||
|
||||
Return : Current Time Stamp.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID InsertChannelRepIE(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
IN PSTRING pCountry,
|
||||
IN UINT8 RegulatoryClass)
|
||||
{
|
||||
ULONG TempLen;
|
||||
UINT8 Len;
|
||||
UINT8 IEId = IE_AP_CHANNEL_REPORT;
|
||||
PUCHAR pChListPtr = NULL;
|
||||
|
||||
Len = 1;
|
||||
if (strncmp(pCountry, "US", 2) == 0)
|
||||
{
|
||||
if (RegulatoryClass >= USA_REGULATORY_INFO_SIZE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: USA Unknow Requlatory class (%d)\n",
|
||||
__func__, RegulatoryClass));
|
||||
return;
|
||||
}
|
||||
|
||||
Len += USARegulatoryInfo[RegulatoryClass].ChannelSet.NumberOfChannels;
|
||||
pChListPtr = USARegulatoryInfo[RegulatoryClass].ChannelSet.ChannelList;
|
||||
}
|
||||
else if (strncmp(pCountry, "JP", 2) == 0)
|
||||
{
|
||||
if (RegulatoryClass >= JP_REGULATORY_INFO_SIZE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: JP Unknow Requlatory class (%d)\n",
|
||||
__func__, RegulatoryClass));
|
||||
return;
|
||||
}
|
||||
|
||||
Len += JapanRegulatoryInfo[RegulatoryClass].ChannelSet.NumberOfChannels;
|
||||
pChListPtr = JapanRegulatoryInfo[RegulatoryClass].ChannelSet.ChannelList;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: Unknow Country (%s)\n",
|
||||
__func__, pCountry));
|
||||
return;
|
||||
}
|
||||
|
||||
MakeOutgoingFrame(pFrameBuf, &TempLen,
|
||||
1, &IEId,
|
||||
1, &Len,
|
||||
1, &RegulatoryClass,
|
||||
Len -1, pChListPtr,
|
||||
END_OF_ARGS);
|
||||
|
||||
*pFrameLen = *pFrameLen + TempLen;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
@ -524,7 +823,7 @@ static UINT8 GetCurTxPwr(
|
||||
Return : None.
|
||||
==========================================================================
|
||||
*/
|
||||
static VOID InsertDialogToken(
|
||||
VOID InsertDialogToken(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
@ -585,7 +884,7 @@ static VOID InsertDialogToken(
|
||||
Return : None.
|
||||
==========================================================================
|
||||
*/
|
||||
static VOID InsertTpcReportIE(
|
||||
VOID InsertTpcReportIE(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
@ -679,16 +978,16 @@ static VOID InsertMeasureReqIE(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
IN UINT8 Len,
|
||||
IN PMEASURE_REQ_INFO pMeasureReqIE)
|
||||
{
|
||||
ULONG TempLen;
|
||||
UINT8 Len = sizeof(MEASURE_REQ_INFO);
|
||||
UINT8 ElementID = IE_MEASUREMENT_REQUEST;
|
||||
|
||||
MakeOutgoingFrame(pFrameBuf, &TempLen,
|
||||
1, &ElementID,
|
||||
1, &Len,
|
||||
Len, pMeasureReqIE,
|
||||
sizeof(MEASURE_REQ_INFO), pMeasureReqIE,
|
||||
END_OF_ARGS);
|
||||
|
||||
*pFrameLen = *pFrameLen + TempLen;
|
||||
@ -758,53 +1057,43 @@ static VOID InsertMeasureReportIE(
|
||||
Return : None.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID EnqueueMeasurementReq(
|
||||
VOID MakeMeasurementReqFrame(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pDA,
|
||||
OUT PUCHAR pOutBuffer,
|
||||
OUT PULONG pFrameLen,
|
||||
IN UINT8 TotalLen,
|
||||
IN UINT8 Category,
|
||||
IN UINT8 Action,
|
||||
IN UINT8 MeasureToken,
|
||||
IN UINT8 MeasureReqMode,
|
||||
IN UINT8 MeasureReqType,
|
||||
IN UINT8 MeasureCh,
|
||||
IN UINT16 MeasureDuration)
|
||||
IN UINT8 NumOfRepetitions)
|
||||
{
|
||||
PUCHAR pOutBuffer = NULL;
|
||||
NDIS_STATUS NStatus;
|
||||
ULONG FrameLen;
|
||||
HEADER_802_11 ActHdr;
|
||||
ULONG TempLen;
|
||||
MEASURE_REQ_INFO MeasureReqIE;
|
||||
UINT8 RmReqDailogToken = RandomByte(pAd);
|
||||
UINT64 MeasureStartTime = GetCurrentTimeStamp(pAd);
|
||||
|
||||
// build action frame header.
|
||||
MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pDA,
|
||||
pAd->CurrentAddress);
|
||||
|
||||
NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory
|
||||
if(NStatus != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __func__));
|
||||
return;
|
||||
}
|
||||
NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));
|
||||
FrameLen = sizeof(HEADER_802_11);
|
||||
|
||||
InsertActField(pAd, (pOutBuffer + FrameLen), &FrameLen, CATEGORY_SPECTRUM, SPEC_MRQ);
|
||||
InsertActField(pAd, (pOutBuffer + *pFrameLen), pFrameLen, Category, Action);
|
||||
|
||||
// fill Dialog Token
|
||||
InsertDialogToken(pAd, (pOutBuffer + FrameLen), &FrameLen, MeasureToken);
|
||||
InsertDialogToken(pAd, (pOutBuffer + *pFrameLen), pFrameLen, MeasureToken);
|
||||
|
||||
/* fill Number of repetitions. */
|
||||
if (Category == CATEGORY_RM)
|
||||
{
|
||||
MakeOutgoingFrame((pOutBuffer+*pFrameLen), &TempLen,
|
||||
2, &NumOfRepetitions,
|
||||
END_OF_ARGS);
|
||||
|
||||
*pFrameLen += TempLen;
|
||||
}
|
||||
|
||||
// prepare Measurement IE.
|
||||
NdisZeroMemory(&MeasureReqIE, sizeof(MEASURE_REQ_INFO));
|
||||
MeasureReqIE.Token = RmReqDailogToken;
|
||||
MeasureReqIE.Token = MeasureToken;
|
||||
MeasureReqIE.ReqMode.word = MeasureReqMode;
|
||||
MeasureReqIE.ReqType = MeasureReqType;
|
||||
MeasureReqIE.MeasureReq.ChNum = MeasureCh;
|
||||
MeasureReqIE.MeasureReq.MeasureStartTime = cpu2le64(MeasureStartTime);
|
||||
MeasureReqIE.MeasureReq.MeasureDuration = cpu2le16(MeasureDuration);
|
||||
InsertMeasureReqIE(pAd, (pOutBuffer + FrameLen), &FrameLen, &MeasureReqIE);
|
||||
|
||||
MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
InsertMeasureReqIE(pAd, (pOutBuffer+*pFrameLen), pFrameLen,
|
||||
TotalLen, &MeasureReqIE);
|
||||
|
||||
return;
|
||||
}
|
||||
@ -858,7 +1147,7 @@ VOID EnqueueMeasurementRep(
|
||||
// prepare Measurement IE.
|
||||
NdisZeroMemory(&MeasureRepIE, sizeof(MEASURE_REPORT_INFO));
|
||||
MeasureRepIE.Token = MeasureToken;
|
||||
MeasureRepIE.ReportMode.word = MeasureReqMode;
|
||||
MeasureRepIE.ReportMode = MeasureReqMode;
|
||||
MeasureRepIE.ReportType = MeasureReqType;
|
||||
InsertMeasureReportIE(pAd, (pOutBuffer + FrameLen), &FrameLen, &MeasureRepIE, ReportInfoLen, pReportInfo);
|
||||
|
||||
@ -1159,7 +1448,8 @@ static BOOLEAN PeerMeasureReqSanity(
|
||||
IN VOID *pMsg,
|
||||
IN ULONG MsgLen,
|
||||
OUT PUINT8 pDialogToken,
|
||||
OUT PMEASURE_REQ_INFO pMeasureReqInfo)
|
||||
OUT PMEASURE_REQ_INFO pMeasureReqInfo,
|
||||
OUT PMEASURE_REQ pMeasureReq)
|
||||
{
|
||||
PFRAME_802_11 Fr = (PFRAME_802_11)pMsg;
|
||||
PUCHAR pFramePtr = Fr->Octet;
|
||||
@ -1192,12 +1482,12 @@ static BOOLEAN PeerMeasureReqSanity(
|
||||
NdisMoveMemory(&pMeasureReqInfo->Token, eid_ptr->Octet, 1);
|
||||
NdisMoveMemory(&pMeasureReqInfo->ReqMode.word, eid_ptr->Octet + 1, 1);
|
||||
NdisMoveMemory(&pMeasureReqInfo->ReqType, eid_ptr->Octet + 2, 1);
|
||||
ptr = eid_ptr->Octet + 3;
|
||||
NdisMoveMemory(&pMeasureReqInfo->MeasureReq.ChNum, ptr, 1);
|
||||
ptr = (PUCHAR)(eid_ptr->Octet + 3);
|
||||
NdisMoveMemory(&pMeasureReq->ChNum, ptr, 1);
|
||||
NdisMoveMemory(&MeasureStartTime, ptr + 1, 8);
|
||||
pMeasureReqInfo->MeasureReq.MeasureStartTime = SWAP64(MeasureStartTime);
|
||||
pMeasureReq->MeasureStartTime = SWAP64(MeasureStartTime);
|
||||
NdisMoveMemory(&MeasureDuration, ptr + 9, 2);
|
||||
pMeasureReqInfo->MeasureReq.MeasureDuration = SWAP16(MeasureDuration);
|
||||
pMeasureReq->MeasureDuration = SWAP16(MeasureDuration);
|
||||
|
||||
result = TRUE;
|
||||
break;
|
||||
@ -1285,7 +1575,7 @@ static BOOLEAN PeerMeasureReportSanity(
|
||||
if (pMeasureReportInfo->ReportType == RM_BASIC)
|
||||
{
|
||||
PMEASURE_BASIC_REPORT pReport = (PMEASURE_BASIC_REPORT)pReportBuf;
|
||||
ptr = eid_ptr->Octet + 3;
|
||||
ptr = (PUCHAR)(eid_ptr->Octet + 3);
|
||||
NdisMoveMemory(&pReport->ChNum, ptr, 1);
|
||||
NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);
|
||||
NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);
|
||||
@ -1295,7 +1585,7 @@ static BOOLEAN PeerMeasureReportSanity(
|
||||
else if (pMeasureReportInfo->ReportType == RM_CCA)
|
||||
{
|
||||
PMEASURE_CCA_REPORT pReport = (PMEASURE_CCA_REPORT)pReportBuf;
|
||||
ptr = eid_ptr->Octet + 3;
|
||||
ptr = (PUCHAR)(eid_ptr->Octet + 3);
|
||||
NdisMoveMemory(&pReport->ChNum, ptr, 1);
|
||||
NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);
|
||||
NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);
|
||||
@ -1305,7 +1595,7 @@ static BOOLEAN PeerMeasureReportSanity(
|
||||
else if (pMeasureReportInfo->ReportType == RM_RPI_HISTOGRAM)
|
||||
{
|
||||
PMEASURE_RPI_REPORT pReport = (PMEASURE_RPI_REPORT)pReportBuf;
|
||||
ptr = eid_ptr->Octet + 3;
|
||||
ptr = (PUCHAR)(eid_ptr->Octet + 3);
|
||||
NdisMoveMemory(&pReport->ChNum, ptr, 1);
|
||||
NdisMoveMemory(&pReport->MeasureStartTime, ptr + 1, 8);
|
||||
NdisMoveMemory(&pReport->MeasureDuration, ptr + 9, 2);
|
||||
@ -1533,9 +1823,10 @@ static VOID PeerMeasureReqAction(
|
||||
PFRAME_802_11 pFr = (PFRAME_802_11)Elem->Msg;
|
||||
UINT8 DialogToken;
|
||||
MEASURE_REQ_INFO MeasureReqInfo;
|
||||
MEASURE_REQ MeasureReq;
|
||||
MEASURE_REPORT_MODE ReportMode;
|
||||
|
||||
if(PeerMeasureReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReqInfo))
|
||||
if(PeerMeasureReqSanity(pAd, Elem->Msg, Elem->MsgLen, &DialogToken, &MeasureReqInfo, &MeasureReq))
|
||||
{
|
||||
ReportMode.word = 0;
|
||||
ReportMode.field.Incapable = 1;
|
||||
@ -1729,8 +2020,8 @@ VOID PeerSpectrumAction(
|
||||
break;
|
||||
|
||||
case SPEC_CHANNEL_SWITCH:
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
PeerChSwAnnAction(pAd, Elem);
|
||||
break;
|
||||
}
|
||||
@ -1749,16 +2040,31 @@ VOID PeerSpectrumAction(
|
||||
*/
|
||||
INT Set_MeasureReq_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg)
|
||||
IN PSTRING arg)
|
||||
{
|
||||
UINT Aid = 1;
|
||||
UINT ArgIdx;
|
||||
PUCHAR thisChar;
|
||||
PSTRING thisChar;
|
||||
|
||||
MEASURE_REQ_MODE MeasureReqMode;
|
||||
UINT8 MeasureReqToken = RandomByte(pAd);
|
||||
UINT8 MeasureReqType = RM_BASIC;
|
||||
UINT8 MeasureCh = 1;
|
||||
UINT64 MeasureStartTime = GetCurrentTimeStamp(pAd);
|
||||
MEASURE_REQ MeasureReq;
|
||||
UINT8 TotalLen;
|
||||
|
||||
HEADER_802_11 ActHdr;
|
||||
PUCHAR pOutBuffer = NULL;
|
||||
NDIS_STATUS NStatus;
|
||||
ULONG FrameLen;
|
||||
|
||||
NStatus = MlmeAllocateMemory(pAd, (PVOID)&pOutBuffer); //Get an unused nonpaged memory
|
||||
if(NStatus != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s() allocate memory failed \n", __func__));
|
||||
goto END_OF_MEASURE_REQ;
|
||||
}
|
||||
|
||||
ArgIdx = 1;
|
||||
while ((thisChar = strsep((char **)&arg, "-")) != NULL)
|
||||
@ -1766,7 +2072,7 @@ INT Set_MeasureReq_Proc(
|
||||
switch(ArgIdx)
|
||||
{
|
||||
case 1: // Aid.
|
||||
Aid = simple_strtol(thisChar, 0, 16);
|
||||
Aid = (UINT8) simple_strtol(thisChar, 0, 16);
|
||||
break;
|
||||
|
||||
case 2: // Measurement Request Type.
|
||||
@ -1774,12 +2080,12 @@ INT Set_MeasureReq_Proc(
|
||||
if (MeasureReqType > 3)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: unknow MeasureReqType(%d)\n", __func__, MeasureReqType));
|
||||
return TRUE;
|
||||
goto END_OF_MEASURE_REQ;
|
||||
}
|
||||
break;
|
||||
|
||||
case 3: // Measurement channel.
|
||||
MeasureCh = simple_strtol(thisChar, 0, 16);
|
||||
MeasureCh = (UINT8) simple_strtol(thisChar, 0, 16);
|
||||
break;
|
||||
}
|
||||
ArgIdx++;
|
||||
@ -1789,7 +2095,7 @@ INT Set_MeasureReq_Proc(
|
||||
if (!VALID_WCID(Aid))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: unknow sta of Aid(%d)\n", __func__, Aid));
|
||||
return TRUE;
|
||||
goto END_OF_MEASURE_REQ;
|
||||
}
|
||||
|
||||
MeasureReqMode.word = 0;
|
||||
@ -1797,21 +2103,49 @@ INT Set_MeasureReq_Proc(
|
||||
|
||||
MeasureReqInsert(pAd, MeasureReqToken);
|
||||
|
||||
EnqueueMeasurementReq(pAd, pAd->MacTab.Content[Aid].Addr,
|
||||
MeasureReqToken, MeasureReqMode.word, MeasureReqType, MeasureCh, 2000);
|
||||
// build action frame header.
|
||||
MgtMacHeaderInit(pAd, &ActHdr, SUBTYPE_ACTION, 0, pAd->MacTab.Content[Aid].Addr,
|
||||
pAd->CurrentAddress);
|
||||
|
||||
NdisMoveMemory(pOutBuffer, (PCHAR)&ActHdr, sizeof(HEADER_802_11));
|
||||
FrameLen = sizeof(HEADER_802_11);
|
||||
|
||||
TotalLen = sizeof(MEASURE_REQ_INFO) + sizeof(MEASURE_REQ);
|
||||
|
||||
MakeMeasurementReqFrame(pAd, pOutBuffer, &FrameLen,
|
||||
sizeof(MEASURE_REQ_INFO), CATEGORY_RM, RM_BASIC,
|
||||
MeasureReqToken, MeasureReqMode.word,
|
||||
MeasureReqType, 0);
|
||||
|
||||
MeasureReq.ChNum = MeasureCh;
|
||||
MeasureReq.MeasureStartTime = cpu2le64(MeasureStartTime);
|
||||
MeasureReq.MeasureDuration = cpu2le16(2000);
|
||||
|
||||
{
|
||||
ULONG TempLen;
|
||||
MakeOutgoingFrame( pOutBuffer+FrameLen, &TempLen,
|
||||
sizeof(MEASURE_REQ), &MeasureReq,
|
||||
END_OF_ARGS);
|
||||
FrameLen += TempLen;
|
||||
}
|
||||
|
||||
MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, (UINT)FrameLen);
|
||||
|
||||
END_OF_MEASURE_REQ:
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
INT Set_TpcReq_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg)
|
||||
IN PSTRING arg)
|
||||
{
|
||||
UINT Aid;
|
||||
|
||||
UINT8 TpcReqToken = RandomByte(pAd);
|
||||
|
||||
Aid = simple_strtol(arg, 0, 16);
|
||||
Aid = (UINT) simple_strtol(arg, 0, 16);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s::Aid = %d\n", __func__, Aid));
|
||||
if (!VALID_WCID(Aid))
|
||||
|
@ -1,241 +0,0 @@
|
||||
# Support ATE function
|
||||
HAS_ATE=n
|
||||
|
||||
# Support 28xx QA ATE function
|
||||
HAS_28xx_QA=n
|
||||
|
||||
# Support Wpa_Supplicant
|
||||
HAS_WPA_SUPPLICANT=n
|
||||
|
||||
# Support Native WpaSupplicant for Network Maganger
|
||||
HAS_NATIVE_WPA_SUPPLICANT_SUPPORT=n
|
||||
|
||||
#Support Net interface block while Tx-Sw queue full
|
||||
HAS_BLOCK_NET_IF=n
|
||||
|
||||
#Support DFS function
|
||||
HAS_DFS_SUPPORT=n
|
||||
|
||||
#Support Carrier-Sense function
|
||||
HAS_CS_SUPPORT=n
|
||||
|
||||
#ifdef MULTI_CARD
|
||||
# Support for Multiple Cards
|
||||
HAS_MC_SUPPORT=n
|
||||
#endif // MULTI_CARD //
|
||||
|
||||
#Support for IEEE802.11e DLS
|
||||
HAS_QOS_DLS_SUPPORT=n
|
||||
|
||||
#Support for EXT_CHANNEL
|
||||
HAS_EXT_BUILD_CHANNEL_LIST=n
|
||||
|
||||
#Support for Net-SNMP
|
||||
HAS_SNMP_SUPPORT=n
|
||||
|
||||
#Support features of Single SKU.
|
||||
HAS_SINGLE_SKU_SUPPORT=n
|
||||
|
||||
#Support features of 802.11n
|
||||
HAS_DOT11_N_SUPPORT=y
|
||||
|
||||
|
||||
#################################################
|
||||
|
||||
CC := $(CROSS_COMPILE)gcc
|
||||
LD := $(CROSS_COMPILE)ld
|
||||
|
||||
WFLAGS := -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT -DLINUX -Wall -Wstrict-prototypes -Wno-trigraphs
|
||||
|
||||
|
||||
#################################################
|
||||
|
||||
#ifdef CONFIG_STA_SUPPORT
|
||||
# config for STA mode
|
||||
|
||||
ifeq ($(RT28xx_MODE),STA)
|
||||
WFLAGS += -DCONFIG_STA_SUPPORT -DDBG
|
||||
|
||||
ifeq ($(HAS_WPA_SUPPLICANT),y)
|
||||
WFLAGS += -DWPA_SUPPLICANT_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_NATIVE_WPA_SUPPLICANT_SUPPORT),y)
|
||||
WFLAGS += -DNATIVE_WPA_SUPPLICANT_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_ATE),y)
|
||||
WFLAGS += -DRALINK_ATE
|
||||
ifeq ($(HAS_28xx_QA),y)
|
||||
WFLAGS += -DRALINK_28xx_QA
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_SNMP_SUPPORT),y)
|
||||
WFLAGS += -DSNMP_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_QOS_DLS_SUPPORT),y)
|
||||
WFLAGS += -DQOS_DLS_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_DOT11_N_SUPPORT),y)
|
||||
WFLAGS += -DDOT11_N_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_CS_SUPPORT),y)
|
||||
WFLAGS += -DCARRIER_DETECTION_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_SINGLE_SKU_SUPPORT),y)
|
||||
WFLAGS += -DSINGLE_SKU
|
||||
endif
|
||||
|
||||
endif
|
||||
# endif of ifeq ($(RT28xx_MODE),STA)
|
||||
#endif // CONFIG_STA_SUPPORT //
|
||||
|
||||
#################################################
|
||||
|
||||
#################################################
|
||||
|
||||
#
|
||||
# Common compiler flag
|
||||
#
|
||||
|
||||
|
||||
ifeq ($(HAS_EXT_BUILD_CHANNEL_LIST),y)
|
||||
WFLAGS += -DEXT_BUILD_CHANNEL_LIST
|
||||
endif
|
||||
|
||||
ifeq ($(CHIPSET),2870)
|
||||
WFLAGS +=-DRT2870
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),5VT)
|
||||
#WFLAGS += -DCONFIG_5VT_ENHANCE
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_BLOCK_NET_IF),y)
|
||||
WFLAGS += -DBLOCK_NET_IF
|
||||
endif
|
||||
|
||||
ifeq ($(HAS_DFS_SUPPORT),y)
|
||||
WFLAGS += -DDFS_SUPPORT
|
||||
endif
|
||||
|
||||
#ifdef MULTI_CARD
|
||||
ifeq ($(HAS_MC_SUPPORT),y)
|
||||
WFLAGS += -DMULTIPLE_CARD_SUPPORT
|
||||
endif
|
||||
#endif // MULTI_CARD //
|
||||
|
||||
ifeq ($(HAS_LLTD),y)
|
||||
WFLAGS += -DLLTD_SUPPORT
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IXP)
|
||||
WFLAGS += -DRT_BIG_ENDIAN
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V160)
|
||||
WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V180)
|
||||
WFLAGS += -DRT_BIG_ENDIAN -DIKANOS_VX_1X0
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_TWINPASS)
|
||||
WFLAGS += -DRT_BIG_ENDIAN -DINF_TWINPASS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_DANUBE)
|
||||
WFLAGS += -DINF_DANUBE -DRT_BIG_ENDIAN
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),CAVM_OCTEON)
|
||||
WFLAGS += -DRT_BIG_ENDIAN
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BRCM_6358)
|
||||
WFLAGS += -DRT_BIG_ENDIAN
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_AMAZON_SE)
|
||||
#WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE -DBG_FT_SUPPORT
|
||||
WFLAGS += -DRT_BIG_ENDIAN -DINF_AMAZON_SE
|
||||
endif
|
||||
|
||||
#kernel build options for 2.4
|
||||
# move to Makefile outside LINUX_SRC := /opt/star/kernel/linux-2.4.27-star
|
||||
|
||||
ifeq ($(PLATFORM),STAR)
|
||||
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -Uarm -fno-common -pipe -mapcs-32 -D__LINUX_ARM_ARCH__=4 -march=armv4 -mshort-load-bytes -msoft-float -Uarm -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
|
||||
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SIGMA)
|
||||
CFLAGS := -D__KERNEL__ -I$(RT28xx_DIR)/include -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -DEM86XX_CHIP=EM86XX_CHIPID_TANGO2 -DEM86XX_REVISION=6 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT2860_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mabi=32 -march=mips32r2 -Wa,-32 -Wa,-march=mips32r2 -Wa,-mips32r2 -Wa,--trap -DMODULE $(WFLAGS)
|
||||
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),SIGMA_8622)
|
||||
CFLAGS := -D__KERNEL__ -I$(CROSS_COMPILE_INCLUDE)/include -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -march=armv4 -mtune=arm7tdmi -msoft-float -DMODULE -mshort-load-bytes -nostdinc -iwithprefix -DMODULE $(WFLAGS)
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),5VT)
|
||||
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -mlittle-endian -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -O3 -fno-omit-frame-pointer -fno-optimize-sibling-calls -fno-omit-frame-pointer -mapcs -mno-sched-prolog -mabi=apcs-gnu -mno-thumb-interwork -D__LINUX_ARM_ARCH__=5 -march=armv5te -mtune=arm926ej-s --param max-inline-insns-single=40000 -Uarm -Wdeclaration-after-statement -Wno-pointer-sign -DMODULE $(WFLAGS)
|
||||
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V160)
|
||||
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT28xx_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -march=lx4189 -Wa, -DMODULE $(WFLAGS)
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IKANOS_V180)
|
||||
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(LINUX_SRC)/include/asm/gcc -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-tango2 -I$(LINUX_SRC)/include/asm-mips/mach-generic -I$(RT28xx_DIR)/include -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -ffreestanding -O2 -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -mips32r2 -Wa, -DMODULE $(WFLAGS)
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_TWINPASS)
|
||||
CFLAGS := -D__KERNEL__ -DMODULE -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -G 0 -mno-abicalls -fno-pic -march=4kc -mips32 -Wa,--trap -pipe -mlong-calls $(WFLAGS)
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),INF_DANUBE)
|
||||
CFLAGS := -I$(RT28xx_DIR)/include $(WFLAGS) -Wundef -fno-strict-aliasing -fno-common -ffreestanding -Os -fomit-frame-pointer -G 0 -mno-abicalls -fno-pic -pipe -msoft-float -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-generic
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),BRCM_6358)
|
||||
CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include -nostdinc -iwithprefix include -D__KERNEL__ -Wall -Wstrict-prototypes -Wno-trigraphs -fno-strict-aliasing -fno-common -I $(LINUX_SRC)/include/asm/gcc -G 0 -mno-abicalls -fno-pic -pipe -finline-limit=100000 -mabi=32 -march=mips32 -Wa,-32 -Wa,-march=mips32 -Wa,-mips32 -Wa,--trap -I$(LINUX_SRC)/include/asm-mips/mach-bcm963xx -I$(LINUX_SRC)/include/asm-mips/mach-generic -Os -fomit-frame-pointer -Wdeclaration-after-statement -DMODULE -mlong-calls
|
||||
export CFLAGS
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),PC)
|
||||
ifneq (,$(findstring 2.4,$(LINUX_SRC)))
|
||||
# Linux 2.4
|
||||
CFLAGS := -D__KERNEL__ -I$(LINUX_SRC)/include -I$(RT28xx_DIR)/include -O2 -fomit-frame-pointer -fno-strict-aliasing -fno-common -pipe -mpreferred-stack-boundary=2 -march=i686 -DMODULE -DMODVERSIONS -include $(LINUX_SRC)/include/linux/modversions.h $(WFLAGS)
|
||||
export CFLAGS
|
||||
else
|
||||
# Linux 2.6
|
||||
EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),IXP)
|
||||
EXTRA_CFLAGS := -v $(WFLAGS) -I$(RT28xx_DIR)/include -mbig-endian
|
||||
endif
|
||||
|
||||
ifeq ($(PLATFORM),CAVM_OCTEON)
|
||||
EXTRA_CFLAGS := $(WFLAGS) -I$(RT28xx_DIR)/include \
|
||||
-mabi=64 $(WFLAGS)
|
||||
export CFLAGS
|
||||
endif
|
||||
|
82
drivers/staging/rt2860/crypt_hmac.h
Normal file
82
drivers/staging/rt2860/crypt_hmac.h
Normal file
@ -0,0 +1,82 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
HMAC
|
||||
|
||||
Abstract:
|
||||
FIPS 198: The Keyed-Hash Message Authentication Code (HMAC)
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2008/11/24 Create HMAC-SHA1, HMAC-SHA256
|
||||
***************************************************************************/
|
||||
#ifndef __CRYPT_HMAC_H__
|
||||
#define __CRYPT_HMAC_H__
|
||||
|
||||
#ifdef CRYPT_TESTPLAN
|
||||
#include "crypt_testplan.h"
|
||||
#else
|
||||
#include "rt_config.h"
|
||||
#endif /* CRYPT_TESTPLAN */
|
||||
|
||||
#ifdef SHA1_SUPPORT
|
||||
#define HMAC_SHA1_SUPPORT
|
||||
VOID HMAC_SHA1 (
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen);
|
||||
#endif /* SHA1_SUPPORT */
|
||||
|
||||
#ifdef SHA256_SUPPORT
|
||||
#define HMAC_SHA256_SUPPORT
|
||||
VOID HMAC_SHA256 (
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen);
|
||||
#endif /* SHA256_SUPPORT */
|
||||
|
||||
#ifdef MD5_SUPPORT
|
||||
#define HMAC_MD5_SUPPORT
|
||||
VOID HMAC_MD5 (
|
||||
IN const UINT8 Key[],
|
||||
IN UINT KeyLen,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 MAC[],
|
||||
IN UINT MACLen);
|
||||
#endif /* MD5_SUPPORT */
|
||||
|
||||
#endif /* __CRYPT_HMAC_H__ */
|
80
drivers/staging/rt2860/crypt_md5.h
Normal file
80
drivers/staging/rt2860/crypt_md5.h
Normal file
@ -0,0 +1,80 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
MD5
|
||||
|
||||
Abstract:
|
||||
RFC1321: The MD5 Message-Digest Algorithm
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2008/11/24 Create md5
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __CRYPT_MD5_H__
|
||||
#define __CRYPT_MD5_H__
|
||||
|
||||
#ifdef CRYPT_TESTPLAN
|
||||
#include "crypt_testplan.h"
|
||||
#else
|
||||
#include "rt_config.h"
|
||||
#endif /* CRYPT_TESTPLAN */
|
||||
|
||||
/* Algorithm options */
|
||||
#define MD5_SUPPORT
|
||||
|
||||
#ifdef MD5_SUPPORT
|
||||
#define MD5_BLOCK_SIZE 64 /* 512 bits = 64 bytes */
|
||||
#define MD5_DIGEST_SIZE 16 /* 128 bits = 16 bytes */
|
||||
typedef struct {
|
||||
UINT32 HashValue[4];
|
||||
UINT64 MessageLen;
|
||||
UINT8 Block[MD5_BLOCK_SIZE];
|
||||
UINT BlockLen;
|
||||
} MD5_CTX_STRUC, *PMD5_CTX_STRUC;
|
||||
|
||||
VOID MD5_Init (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX);
|
||||
VOID MD5_Hash (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX);
|
||||
VOID MD5_Append (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen);
|
||||
VOID MD5_End (
|
||||
IN MD5_CTX_STRUC *pMD5_CTX,
|
||||
OUT UINT8 DigestMessage[]);
|
||||
VOID RT_MD5 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[]);
|
||||
#endif /* MD5_SUPPORT */
|
||||
|
||||
#endif /* __CRYPT_MD5_H__ */
|
109
drivers/staging/rt2860/crypt_sha2.h
Normal file
109
drivers/staging/rt2860/crypt_sha2.h
Normal file
@ -0,0 +1,109 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
/****************************************************************************
|
||||
Module Name:
|
||||
SHA2
|
||||
|
||||
Abstract:
|
||||
FIPS 180-2: Secure Hash Standard (SHS)
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ------------------------------------------
|
||||
Eddy 2008/11/24 Create SHA1
|
||||
Eddy 2008/07/23 Create SHA256
|
||||
***************************************************************************/
|
||||
|
||||
#ifndef __CRYPT_SHA2_H__
|
||||
#define __CRYPT_SHA2_H__
|
||||
|
||||
#ifdef CRYPT_TESTPLAN
|
||||
#include "crypt_testplan.h"
|
||||
#else
|
||||
#include "rt_config.h"
|
||||
#endif /* CRYPT_TESTPLAN */
|
||||
|
||||
/* Algorithm options */
|
||||
#define SHA1_SUPPORT
|
||||
#define SHA256_SUPPORT
|
||||
|
||||
#ifdef SHA1_SUPPORT
|
||||
#define SHA1_BLOCK_SIZE 64 /* 512 bits = 64 bytes */
|
||||
#define SHA1_DIGEST_SIZE 20 /* 160 bits = 20 bytes */
|
||||
typedef struct _SHA1_CTX_STRUC {
|
||||
UINT32 HashValue[5]; /* 5 = (SHA1_DIGEST_SIZE / 32) */
|
||||
UINT64 MessageLen; /* total size */
|
||||
UINT8 Block[SHA1_BLOCK_SIZE];
|
||||
UINT BlockLen;
|
||||
} SHA1_CTX_STRUC, *PSHA1_CTX_STRUC;
|
||||
|
||||
VOID RT_SHA1_Init (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX);
|
||||
VOID SHA1_Hash (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX);
|
||||
VOID SHA1_Append (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen);
|
||||
VOID SHA1_End (
|
||||
IN SHA1_CTX_STRUC *pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[]);
|
||||
VOID RT_SHA1 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[]);
|
||||
#endif /* SHA1_SUPPORT */
|
||||
|
||||
#ifdef SHA256_SUPPORT
|
||||
#define SHA256_BLOCK_SIZE 64 /* 512 bits = 64 bytes */
|
||||
#define SHA256_DIGEST_SIZE 32 /* 256 bits = 32 bytes */
|
||||
typedef struct _SHA256_CTX_STRUC {
|
||||
UINT32 HashValue[8]; /* 8 = (SHA256_DIGEST_SIZE / 32) */
|
||||
UINT64 MessageLen; /* total size */
|
||||
UINT8 Block[SHA256_BLOCK_SIZE];
|
||||
UINT BlockLen;
|
||||
} SHA256_CTX_STRUC, *PSHA256_CTX_STRUC;
|
||||
|
||||
VOID SHA256_Init (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX);
|
||||
VOID SHA256_Hash (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX);
|
||||
VOID SHA256_Append (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX,
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen);
|
||||
VOID SHA256_End (
|
||||
IN SHA256_CTX_STRUC *pSHA_CTX,
|
||||
OUT UINT8 DigestMessage[]);
|
||||
VOID RT_SHA256 (
|
||||
IN const UINT8 Message[],
|
||||
IN UINT MessageLen,
|
||||
OUT UINT8 DigestMessage[]);
|
||||
#endif /* SHA256_SUPPORT */
|
||||
|
||||
#endif /* __CRYPT_SHA2_H__ */
|
@ -43,6 +43,33 @@
|
||||
#define WIDTH_RD_CHECK 1
|
||||
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
*
|
||||
* DFS Radar related definitions.
|
||||
*
|
||||
************************************************************************/
|
||||
//#define CARRIER_DETECT_TASK_NUM 6
|
||||
//#define RADAR_DETECT_TASK_NUM 7
|
||||
|
||||
// McuRadarState && McuCarrierState for 2880-SW-MCU
|
||||
#define FREE_FOR_TX 0
|
||||
#define WAIT_CTS_BEING_SENT 1
|
||||
#define DO_DETECTION 2
|
||||
|
||||
// McuRadarEvent
|
||||
#define RADAR_EVENT_CTS_SENT 0x01 // Host signal MCU that CTS has been sent
|
||||
#define RADAR_EVENT_CTS_CARRIER_SENT 0x02 // Host signal MCU that CTS has been sent (Carrier)
|
||||
#define RADAR_EVENT_RADAR_DETECTING 0x04 // Radar detection is on going, carrier detection hold back
|
||||
#define RADAR_EVENT_CARRIER_DETECTING 0x08 // Carrier detection is on going, radar detection hold back
|
||||
#define RADAR_EVENT_WIDTH_RADAR 0x10 // BBP == 2 radar detected
|
||||
#define RADAR_EVENT_CTS_KICKED 0x20 // Radar detection need to sent double CTS, first CTS sent
|
||||
|
||||
// McuRadarCmd
|
||||
#define DETECTION_STOP 0
|
||||
#define RADAR_DETECTION 1
|
||||
#define CARRIER_DETECTION 2
|
||||
|
||||
VOID BbpRadarDetectionStart(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
@ -77,12 +104,13 @@ ULONG RTMPReadRadarDuration(
|
||||
VOID RTMPCleanRadarDuration(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
|
||||
INT Set_ChMovingTime_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg);
|
||||
IN PSTRING arg);
|
||||
|
||||
INT Set_LongPulseRadarTh_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg);
|
||||
IN PSTRING arg);
|
||||
|
||||
|
||||
|
93
drivers/staging/rt2860/eeprom.h
Normal file
93
drivers/staging/rt2860/eeprom.h
Normal file
@ -0,0 +1,93 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
|
||||
Module Name:
|
||||
eeprom.h
|
||||
|
||||
Abstract:
|
||||
Miniport header file for eeprom related information
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
#ifndef __EEPROM_H__
|
||||
#define __EEPROM_H__
|
||||
|
||||
|
||||
|
||||
#ifdef RTMP_PCI_SUPPORT
|
||||
/*************************************************************************
|
||||
* Public function declarations for prom-based chipset
|
||||
************************************************************************/
|
||||
int rtmp_ee_prom_read16(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT Offset,
|
||||
OUT USHORT *pValue);
|
||||
|
||||
int rtmp_ee_prom_write16(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT Offset,
|
||||
IN USHORT value);
|
||||
#endif // RTMP_PCI_SUPPORT //
|
||||
#ifdef RTMP_USB_SUPPORT
|
||||
/*************************************************************************
|
||||
* Public function declarations for usb-based prom chipset
|
||||
************************************************************************/
|
||||
NTSTATUS RTUSBReadEEPROM16(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT offset,
|
||||
OUT PUSHORT pData);
|
||||
|
||||
NTSTATUS RTUSBWriteEEPROM16(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT offset,
|
||||
IN USHORT value);
|
||||
#endif // RTMP_USB_SUPPORT //
|
||||
|
||||
#ifdef RT30xx
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
int rtmp_ee_efuse_read16(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT Offset,
|
||||
OUT USHORT *pValue);
|
||||
|
||||
int rtmp_ee_efuse_write16(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN USHORT Offset,
|
||||
IN USHORT data);
|
||||
#endif // RTMP_EFUSE_SUPPORT //
|
||||
#endif // RT30xx //
|
||||
|
||||
/*************************************************************************
|
||||
* Public function declarations for prom operation callback functions setting
|
||||
************************************************************************/
|
||||
INT RtmpChipOpsEepromHook(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN INT infType);
|
||||
|
||||
#endif // __EEPROM_H__ //
|
83
drivers/staging/rt2860/iface/rtmp_pci.h
Normal file
83
drivers/staging/rt2860/iface/rtmp_pci.h
Normal file
@ -0,0 +1,83 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_PCI_H__
|
||||
#define __RTMP_PCI_H__
|
||||
|
||||
#define RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p) \
|
||||
((POS_COOKIE)handle)->pci_dev = dev_p;
|
||||
|
||||
|
||||
#ifdef LINUX
|
||||
// set driver data
|
||||
#define RT28XX_DRVDATA_SET(_a) pci_set_drvdata(_a, net_dev);
|
||||
|
||||
#define RT28XX_PUT_DEVICE(dev_p)
|
||||
|
||||
#ifndef SA_SHIRQ
|
||||
#define SA_SHIRQ IRQF_SHARED
|
||||
#endif
|
||||
|
||||
#ifdef PCI_MSI_SUPPORT
|
||||
#define RTMP_MSI_ENABLE(_pAd) \
|
||||
{ POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \
|
||||
(_pAd)->HaveMsi = pci_enable_msi(_pObj->pci_dev) == 0 ? TRUE : FALSE; \
|
||||
}
|
||||
|
||||
#define RTMP_MSI_DISABLE(_pAd) \
|
||||
{ POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \
|
||||
if (_pAd->HaveMsi == TRUE) \
|
||||
pci_disable_msi(_pObj->pci_dev); \
|
||||
_pAd->HaveMsi = FALSE; \
|
||||
}
|
||||
#else
|
||||
#define RTMP_MSI_ENABLE(_pAd) do{}while(0)
|
||||
#define RTMP_MSI_DISABLE(_pAd) do{}while(0)
|
||||
#endif // PCI_MSI_SUPPORT //
|
||||
|
||||
#define RTMP_PCI_DEV_UNMAP() \
|
||||
{ if (net_dev->base_addr) { \
|
||||
iounmap((void *)(net_dev->base_addr)); \
|
||||
release_mem_region(pci_resource_start(dev_p, 0), \
|
||||
pci_resource_len(dev_p, 0)); } \
|
||||
if (net_dev->irq) pci_release_regions(dev_p); }
|
||||
|
||||
|
||||
#define PCI_REG_READ_WORD(pci_dev, offset, Configuration) \
|
||||
if (pci_read_config_word(pci_dev, offset, ®16) == 0) \
|
||||
Configuration = le2cpu16(reg16); \
|
||||
else \
|
||||
Configuration = 0;
|
||||
|
||||
#define PCI_REG_WIRTE_WORD(pci_dev, offset, Configuration) \
|
||||
reg16 = cpu2le16(Configuration); \
|
||||
pci_write_config_word(pci_dev, offset, reg16);
|
||||
|
||||
#endif // LINUX //
|
||||
|
||||
|
||||
#endif // __RTMP_PCI_H__ //
|
200
drivers/staging/rt2860/iface/rtmp_usb.h
Normal file
200
drivers/staging/rt2860/iface/rtmp_usb.h
Normal file
@ -0,0 +1,200 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_USB_H__
|
||||
#define __RTMP_USB_H__
|
||||
|
||||
|
||||
#include "../rtusb_io.h"
|
||||
|
||||
|
||||
#ifdef LINUX
|
||||
#include <linux/usb.h>
|
||||
|
||||
typedef struct usb_device * PUSB_DEV;
|
||||
typedef struct urb *purbb_t;
|
||||
typedef struct usb_ctrlrequest devctrlrequest;
|
||||
#endif // LINUX //
|
||||
|
||||
extern UCHAR EpToQueue[6];
|
||||
|
||||
|
||||
#define RXBULKAGGRE_ZISE 12
|
||||
#define MAX_TXBULK_LIMIT (LOCAL_TXBUF_SIZE*(BULKAGGRE_ZISE-1))
|
||||
#define MAX_TXBULK_SIZE (LOCAL_TXBUF_SIZE*BULKAGGRE_ZISE)
|
||||
#define MAX_RXBULK_SIZE (LOCAL_TXBUF_SIZE*RXBULKAGGRE_ZISE)
|
||||
#define MAX_MLME_HANDLER_MEMORY 20
|
||||
|
||||
|
||||
// Flags for Bulkflags control for bulk out data
|
||||
//
|
||||
#define fRTUSB_BULK_OUT_DATA_NULL 0x00000001
|
||||
#define fRTUSB_BULK_OUT_RTS 0x00000002
|
||||
#define fRTUSB_BULK_OUT_MLME 0x00000004
|
||||
|
||||
#define fRTUSB_BULK_OUT_PSPOLL 0x00000010
|
||||
#define fRTUSB_BULK_OUT_DATA_FRAG 0x00000020
|
||||
#define fRTUSB_BULK_OUT_DATA_FRAG_2 0x00000040
|
||||
#define fRTUSB_BULK_OUT_DATA_FRAG_3 0x00000080
|
||||
#define fRTUSB_BULK_OUT_DATA_FRAG_4 0x00000100
|
||||
|
||||
#define fRTUSB_BULK_OUT_DATA_NORMAL 0x00010000
|
||||
#define fRTUSB_BULK_OUT_DATA_NORMAL_2 0x00020000
|
||||
#define fRTUSB_BULK_OUT_DATA_NORMAL_3 0x00040000
|
||||
#define fRTUSB_BULK_OUT_DATA_NORMAL_4 0x00080000
|
||||
|
||||
// TODO:move to ./ate/include/iface/ate_usb.h
|
||||
|
||||
|
||||
#define FREE_HTTX_RING(_pCookie, _pipeId, _txContext) \
|
||||
{ \
|
||||
if ((_txContext)->ENextBulkOutPosition == (_txContext)->CurWritePosition) \
|
||||
{ \
|
||||
(_txContext)->bRingEmpty = TRUE; \
|
||||
} \
|
||||
/*NdisInterlockedDecrement(&(_p)->TxCount); */\
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
USB Bulk operation related definitions
|
||||
|
||||
******************************************************************************/
|
||||
|
||||
#ifdef LINUX
|
||||
#define BULKAGGRE_ZISE 100
|
||||
#define RT28XX_PUT_DEVICE usb_put_dev
|
||||
#define RTUSB_ALLOC_URB(iso) usb_alloc_urb(iso, GFP_ATOMIC)
|
||||
#define RTUSB_SUBMIT_URB(pUrb) usb_submit_urb(pUrb, GFP_ATOMIC)
|
||||
#define RTUSB_URB_ALLOC_BUFFER(pUsb_Dev, BufSize, pDma_addr) usb_buffer_alloc(pUsb_Dev, BufSize, GFP_ATOMIC, pDma_addr)
|
||||
#define RTUSB_URB_FREE_BUFFER(pUsb_Dev, BufSize, pTransferBuf, Dma_addr) usb_buffer_free(pUsb_Dev, BufSize, pTransferBuf, Dma_addr)
|
||||
|
||||
#define RTUSB_FREE_URB(pUrb) usb_free_urb(pUrb)
|
||||
|
||||
// unlink urb
|
||||
#define RTUSB_UNLINK_URB(pUrb) usb_kill_urb(pUrb)
|
||||
|
||||
extern void dump_urb(struct urb* purb);
|
||||
|
||||
#define InterlockedIncrement atomic_inc
|
||||
#define NdisInterlockedIncrement atomic_inc
|
||||
#define InterlockedDecrement atomic_dec
|
||||
#define NdisInterlockedDecrement atomic_dec
|
||||
#define InterlockedExchange atomic_set
|
||||
|
||||
#endif // LINUX //
|
||||
|
||||
|
||||
|
||||
#define NT_SUCCESS(status) (((status) >=0) ? (TRUE):(FALSE))
|
||||
|
||||
|
||||
|
||||
#define USBD_TRANSFER_DIRECTION_OUT 0
|
||||
#define USBD_TRANSFER_DIRECTION_IN 0
|
||||
#define USBD_SHORT_TRANSFER_OK 0
|
||||
#define PURB purbb_t
|
||||
|
||||
#define PIRP PVOID
|
||||
#define NDIS_OID UINT
|
||||
#ifndef USB_ST_NOERROR
|
||||
#define USB_ST_NOERROR 0
|
||||
#endif
|
||||
|
||||
// vendor-specific control operations
|
||||
#define CONTROL_TIMEOUT_JIFFIES ( (100 * OS_HZ) / 1000)
|
||||
#define UNLINK_TIMEOUT_MS 3
|
||||
|
||||
|
||||
VOID RTUSBBulkOutDataPacketComplete(purbb_t purb, struct pt_regs *pt_regs);
|
||||
VOID RTUSBBulkOutMLMEPacketComplete(purbb_t pUrb, struct pt_regs *pt_regs);
|
||||
VOID RTUSBBulkOutNullFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs);
|
||||
VOID RTUSBBulkOutRTSFrameComplete(purbb_t pUrb, struct pt_regs *pt_regs);
|
||||
VOID RTUSBBulkOutPsPollComplete(purbb_t pUrb, struct pt_regs *pt_regs);
|
||||
VOID RTUSBBulkRxComplete(purbb_t pUrb, struct pt_regs *pt_regs);
|
||||
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
#define RTUSBMlmeUp(pAd) \
|
||||
do{ \
|
||||
RTMP_OS_TASK *_pTask = &((pAd)->mlmeTask);\
|
||||
if (_pTask->kthread_task) \
|
||||
{ \
|
||||
_pTask->kthread_running = TRUE; \
|
||||
wake_up(&_pTask->kthread_q); \
|
||||
} \
|
||||
}while(0)
|
||||
#else
|
||||
#define RTUSBMlmeUp(pAd) \
|
||||
do{ \
|
||||
RTMP_OS_TASK *_pTask = &((pAd)->mlmeTask);\
|
||||
CHECK_PID_LEGALITY(_pTask->taskPID) \
|
||||
{ \
|
||||
RTMP_SEM_EVENT_UP(&(_pTask->taskSema)); \
|
||||
}\
|
||||
}while(0)
|
||||
#endif
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
#define RTUSBCMDUp(pAd) \
|
||||
do{ \
|
||||
RTMP_OS_TASK *_pTask = &((pAd)->cmdQTask); \
|
||||
{ \
|
||||
_pTask->kthread_running = TRUE; \
|
||||
wake_up(&_pTask->kthread_q); \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
#else
|
||||
#define RTUSBCMDUp(pAd) \
|
||||
do{ \
|
||||
RTMP_OS_TASK *_pTask = &((pAd)->cmdQTask); \
|
||||
CHECK_PID_LEGALITY(_pTask->taskPID) \
|
||||
{\
|
||||
RTMP_SEM_EVENT_UP(&(_pTask->taskSema)); \
|
||||
}\
|
||||
}while(0)
|
||||
#endif
|
||||
|
||||
#define DEVICE_VENDOR_REQUEST_OUT 0x40
|
||||
#define DEVICE_VENDOR_REQUEST_IN 0xc0
|
||||
//#define INTERFACE_VENDOR_REQUEST_OUT 0x41
|
||||
//#define INTERFACE_VENDOR_REQUEST_IN 0xc1
|
||||
|
||||
#define BULKOUT_MGMT_RESET_FLAG 0x80
|
||||
|
||||
#define RTUSB_SET_BULK_FLAG(_M, _F) ((_M)->BulkFlags |= (_F))
|
||||
#define RTUSB_CLEAR_BULK_FLAG(_M, _F) ((_M)->BulkFlags &= ~(_F))
|
||||
#define RTUSB_TEST_BULK_FLAG(_M, _F) (((_M)->BulkFlags & (_F)) != 0)
|
||||
|
||||
#define RTMP_IRQ_REQUEST(net_dev) do{}while(0)
|
||||
#define RTMP_IRQ_RELEASE(net_dev) do{}while(0)
|
||||
|
||||
|
||||
#endif // __RTMP_USB_H__ //
|
@ -1,107 +0,0 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
md5.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
jan 10-28-03 Initial
|
||||
Rita 11-23-04 Modify MD5 and SHA-1
|
||||
*/
|
||||
|
||||
#ifndef uint8
|
||||
#define uint8 unsigned char
|
||||
#endif
|
||||
|
||||
#ifndef uint32
|
||||
#define uint32 unsigned long int
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef __MD5_H__
|
||||
#define __MD5_H__
|
||||
|
||||
#define MD5_MAC_LEN 16
|
||||
|
||||
typedef struct _MD5_CTX {
|
||||
UINT32 Buf[4]; // buffers of four states
|
||||
UCHAR Input[64]; // input message
|
||||
UINT32 LenInBitCount[2]; // length counter for input message, 0 up to 64 bits
|
||||
} MD5_CTX;
|
||||
|
||||
VOID MD5Init(MD5_CTX *pCtx);
|
||||
VOID MD5Update(MD5_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes);
|
||||
VOID MD5Final(UCHAR Digest[16], MD5_CTX *pCtx);
|
||||
VOID MD5Transform(UINT32 Buf[4], UINT32 Mes[16]);
|
||||
|
||||
void md5_mac(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac);
|
||||
void hmac_md5(u8 *key, size_t key_len, u8 *data, size_t data_len, u8 *mac);
|
||||
|
||||
//
|
||||
// SHA context
|
||||
//
|
||||
typedef struct _SHA_CTX
|
||||
{
|
||||
UINT32 Buf[5]; // buffers of five states
|
||||
UCHAR Input[80]; // input message
|
||||
UINT32 LenInBitCount[2]; // length counter for input message, 0 up to 64 bits
|
||||
|
||||
} SHA_CTX;
|
||||
|
||||
VOID SHAInit(SHA_CTX *pCtx);
|
||||
UCHAR SHAUpdate(SHA_CTX *pCtx, UCHAR *pData, UINT32 LenInBytes);
|
||||
VOID SHAFinal(SHA_CTX *pCtx, UCHAR Digest[20]);
|
||||
VOID SHATransform(UINT32 Buf[5], UINT32 Mes[20]);
|
||||
|
||||
#define SHA_DIGEST_LEN 20
|
||||
#endif // __MD5_H__
|
||||
|
||||
/******************************************************************************/
|
||||
#ifndef _AES_H
|
||||
#define _AES_H
|
||||
|
||||
typedef struct
|
||||
{
|
||||
uint32 erk[64]; /* encryption round keys */
|
||||
uint32 drk[64]; /* decryption round keys */
|
||||
int nr; /* number of rounds */
|
||||
}
|
||||
aes_context;
|
||||
|
||||
int rtmp_aes_set_key( aes_context *ctx, uint8 *key, int nbits );
|
||||
void rtmp_aes_encrypt( aes_context *ctx, uint8 input[16], uint8 output[16] );
|
||||
void rtmp_aes_decrypt( aes_context *ctx, uint8 input[16], uint8 output[16] );
|
||||
|
||||
void F(char *password, unsigned char *ssid, int ssidlength, int iterations, int count, unsigned char *output);
|
||||
int PasswordHash(char *password, unsigned char *ssid, int ssidlength, unsigned char *output);
|
||||
|
||||
#endif /* aes.h */
|
||||
|
@ -39,6 +39,10 @@
|
||||
#ifndef __MLME_H__
|
||||
#define __MLME_H__
|
||||
|
||||
#include "rtmp_dot11.h"
|
||||
|
||||
|
||||
|
||||
// maximum supported capability information -
|
||||
// ESS, IBSS, Privacy, Short Preamble, Spectrum mgmt, Short Slot
|
||||
#define SUPPORTED_CAPABILITY_INFO 0x0533
|
||||
@ -58,23 +62,24 @@
|
||||
#define JAP_W56 4
|
||||
#define MAX_RD_REGION 5
|
||||
|
||||
#ifdef NDIS51_MINIPORT
|
||||
#define BEACON_LOST_TIME 4000 // 2048 msec = 2 sec
|
||||
#else
|
||||
#define BEACON_LOST_TIME 4 * OS_HZ // 2048 msec = 2 sec
|
||||
#endif
|
||||
|
||||
#define DLS_TIMEOUT 1200 // unit: msec
|
||||
#define AUTH_TIMEOUT 300 // unit: msec
|
||||
#define ASSOC_TIMEOUT 300 // unit: msec
|
||||
#define JOIN_TIMEOUT 2 * OS_HZ // unit: msec
|
||||
#define JOIN_TIMEOUT 2000 // unit: msec
|
||||
#define SHORT_CHANNEL_TIME 90 // unit: msec
|
||||
#define MIN_CHANNEL_TIME 110 // unit: msec, for dual band scan
|
||||
#define MAX_CHANNEL_TIME 140 // unit: msec, for single band scan
|
||||
#define FAST_ACTIVE_SCAN_TIME 30 // Active scan waiting for probe response time
|
||||
#define CW_MIN_IN_BITS 4 // actual CwMin = 2^CW_MIN_IN_BITS - 1
|
||||
#define LINK_DOWN_TIMEOUT 20000 // unit: msec
|
||||
#define AUTO_WAKEUP_TIMEOUT 70 //unit: msec
|
||||
|
||||
|
||||
#define CW_MAX_IN_BITS 10 // actual CwMax = 2^CW_MAX_IN_BITS - 1
|
||||
|
||||
|
||||
// Note: RSSI_TO_DBM_OFFSET has been changed to variable for new RF (2004-0720).
|
||||
// SHould not refer to this constant anymore
|
||||
//#define RSSI_TO_DBM_OFFSET 120 // for RT2530 RSSI-115 = dBm
|
||||
@ -290,7 +295,7 @@ typedef struct PACKED _HT_CAPABILITY_IE{
|
||||
#define dot11BSSWidthTriggerScanInterval 300 // in sec. max interval between scan operations to be performed to detect BSS channel width trigger events.
|
||||
#define dot11OBSSScanPassiveTotalPerChannel 200 // in TU. min total amount of time that the STA scans each channel when performing a passive OBSS scan.
|
||||
#define dot11OBSSScanActiveTotalPerChannel 20 //in TU. min total amount of time that the STA scans each channel when performing a active OBSS scan
|
||||
#define dot11BSSWidthChannelTransactionDelayFactor 5 // min ratio between the delay time in performing a switch from 20MHz BSS to 20/40 BSS operation and the maxima
|
||||
#define dot11BSSWidthChannelTransactionDelayFactor 5 // min ratio between the delay time in performing a switch from 20MHz BSS to 20/40 BSS operation and the maximum
|
||||
// interval between overlapping BSS scan operations.
|
||||
#define dot11BSSScanActivityThreshold 25 // in %%, max total time that a STA may be active on the medium during a period of
|
||||
// (dot11BSSWidthChannelTransactionDelayFactor * dot11BSSWidthTriggerScanInterval) seconds without
|
||||
@ -382,7 +387,7 @@ typedef struct {
|
||||
BOOLEAN bHtEnable; // If we should use ht rate.
|
||||
BOOLEAN bPreNHt; // If we should use ht rate.
|
||||
//Substract from HT Capability IE
|
||||
UCHAR MCSSet[16]; //only supoort MCS=0-15,32 ,
|
||||
UCHAR MCSSet[16];
|
||||
} RT_HT_PHY_INFO, *PRT_HT_PHY_INFO;
|
||||
|
||||
//This structure substracts ralink supports from all 802.11n-related features.
|
||||
@ -460,60 +465,6 @@ typedef struct PACKED{
|
||||
UCHAR NewExtChanOffset;
|
||||
} NEW_EXT_CHAN_IE, *PNEW_EXT_CHAN_IE;
|
||||
|
||||
|
||||
// 4-byte HTC field. maybe included in any frame except non-QOS data frame. The Order bit must set 1.
|
||||
typedef struct PACKED {
|
||||
UINT32 MA:1; //management action payload exist in (QoS Null+HTC)
|
||||
UINT32 TRQ:1; //sounding request
|
||||
UINT32 MRQ:1; //MCS feedback. Request for a MCS feedback
|
||||
UINT32 MRSorASI:3; // MRQ Sequence identifier. unchanged during entire procedure. 0x000-0x110.
|
||||
UINT32 MFS:3; //SET to the received value of MRS. 0x111 for unsolicited MFB.
|
||||
UINT32 MFBorASC:7; //Link adaptation feedback containing recommended MCS. 0x7f for no feedback or not available
|
||||
UINT32 CalPos:2; // calibration position
|
||||
UINT32 CalSeq:2; //calibration sequence
|
||||
UINT32 FBKReq:2; //feedback request
|
||||
UINT32 CSISTEERING:2; //CSI/ STEERING
|
||||
UINT32 ZLFAnnouce:1; // ZLF announcement
|
||||
UINT32 rsv:5; //calibration sequence
|
||||
UINT32 ACConstraint:1; //feedback request
|
||||
UINT32 RDG:1; //RDG / More PPDU
|
||||
} HT_CONTROL, *PHT_CONTROL;
|
||||
|
||||
// 2-byte QOS CONTROL field
|
||||
typedef struct PACKED {
|
||||
USHORT TID:4;
|
||||
USHORT EOSP:1;
|
||||
USHORT AckPolicy:2; //0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP 3: BA
|
||||
USHORT AMsduPresent:1;
|
||||
USHORT Txop_QueueSize:8;
|
||||
} QOS_CONTROL, *PQOS_CONTROL;
|
||||
|
||||
// 2-byte Frame control field
|
||||
typedef struct PACKED {
|
||||
USHORT Ver:2; // Protocol version
|
||||
USHORT Type:2; // MSDU type
|
||||
USHORT SubType:4; // MSDU subtype
|
||||
USHORT ToDs:1; // To DS indication
|
||||
USHORT FrDs:1; // From DS indication
|
||||
USHORT MoreFrag:1; // More fragment bit
|
||||
USHORT Retry:1; // Retry status bit
|
||||
USHORT PwrMgmt:1; // Power management bit
|
||||
USHORT MoreData:1; // More data bit
|
||||
USHORT Wep:1; // Wep data
|
||||
USHORT Order:1; // Strict order expected
|
||||
} FRAME_CONTROL, *PFRAME_CONTROL;
|
||||
|
||||
typedef struct PACKED _HEADER_802_11 {
|
||||
FRAME_CONTROL FC;
|
||||
USHORT Duration;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
UCHAR Addr3[MAC_ADDR_LEN];
|
||||
USHORT Frag:4;
|
||||
USHORT Sequence:12;
|
||||
UCHAR Octet[0];
|
||||
} HEADER_802_11, *PHEADER_802_11;
|
||||
|
||||
typedef struct PACKED _FRAME_802_11 {
|
||||
HEADER_802_11 Hdr;
|
||||
UCHAR Octet[1];
|
||||
@ -595,20 +546,6 @@ typedef struct {
|
||||
} EACH_TID, *PEACH_TID;
|
||||
|
||||
|
||||
typedef struct PACKED _PSPOLL_FRAME {
|
||||
FRAME_CONTROL FC;
|
||||
USHORT Aid;
|
||||
UCHAR Bssid[MAC_ADDR_LEN];
|
||||
UCHAR Ta[MAC_ADDR_LEN];
|
||||
} PSPOLL_FRAME, *PPSPOLL_FRAME;
|
||||
|
||||
typedef struct PACKED _RTS_FRAME {
|
||||
FRAME_CONTROL FC;
|
||||
USHORT Duration;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
}RTS_FRAME, *PRTS_FRAME;
|
||||
|
||||
// BAREQ AND MTBAREQ have the same subtype BAR, 802.11n BAR use compressed bitmap.
|
||||
typedef struct PACKED _FRAME_BA_REQ {
|
||||
FRAME_CONTROL FC;
|
||||
@ -1059,7 +996,7 @@ typedef struct _MLME_START_REQ_STRUCT {
|
||||
typedef struct PACKED {
|
||||
UCHAR Eid;
|
||||
UCHAR Len;
|
||||
CHAR Octet[1];
|
||||
UCHAR Octet[1];
|
||||
} EID_STRUCT,*PEID_STRUCT, BEACON_EID_STRUCT, *PBEACON_EID_STRUCT;
|
||||
|
||||
typedef struct PACKED _RTMP_TX_RATE_SWITCH
|
||||
|
@ -37,9 +37,14 @@
|
||||
#ifndef _OID_H_
|
||||
#define _OID_H_
|
||||
|
||||
//#include <linux/wireless.h>
|
||||
|
||||
#ifndef TRUE
|
||||
#define TRUE 1
|
||||
#endif
|
||||
#ifndef FALSE
|
||||
#define FALSE 0
|
||||
#endif
|
||||
//
|
||||
// IEEE 802.11 Structures and definitions
|
||||
//
|
||||
@ -73,24 +78,25 @@
|
||||
#define NDIS_802_11_LENGTH_RATES 8
|
||||
#define NDIS_802_11_LENGTH_RATES_EX 16
|
||||
#define MAC_ADDR_LENGTH 6
|
||||
#define MAX_NUM_OF_CHS 49 // 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL terminationc
|
||||
//#define MAX_NUM_OF_CHS 49 // 14 channels @2.4G + 12@UNII + 4 @MMAC + 11 @HiperLAN2 + 7 @Japan + 1 as NULL terminationc
|
||||
#define MAX_NUM_OF_CHS 54 // 14 channels @2.4G + 12@UNII(lower/middle) + 16@HiperLAN2 + 11@UNII(upper) + 0 @Japan + 1 as NULL termination
|
||||
#define MAX_NUMBER_OF_EVENT 10 // entry # in EVENT table
|
||||
#define MAX_NUMBER_OF_MAC 32 // if MAX_MBSSID_NUM is 8, this value can't be larger than 211
|
||||
#define MAX_NUMBER_OF_ACL 64
|
||||
#define MAX_LENGTH_OF_SUPPORT_RATES 12 // 1, 2, 5.5, 11, 6, 9, 12, 18, 24, 36, 48, 54
|
||||
#define MAX_NUMBER_OF_DLS_ENTRY 4
|
||||
|
||||
#define OID_GEN_MACHINE_NAME 0x0001021A
|
||||
|
||||
#define RT_QUERY_SIGNAL_CONTEXT 0x0402
|
||||
#define RT_SET_IAPP_PID 0x0404
|
||||
#define RT_SET_APD_PID 0x0405
|
||||
#define RT_SET_DEL_MAC_ENTRY 0x0406
|
||||
|
||||
#define RT_QUERY_EVENT_TABLE 0x0407
|
||||
//
|
||||
// IEEE 802.11 OIDs
|
||||
//
|
||||
#define OID_GET_SET_TOGGLE 0x8000
|
||||
#define OID_GET_SET_FROM_UI 0x4000
|
||||
|
||||
#define OID_802_11_ADD_WEP 0x0112
|
||||
#define OID_802_11_DISASSOCIATE 0x0114
|
||||
@ -101,22 +107,28 @@
|
||||
|
||||
#define RT_OID_DEVICE_NAME 0x0607
|
||||
#define RT_OID_VERSION_INFO 0x0608
|
||||
#define OID_802_11_BSSID_LIST 0x0609
|
||||
#define OID_802_3_CURRENT_ADDRESS 0x060A
|
||||
#define OID_GEN_MEDIA_CONNECT_STATUS 0x060B
|
||||
#define RT_OID_802_11_QUERY_LINK_STATUS 0x060C
|
||||
#define OID_802_11_RSSI 0x060D
|
||||
#define OID_802_11_STATISTICS 0x060E
|
||||
#define OID_GEN_RCV_OK 0x060F
|
||||
#define OID_GEN_RCV_NO_BUFFER 0x0610
|
||||
|
||||
#define RT_OID_802_11_QUERY_EEPROM_VERSION 0x0611
|
||||
#define RT_OID_802_11_QUERY_FIRMWARE_VERSION 0x0612
|
||||
#define RT_OID_802_11_QUERY_LAST_RX_RATE 0x0613
|
||||
#define RT_OID_802_11_TX_POWER_LEVEL_1 0x0614
|
||||
#define RT_OID_802_11_QUERY_PIDVID 0x0615
|
||||
//for WPA_SUPPLICANT_SUPPORT
|
||||
#define OID_SET_COUNTERMEASURES 0x0616
|
||||
#define RT_OID_WPA_SUPPLICANT_SUPPORT 0x0621
|
||||
#define RT_OID_WE_VERSION_COMPILED 0x0622
|
||||
#define RT_OID_NEW_DRIVER 0x0623
|
||||
|
||||
//rt2860 , kathy
|
||||
#define RT_OID_DRIVER_DEVICE_NAME 0x0645
|
||||
#define RT_OID_QUERY_MULTIPLE_CARD_SUPPORT 0x0647
|
||||
|
||||
// Ralink defined OIDs
|
||||
// Dennis Lee move to platform specific
|
||||
|
||||
typedef enum _NDIS_802_11_STATUS_TYPE
|
||||
{
|
||||
Ndis802_11StatusType_Authentication,
|
||||
@ -169,10 +181,10 @@ typedef enum _NDIS_802_11_NETWORK_TYPE
|
||||
Ndis802_11FH,
|
||||
Ndis802_11DS,
|
||||
Ndis802_11OFDM5,
|
||||
Ndis802_11OFDM5_N,
|
||||
Ndis802_11OFDM24,
|
||||
Ndis802_11OFDM24_N,
|
||||
Ndis802_11Automode,
|
||||
Ndis802_11OFDM5_N,
|
||||
Ndis802_11OFDM24_N,
|
||||
Ndis802_11NetworkTypeMax // not a real type, defined as an upper bound
|
||||
} NDIS_802_11_NETWORK_TYPE, *PNDIS_802_11_NETWORK_TYPE;
|
||||
|
||||
@ -271,13 +283,15 @@ typedef struct PACKED _RADIUS_CONF
|
||||
UINT32 own_ip_addr;
|
||||
UINT32 retry_interval;
|
||||
UINT32 session_timeout_interval;
|
||||
UCHAR EAPifname[IFNAMSIZ];
|
||||
UCHAR EAPifname_len;
|
||||
UCHAR PreAuthifname[IFNAMSIZ];
|
||||
UCHAR PreAuthifname_len;
|
||||
RADIUS_KEY_INFO RadiusInfo[8/*MAX_MBSSID_NUM*/];
|
||||
UCHAR EAPifname[8][IFNAMSIZ];
|
||||
UCHAR EAPifname_len[8];
|
||||
UCHAR PreAuthifname[8][IFNAMSIZ];
|
||||
UCHAR PreAuthifname_len[8];
|
||||
RADIUS_KEY_INFO RadiusInfo[8];
|
||||
} RADIUS_CONF, *PRADIUS_CONF;
|
||||
|
||||
|
||||
|
||||
// Key mapping keys require a BSSID
|
||||
typedef struct _NDIS_802_11_KEY
|
||||
{
|
||||
@ -289,6 +303,13 @@ typedef struct _NDIS_802_11_KEY
|
||||
UCHAR KeyMaterial[1]; // variable length depending on above field
|
||||
} NDIS_802_11_KEY, *PNDIS_802_11_KEY;
|
||||
|
||||
typedef struct _NDIS_802_11_PASSPHRASE
|
||||
{
|
||||
UINT KeyLength; // length of key in bytes
|
||||
NDIS_802_11_MAC_ADDRESS BSSID;
|
||||
UCHAR KeyMaterial[1]; // variable length depending on above field
|
||||
} NDIS_802_11_PASSPHRASE, *PNDIS_802_11_PASSPHRASE;
|
||||
|
||||
typedef struct _NDIS_802_11_REMOVE_KEY
|
||||
{
|
||||
UINT Length; // Length of this structure
|
||||
@ -481,6 +502,19 @@ typedef struct _NDIS_802_11_AUTHENTICATION_EVENT
|
||||
NDIS_802_11_AUTHENTICATION_REQUEST Request[1];
|
||||
} NDIS_802_11_AUTHENTICATION_EVENT, *PNDIS_802_11_AUTHENTICATION_EVENT;
|
||||
|
||||
/*
|
||||
typedef struct _NDIS_802_11_TEST
|
||||
{
|
||||
ULONG Length;
|
||||
ULONG Type;
|
||||
union
|
||||
{
|
||||
NDIS_802_11_AUTHENTICATION_EVENT AuthenticationEvent;
|
||||
NDIS_802_11_RSSI RssiTrigger;
|
||||
};
|
||||
} NDIS_802_11_TEST, *PNDIS_802_11_TEST;
|
||||
*/
|
||||
|
||||
// 802.11 Media stream constraints, associated with OID_802_11_MEDIA_STREAM_MODE
|
||||
typedef enum _NDIS_802_11_MEDIA_STREAM_MODE
|
||||
{
|
||||
@ -519,14 +553,18 @@ typedef struct _NDIS_802_11_CAPABILITY
|
||||
NDIS_802_11_AUTHENTICATION_ENCRYPTION AuthenticationEncryptionSupported[1];
|
||||
} NDIS_802_11_CAPABILITY, *PNDIS_802_11_CAPABILITY;
|
||||
|
||||
#define RT_PRIV_IOCTL_EXT (SIOCIWFIRSTPRIV + 0x01) // Sync. with AP for wsc upnp daemon
|
||||
#ifdef LINUX
|
||||
#endif // LINUX //
|
||||
|
||||
|
||||
#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x01) // Sync. with AP for wsc upnp daemon
|
||||
#define RTPRIV_IOCTL_SET (SIOCIWFIRSTPRIV + 0x02)
|
||||
|
||||
#define RTPRIV_IOCTL_STATISTICS (SIOCIWFIRSTPRIV + 0x09)
|
||||
#define RTPRIV_IOCTL_ADD_PMKID_CACHE (SIOCIWFIRSTPRIV + 0x0A)
|
||||
#define RTPRIV_IOCTL_RADIUS_DATA (SIOCIWFIRSTPRIV + 0x0C)
|
||||
#define RTPRIV_IOCTL_GSITESURVEY (SIOCIWFIRSTPRIV + 0x0D)
|
||||
#define RT_PRIV_IOCTL (SIOCIWFIRSTPRIV + 0x0E) // Sync. with RT61 (for wpa_supplicant)
|
||||
#define RT_PRIV_IOCTL_EXT (SIOCIWFIRSTPRIV + 0x0E) // Sync. with RT61 (for wpa_supplicant)
|
||||
#define RTPRIV_IOCTL_GET_MAC_TABLE (SIOCIWFIRSTPRIV + 0x0F)
|
||||
|
||||
#define RTPRIV_IOCTL_SHOW (SIOCIWFIRSTPRIV + 0x11)
|
||||
@ -535,27 +573,54 @@ enum {
|
||||
SHOW_DRVIER_VERION = 5,
|
||||
SHOW_BA_INFO = 6,
|
||||
SHOW_DESC_INFO = 7,
|
||||
#ifdef RT2870
|
||||
#ifdef RTMP_MAC_USB
|
||||
SHOW_RXBULK_INFO = 8,
|
||||
SHOW_TXBULK_INFO = 9,
|
||||
#endif // RT2870 //
|
||||
#endif // RTMP_MAC_USB //
|
||||
RAIO_OFF = 10,
|
||||
RAIO_ON = 11,
|
||||
SHOW_CFG_VALUE = 20,
|
||||
#if !defined(RT2860)
|
||||
SHOW_ADHOC_ENTRY_INFO = 21,
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef LLTD_SUPPORT
|
||||
// for consistency with RT61
|
||||
#define RT_OID_GET_PHY_MODE 0x761
|
||||
#endif // LLTD_SUPPORT //
|
||||
|
||||
#if defined(RT2860) || defined(RT30xx)
|
||||
|
||||
|
||||
|
||||
|
||||
#define OID_802_11_BUILD_CHANNEL_EX 0x0714
|
||||
#define OID_802_11_GET_CH_LIST 0x0715
|
||||
#define OID_802_11_GET_COUNTRY_CODE 0x0716
|
||||
#define OID_802_11_GET_CHANNEL_GEOGRAPHY 0x0717
|
||||
|
||||
//#define RT_OID_802_11_STATISTICS (OID_GET_SET_TOGGLE | OID_802_11_STATISTICS)
|
||||
|
||||
#define RT_OID_WSC_SET_PASSPHRASE 0x0740 // passphrase for wpa(2)-psk
|
||||
#define RT_OID_WSC_DRIVER_AUTO_CONNECT 0x0741
|
||||
#define RT_OID_WSC_QUERY_DEFAULT_PROFILE 0x0742
|
||||
#define RT_OID_WSC_SET_CONN_BY_PROFILE_INDEX 0x0743
|
||||
#define RT_OID_WSC_SET_ACTION 0x0744
|
||||
#define RT_OID_WSC_SET_SSID 0x0745
|
||||
#define RT_OID_WSC_SET_PIN_CODE 0x0746
|
||||
#define RT_OID_WSC_SET_MODE 0x0747 // PIN or PBC
|
||||
#define RT_OID_WSC_SET_CONF_MODE 0x0748 // Enrollee or Registrar
|
||||
#define RT_OID_WSC_SET_PROFILE 0x0749
|
||||
#define RT_OID_WSC_CONFIG_STATUS 0x074F
|
||||
#define RT_OID_802_11_WSC_QUERY_PROFILE 0x0750
|
||||
// for consistency with RT61
|
||||
#define RT_OID_WSC_QUERY_STATUS 0x0751
|
||||
#define RT_OID_WSC_PIN_CODE 0x0752
|
||||
#define RT_OID_WSC_UUID 0x0753
|
||||
#define RT_OID_WSC_SET_SELECTED_REGISTRAR 0x0754
|
||||
#define RT_OID_WSC_EAPMSG 0x0755
|
||||
#define RT_OID_WSC_MANUFACTURER 0x0756
|
||||
#define RT_OID_WSC_MODEL_NAME 0x0757
|
||||
#define RT_OID_WSC_MODEL_NO 0x0758
|
||||
#define RT_OID_WSC_SERIAL_NO 0x0759
|
||||
#define RT_OID_WSC_MAC_ADDRESS 0x0760
|
||||
|
||||
// New for MeetingHouse Api support
|
||||
#define OID_MH_802_1X_SUPPORTED 0xFFEDC100
|
||||
#endif
|
||||
|
||||
// MIMO Tx parameter, ShortGI, MCS, STBC, etc. these are fields in TXWI. Don't change this definition!!!
|
||||
typedef union _HTTRANSMIT_SETTING {
|
||||
@ -564,6 +629,7 @@ typedef union _HTTRANSMIT_SETTING {
|
||||
USHORT BW:1; //channel bandwidth 20MHz or 40 MHz
|
||||
USHORT ShortGI:1;
|
||||
USHORT STBC:2; //SPACE
|
||||
// USHORT rsv:3;
|
||||
USHORT rsv:2;
|
||||
USHORT TxBF:1;
|
||||
USHORT MODE:2; // Use definition MODE_xxx.
|
||||
@ -577,7 +643,6 @@ typedef enum _RT_802_11_PREAMBLE {
|
||||
Rt802_11PreambleAuto
|
||||
} RT_802_11_PREAMBLE, *PRT_802_11_PREAMBLE;
|
||||
|
||||
// Only for STA, need to sync with AP
|
||||
typedef enum _RT_802_11_PHY_MODE {
|
||||
PHY_11BG_MIXED = 0,
|
||||
PHY_11B,
|
||||
@ -744,19 +809,6 @@ typedef struct {
|
||||
UCHAR rsv;
|
||||
} OID_SET_HT_PHYMODE, *POID_SET_HT_PHYMODE;
|
||||
|
||||
#ifdef LLTD_SUPPORT
|
||||
typedef struct _RT_LLTD_ASSOICATION_ENTRY {
|
||||
UCHAR Addr[ETH_LENGTH_OF_ADDRESS];
|
||||
unsigned short MOR; // maximum operational rate
|
||||
UCHAR phyMode;
|
||||
} RT_LLTD_ASSOICATION_ENTRY, *PRT_LLTD_ASSOICATION_ENTRY;
|
||||
|
||||
typedef struct _RT_LLTD_ASSOICATION_TABLE {
|
||||
unsigned int Num;
|
||||
RT_LLTD_ASSOICATION_ENTRY Entry[MAX_NUMBER_OF_MAC];
|
||||
} RT_LLTD_ASSOICATION_TABLE, *PRT_LLTD_ASSOICATION_TABLE;
|
||||
#endif // LLTD_SUPPORT //
|
||||
|
||||
#define MAX_CUSTOM_LEN 128
|
||||
|
||||
typedef enum _RT_802_11_D_CLIENT_MODE
|
||||
@ -772,7 +824,6 @@ typedef struct _RT_CHANNEL_LIST_INFO
|
||||
UCHAR ChannelListNum; // number of channel in ChannelList[]
|
||||
} RT_CHANNEL_LIST_INFO, *PRT_CHANNEL_LIST_INFO;
|
||||
|
||||
#ifdef RT2870
|
||||
// WSC configured credential
|
||||
typedef struct _WSC_CREDENTIAL
|
||||
{
|
||||
@ -790,9 +841,9 @@ typedef struct _WSC_CREDENTIAL
|
||||
typedef struct _WSC_PROFILE
|
||||
{
|
||||
UINT ProfileCnt;
|
||||
UINT ApplyProfileIdx; // add by johnli, fix WPS test plan 5.1.1
|
||||
WSC_CREDENTIAL Profile[8]; // Support up to 8 profiles
|
||||
} WSC_PROFILE, *PWSC_PROFILE;
|
||||
#endif
|
||||
|
||||
#endif // _OID_H_
|
||||
|
||||
|
873
drivers/staging/rt2860/pci_main_dev.c
Normal file
873
drivers/staging/rt2860/pci_main_dev.c
Normal file
@ -0,0 +1,873 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
pci_main_dev.c
|
||||
|
||||
Abstract:
|
||||
Create and register network interface for PCI based chipsets in Linux platform.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
#include <linux/pci.h>
|
||||
|
||||
//
|
||||
// Function declarations
|
||||
//
|
||||
extern int rt28xx_close(IN struct net_device *net_dev);
|
||||
extern int rt28xx_open(struct net_device *net_dev);
|
||||
|
||||
static VOID __devexit rt2860_remove_one(struct pci_dev *pci_dev);
|
||||
static INT __devinit rt2860_probe(struct pci_dev *pci_dev, const struct pci_device_id *ent);
|
||||
static void __exit rt2860_cleanup_module(void);
|
||||
static int __init rt2860_init_module(void);
|
||||
|
||||
static VOID RTMPInitPCIeDevice(
|
||||
IN struct pci_dev *pci_dev,
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int rt2860_suspend(struct pci_dev *pci_dev, pm_message_t state);
|
||||
static int rt2860_resume(struct pci_dev *pci_dev);
|
||||
#endif // CONFIG_PM //
|
||||
|
||||
//
|
||||
// Ralink PCI device table, include all supported chipsets
|
||||
//
|
||||
static struct pci_device_id rt2860_pci_tbl[] __devinitdata =
|
||||
{
|
||||
{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCI_DEVICE_ID)}, //RT28602.4G
|
||||
{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2860_PCIe_DEVICE_ID)},
|
||||
{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2760_PCI_DEVICE_ID)},
|
||||
{PCI_DEVICE(NIC_PCI_VENDOR_ID, NIC2790_PCIe_DEVICE_ID)},
|
||||
{PCI_DEVICE(VEN_AWT_PCI_VENDOR_ID, VEN_AWT_PCIe_DEVICE_ID)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7708)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7728)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7758)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7727)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7738)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7748)},
|
||||
{PCI_DEVICE(EDIMAX_PCI_VENDOR_ID, 0x7768)},
|
||||
{0,} // terminate list
|
||||
};
|
||||
|
||||
MODULE_DEVICE_TABLE(pci, rt2860_pci_tbl);
|
||||
MODULE_LICENSE("GPL");
|
||||
#ifdef MODULE_VERSION
|
||||
MODULE_VERSION(STA_DRIVER_VERSION);
|
||||
#endif
|
||||
|
||||
|
||||
//
|
||||
// Our PCI driver structure
|
||||
//
|
||||
static struct pci_driver rt2860_driver =
|
||||
{
|
||||
name: "rt2860",
|
||||
id_table: rt2860_pci_tbl,
|
||||
probe: rt2860_probe,
|
||||
remove: __devexit_p(rt2860_remove_one),
|
||||
#ifdef CONFIG_PM
|
||||
suspend: rt2860_suspend,
|
||||
resume: rt2860_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* PCI device initialization related procedures.
|
||||
*
|
||||
***************************************************************************/
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
VOID RT2860RejectPendingPackets(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
// clear PS packets
|
||||
// clear TxSw packets
|
||||
}
|
||||
|
||||
static int rt2860_suspend(
|
||||
struct pci_dev *pci_dev,
|
||||
pm_message_t state)
|
||||
{
|
||||
struct net_device *net_dev = pci_get_drvdata(pci_dev);
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL;
|
||||
INT32 retval = 0;
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_suspend()\n"));
|
||||
|
||||
if (net_dev == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
|
||||
}
|
||||
else
|
||||
{
|
||||
GET_PAD_FROM_NET_DEV(pAd, net_dev);
|
||||
|
||||
/* we can not use IFF_UP because ra0 down but ra1 up */
|
||||
/* and 1 suspend/resume function for 1 module, not for each interface */
|
||||
/* so Linux will call suspend/resume function once */
|
||||
if (VIRTUAL_IF_NUM(pAd) > 0)
|
||||
{
|
||||
// avoid users do suspend after interface is down
|
||||
|
||||
// stop interface
|
||||
netif_carrier_off(net_dev);
|
||||
netif_stop_queue(net_dev);
|
||||
|
||||
// mark device as removed from system and therefore no longer available
|
||||
netif_device_detach(net_dev);
|
||||
|
||||
// mark halt flag
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
|
||||
|
||||
// take down the device
|
||||
rt28xx_close((PNET_DEV)net_dev);
|
||||
|
||||
RT_MOD_DEC_USE_COUNT();
|
||||
}
|
||||
}
|
||||
|
||||
// reference to http://vovo2000.com/type-lab/linux/kernel-api/linux-kernel-api.html
|
||||
// enable device to generate PME# when suspended
|
||||
// pci_choose_state(): Choose the power state of a PCI device to be suspended
|
||||
retval = pci_enable_wake(pci_dev, pci_choose_state(pci_dev, state), 1);
|
||||
// save the PCI configuration space of a device before suspending
|
||||
pci_save_state(pci_dev);
|
||||
// disable PCI device after use
|
||||
pci_disable_device(pci_dev);
|
||||
|
||||
retval = pci_set_power_state(pci_dev, pci_choose_state(pci_dev, state));
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_suspend()\n"));
|
||||
return retval;
|
||||
}
|
||||
|
||||
static int rt2860_resume(
|
||||
struct pci_dev *pci_dev)
|
||||
{
|
||||
struct net_device *net_dev = pci_get_drvdata(pci_dev);
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL;
|
||||
INT32 retval;
|
||||
|
||||
|
||||
// set the power state of a PCI device
|
||||
// PCI has 4 power states, DO (normal) ~ D3(less power)
|
||||
// in include/linux/pci.h, you can find that
|
||||
// #define PCI_D0 ((pci_power_t __force) 0)
|
||||
// #define PCI_D1 ((pci_power_t __force) 1)
|
||||
// #define PCI_D2 ((pci_power_t __force) 2)
|
||||
// #define PCI_D3hot ((pci_power_t __force) 3)
|
||||
// #define PCI_D3cold ((pci_power_t __force) 4)
|
||||
// #define PCI_UNKNOWN ((pci_power_t __force) 5)
|
||||
// #define PCI_POWER_ERROR ((pci_power_t __force) -1)
|
||||
retval = pci_set_power_state(pci_dev, PCI_D0);
|
||||
|
||||
// restore the saved state of a PCI device
|
||||
pci_restore_state(pci_dev);
|
||||
|
||||
// initialize device before it's used by a driver
|
||||
if (pci_enable_device(pci_dev))
|
||||
{
|
||||
printk("pci enable fail!\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_resume()\n"));
|
||||
|
||||
if (net_dev == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("net_dev == NULL!\n"));
|
||||
}
|
||||
else
|
||||
GET_PAD_FROM_NET_DEV(pAd, net_dev);
|
||||
|
||||
if (pAd != NULL)
|
||||
{
|
||||
/* we can not use IFF_UP because ra0 down but ra1 up */
|
||||
/* and 1 suspend/resume function for 1 module, not for each interface */
|
||||
/* so Linux will call suspend/resume function once */
|
||||
if (VIRTUAL_IF_NUM(pAd) > 0)
|
||||
{
|
||||
// mark device as attached from system and restart if needed
|
||||
netif_device_attach(net_dev);
|
||||
|
||||
if (rt28xx_open((PNET_DEV)net_dev) != 0)
|
||||
{
|
||||
// open fail
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
// increase MODULE use count
|
||||
RT_MOD_INC_USE_COUNT();
|
||||
|
||||
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_RADIO_OFF);
|
||||
|
||||
netif_start_queue(net_dev);
|
||||
netif_carrier_on(net_dev);
|
||||
netif_wake_queue(net_dev);
|
||||
}
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_resume()\n"));
|
||||
return 0;
|
||||
}
|
||||
#endif // CONFIG_PM //
|
||||
|
||||
|
||||
static INT __init rt2860_init_module(VOID)
|
||||
{
|
||||
return pci_register_driver(&rt2860_driver);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Driver module unload function
|
||||
//
|
||||
static VOID __exit rt2860_cleanup_module(VOID)
|
||||
{
|
||||
pci_unregister_driver(&rt2860_driver);
|
||||
}
|
||||
|
||||
module_init(rt2860_init_module);
|
||||
module_exit(rt2860_cleanup_module);
|
||||
|
||||
|
||||
//
|
||||
// PCI device probe & initialization function
|
||||
//
|
||||
static INT __devinit rt2860_probe(
|
||||
IN struct pci_dev *pci_dev,
|
||||
IN const struct pci_device_id *pci_id)
|
||||
{
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)NULL;
|
||||
struct net_device *net_dev;
|
||||
PVOID handle;
|
||||
PSTRING print_name;
|
||||
ULONG csr_addr;
|
||||
INT rv = 0;
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevHook;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_probe\n"));
|
||||
|
||||
//PCIDevInit==============================================
|
||||
// wake up and enable device
|
||||
if ((rv = pci_enable_device(pci_dev))!= 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Enable PCI device failed, errno=%d!\n", rv));
|
||||
return rv;
|
||||
}
|
||||
|
||||
print_name = pci_name(pci_dev);
|
||||
|
||||
if ((rv = pci_request_regions(pci_dev, print_name)) != 0)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Request PCI resource failed, errno=%d!\n", rv));
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
// map physical address to virtual address for accessing register
|
||||
csr_addr = (unsigned long) ioremap(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0));
|
||||
if (!csr_addr)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("ioremap failed for device %s, region 0x%lX @ 0x%lX\n",
|
||||
print_name, (ULONG)pci_resource_len(pci_dev, 0), (ULONG)pci_resource_start(pci_dev, 0)));
|
||||
goto err_out_free_res;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s: at 0x%lx, VA 0x%lx, IRQ %d. \n", print_name,
|
||||
(ULONG)pci_resource_start(pci_dev, 0), (ULONG)csr_addr, pci_dev->irq));
|
||||
}
|
||||
|
||||
// Set DMA master
|
||||
pci_set_master(pci_dev);
|
||||
|
||||
|
||||
//RtmpDevInit==============================================
|
||||
// Allocate RTMP_ADAPTER adapter structure
|
||||
handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
|
||||
if (handle == NULL)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Allocate memory for os handle failed!\n", __func__));
|
||||
goto err_out_iounmap;
|
||||
}
|
||||
|
||||
((POS_COOKIE)handle)->pci_dev = pci_dev;
|
||||
|
||||
rv = RTMPAllocAdapterBlock(handle, &pAd); //shiang: we may need the pci_dev for allocate structure of "RTMP_ADAPTER"
|
||||
if (rv != NDIS_STATUS_SUCCESS)
|
||||
goto err_out_iounmap;
|
||||
// Here are the RTMP_ADAPTER structure with pci-bus specific parameters.
|
||||
pAd->CSRBaseAddress = (PUCHAR)csr_addr;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("pAd->CSRBaseAddress =0x%lx, csr_addr=0x%lx!\n", (ULONG)pAd->CSRBaseAddress, csr_addr));
|
||||
RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_PCI);
|
||||
|
||||
|
||||
//NetDevInit==============================================
|
||||
net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);
|
||||
if (net_dev == NULL)
|
||||
goto err_out_free_radev;
|
||||
|
||||
// Here are the net_device structure with pci-bus specific parameters.
|
||||
net_dev->irq = pci_dev->irq; // Interrupt IRQ number
|
||||
net_dev->base_addr = csr_addr; // Save CSR virtual address and irq to device structure
|
||||
pci_set_drvdata(pci_dev, net_dev); // Set driver data
|
||||
|
||||
/* for supporting Network Manager */
|
||||
/* Set the sysfs physical device reference for the network logical device
|
||||
* if set prior to registration will cause a symlink during initialization.
|
||||
*/
|
||||
SET_NETDEV_DEV(net_dev, &(pci_dev->dev));
|
||||
|
||||
|
||||
//All done, it's time to register the net device to linux kernel.
|
||||
// Register this device
|
||||
rv = RtmpOSNetDevAttach(net_dev, &netDevHook);
|
||||
if (rv)
|
||||
goto err_out_free_netdev;
|
||||
|
||||
pAd->StaCfg.OriDevType = net_dev->type;
|
||||
RTMPInitPCIeDevice(pci_dev, pAd);
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
#endif // KTHREAD_SUPPORT //
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2860_probe\n"));
|
||||
|
||||
return 0; // probe ok
|
||||
|
||||
|
||||
/* --------------------------- ERROR HANDLE --------------------------- */
|
||||
err_out_free_netdev:
|
||||
RtmpOSNetDevFree(net_dev);
|
||||
|
||||
err_out_free_radev:
|
||||
/* free RTMP_ADAPTER strcuture and os_cookie*/
|
||||
RTMPFreeAdapter(pAd);
|
||||
|
||||
err_out_iounmap:
|
||||
iounmap((void *)(csr_addr));
|
||||
release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0));
|
||||
|
||||
err_out_free_res:
|
||||
pci_release_regions(pci_dev);
|
||||
|
||||
err_out:
|
||||
pci_disable_device(pci_dev);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("<=== rt2860_probe failed with rv = %d!\n", rv));
|
||||
|
||||
return -ENODEV; /* probe fail */
|
||||
}
|
||||
|
||||
|
||||
static VOID __devexit rt2860_remove_one(
|
||||
IN struct pci_dev *pci_dev)
|
||||
{
|
||||
PNET_DEV net_dev = pci_get_drvdata(pci_dev);
|
||||
RTMP_ADAPTER *pAd = NULL;
|
||||
ULONG csr_addr = net_dev->base_addr; // pAd->CSRBaseAddress;
|
||||
|
||||
GET_PAD_FROM_NET_DEV(pAd, net_dev);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2860_remove_one\n"));
|
||||
|
||||
if (pAd != NULL)
|
||||
{
|
||||
// Unregister/Free all allocated net_device.
|
||||
RtmpPhyNetDevExit(pAd, net_dev);
|
||||
|
||||
// Unmap CSR base address
|
||||
iounmap((char *)(csr_addr));
|
||||
|
||||
// release memory region
|
||||
release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0));
|
||||
|
||||
// Free RTMP_ADAPTER related structures.
|
||||
RtmpRaDevCtrlExit(pAd);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
// Unregister network device
|
||||
RtmpOSNetDevDetach(net_dev);
|
||||
|
||||
// Unmap CSR base address
|
||||
iounmap((char *)(net_dev->base_addr));
|
||||
|
||||
// release memory region
|
||||
release_mem_region(pci_resource_start(pci_dev, 0), pci_resource_len(pci_dev, 0));
|
||||
}
|
||||
|
||||
// Free the root net_device
|
||||
RtmpOSNetDevFree(net_dev);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Check the chipset vendor/product ID.
|
||||
|
||||
Arguments:
|
||||
_dev_p Point to the PCI or USB device
|
||||
|
||||
Return Value:
|
||||
TRUE Check ok
|
||||
FALSE Check fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RT28XXChipsetCheck(
|
||||
IN void *_dev_p)
|
||||
{
|
||||
/* always TRUE */
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* PCIe device initialization related procedures.
|
||||
*
|
||||
***************************************************************************/
|
||||
static VOID RTMPInitPCIeDevice(
|
||||
IN struct pci_dev *pci_dev,
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
USHORT device_id;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
pci_read_config_word(pci_dev, PCI_DEVICE_ID, &device_id);
|
||||
device_id = le2cpu16(device_id);
|
||||
pObj->DeviceID = device_id;
|
||||
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
|
||||
if (
|
||||
(device_id == NIC2860_PCIe_DEVICE_ID) ||
|
||||
(device_id == NIC2790_PCIe_DEVICE_ID) ||
|
||||
(device_id == VEN_AWT_PCIe_DEVICE_ID) ||
|
||||
0)
|
||||
{
|
||||
UINT32 MacCsr0 = 0, Index= 0;
|
||||
do
|
||||
{
|
||||
RTMP_IO_READ32(pAd, MAC_CSR0, &MacCsr0);
|
||||
|
||||
if ((MacCsr0 != 0x00) && (MacCsr0 != 0xFFFFFFFF))
|
||||
break;
|
||||
|
||||
RTMPusecDelay(10);
|
||||
} while (Index++ < 100);
|
||||
|
||||
// Support advanced power save after 2892/2790.
|
||||
// MAC version at offset 0x1000 is 0x2872XXXX/0x2870XXXX(PCIe, USB, SDIO).
|
||||
if ((MacCsr0&0xffff0000) != 0x28600000)
|
||||
{
|
||||
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
VOID RTMPInitPCIeLinkCtrlValue(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
INT pos;
|
||||
USHORT reg16, data2, PCIePowerSaveLevel, Configuration;
|
||||
BOOLEAN bFindIntel = FALSE;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
|
||||
// Init EEPROM, and save settings
|
||||
if (!IS_RT3090(pAd))
|
||||
{
|
||||
RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
|
||||
pAd->PCIePowerSaveLevel = PCIePowerSaveLevel & 0xff;
|
||||
|
||||
if ((PCIePowerSaveLevel&0xff) == 0xff)
|
||||
{
|
||||
OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("====> PCIePowerSaveLevel = 0x%x.\n", PCIePowerSaveLevel));
|
||||
return;
|
||||
}
|
||||
else
|
||||
{
|
||||
PCIePowerSaveLevel &= 0x3;
|
||||
RT28xx_EEPROM_READ16(pAd, 0x24, data2);
|
||||
|
||||
if( !(((data2&0xff00) == 0x9200) && ((data2&0x80) !=0)) )
|
||||
{
|
||||
if (PCIePowerSaveLevel > 1 )
|
||||
PCIePowerSaveLevel = 1;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("====> Write 0x83 = 0x%x.\n", PCIePowerSaveLevel));
|
||||
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSaveLevel, 0x00);
|
||||
RT28xx_EEPROM_READ16(pAd, 0x22, PCIePowerSaveLevel);
|
||||
PCIePowerSaveLevel &= 0xff;
|
||||
PCIePowerSaveLevel = PCIePowerSaveLevel >> 6;
|
||||
switch(PCIePowerSaveLevel)
|
||||
{
|
||||
case 0: // Only support L0
|
||||
pAd->LnkCtrlBitMask = 0;
|
||||
break;
|
||||
case 1: // Only enable L0s
|
||||
pAd->LnkCtrlBitMask = 1;
|
||||
break;
|
||||
case 2: // enable L1, L0s
|
||||
pAd->LnkCtrlBitMask = 3;
|
||||
break;
|
||||
case 3: // sync with host clk and enable L1, L0s
|
||||
pAd->LnkCtrlBitMask = 0x103;
|
||||
break;
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("====> LnkCtrlBitMask = 0x%x.\n", pAd->LnkCtrlBitMask));
|
||||
}
|
||||
}
|
||||
else if (IS_RT3090(pAd))
|
||||
{
|
||||
// 1. read setting from inf file.
|
||||
// .....
|
||||
USHORT PCIePowerSetting = 0;
|
||||
/* code from windows, default value of rt30xxPowerMode = 0
|
||||
PCIePowerSetting = pAd->StaCfg.PSControl.field.rt30xxPowerMode;
|
||||
*/
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xx Read PowerLevelMode = 0x%x.\n", PCIePowerSetting));
|
||||
// 2. Check EnableNewPS
|
||||
/*
|
||||
if (pAd->StaCfg.PSControl.field.EnableNewPS == FALSE)
|
||||
PCIePowerSetting = 1;
|
||||
*/
|
||||
|
||||
if ((pAd->MACVersion&0xffff) <= 0x0211)
|
||||
{
|
||||
// Chip Version E only allow 1
|
||||
PCIePowerSetting = 1;
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xx Write 0x83 Command = 0x%x.\n", PCIePowerSetting));
|
||||
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSetting, 0x00);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Chip Version F only allow 1 or 2
|
||||
if ((PCIePowerSetting > 2) || (PCIePowerSetting == 0))
|
||||
PCIePowerSetting = 1;
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("====> rt30xx Write 0x83 Command = 0x%x.\n", PCIePowerSetting));
|
||||
AsicSendCommandToMcu(pAd, 0x83, 0xff, (UCHAR)PCIePowerSetting, 0x00);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Find Ralink PCIe Device's Express Capability Offset
|
||||
pos = pci_find_capability(pObj->pci_dev, PCI_CAP_ID_EXP);
|
||||
|
||||
if (pos != 0)
|
||||
{
|
||||
// Ralink PCIe Device's Link Control Register Offset
|
||||
pAd->RLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
|
||||
pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, ®16);
|
||||
Configuration = le2cpu16(reg16);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
|
||||
pAd->RLnkCtrlOffset, Configuration));
|
||||
pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
|
||||
Configuration &= 0xfefc;
|
||||
Configuration |= (0x0);
|
||||
if ((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
|
||||
||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID))
|
||||
{
|
||||
reg16 = cpu2le16(Configuration);
|
||||
pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
|
||||
pos + PCI_EXP_LNKCTL, Configuration));
|
||||
}
|
||||
|
||||
RTMPFindHostPCIDev(pAd);
|
||||
if (pObj->parent_pci_dev)
|
||||
{
|
||||
USHORT vendor_id;
|
||||
|
||||
pci_read_config_word(pObj->parent_pci_dev, PCI_VENDOR_ID, &vendor_id);
|
||||
vendor_id = le2cpu16(vendor_id);
|
||||
if (vendor_id == PCIBUS_INTEL_VENDOR)
|
||||
bFindIntel = TRUE;
|
||||
|
||||
// Find PCI-to-PCI Bridge Express Capability Offset
|
||||
pos = pci_find_capability(pObj->parent_pci_dev, PCI_CAP_ID_EXP);
|
||||
|
||||
if (pos != 0)
|
||||
{
|
||||
BOOLEAN bChange = FALSE;
|
||||
// PCI-to-PCI Bridge Link Control Register Offset
|
||||
pAd->HostLnkCtrlOffset = pos + PCI_EXP_LNKCTL;
|
||||
pci_read_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, ®16);
|
||||
Configuration = le2cpu16(reg16);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Read (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
|
||||
pAd->HostLnkCtrlOffset, Configuration));
|
||||
pAd->HostLnkCtrlConfiguration = (Configuration & 0x103);
|
||||
Configuration &= 0xfefc;
|
||||
Configuration |= (0x0);
|
||||
|
||||
switch (pObj->DeviceID)
|
||||
{
|
||||
case NIC2860_PCIe_DEVICE_ID:
|
||||
case NIC2790_PCIe_DEVICE_ID:
|
||||
bChange = TRUE;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (bChange)
|
||||
{
|
||||
reg16 = cpu2le16(Configuration);
|
||||
pci_write_config_word(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, reg16);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Write (Host PCI-to-PCI Bridge Link Control Register) offset 0x%x = 0x%x\n",
|
||||
pAd->HostLnkCtrlOffset, Configuration));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pAd->HostLnkCtrlOffset = 0;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find PCI-to-PCI Bridge PCI Express Capability!\n", __func__));
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pAd->RLnkCtrlOffset = 0;
|
||||
pAd->HostLnkCtrlOffset = 0;
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: cannot find Ralink PCIe Device's PCI Express Capability!\n", __func__));
|
||||
}
|
||||
|
||||
if (bFindIntel == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Doesn't find Intel PCI host controller. \n"));
|
||||
// Doesn't switch L0, L1, So set PCIePowerSaveLevel to 0xff
|
||||
pAd->PCIePowerSaveLevel = 0xff;
|
||||
if ((pAd->RLnkCtrlOffset != 0)
|
||||
)
|
||||
{
|
||||
pci_read_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, ®16);
|
||||
Configuration = le2cpu16(reg16);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Read (Ralink 30xx PCIe Link Control Register) offset 0x%x = 0x%x\n",
|
||||
pAd->RLnkCtrlOffset, Configuration));
|
||||
pAd->RLnkCtrlConfiguration = (Configuration & 0x103);
|
||||
Configuration &= 0xfefc;
|
||||
Configuration |= (0x0);
|
||||
reg16 = cpu2le16(Configuration);
|
||||
pci_write_config_word(pObj->pci_dev, pAd->RLnkCtrlOffset, reg16);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Write (Ralink PCIe Link Control Register) offset 0x%x = 0x%x\n",
|
||||
pos + PCI_EXP_LNKCTL, Configuration));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
VOID RTMPFindHostPCIDev(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
USHORT reg16;
|
||||
UCHAR reg8;
|
||||
UINT DevFn;
|
||||
PPCI_DEV pPci_dev;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
|
||||
|
||||
pObj->parent_pci_dev = NULL;
|
||||
if (pObj->pci_dev->bus->parent)
|
||||
{
|
||||
for (DevFn = 0; DevFn < 255; DevFn++)
|
||||
{
|
||||
pPci_dev = pci_get_slot(pObj->pci_dev->bus->parent, DevFn);
|
||||
if (pPci_dev)
|
||||
{
|
||||
pci_read_config_word(pPci_dev, PCI_CLASS_DEVICE, ®16);
|
||||
reg16 = le2cpu16(reg16);
|
||||
pci_read_config_byte(pPci_dev, PCI_CB_CARD_BUS, ®8);
|
||||
if ((reg16 == PCI_CLASS_BRIDGE_PCI) &&
|
||||
(reg8 == pObj->pci_dev->bus->number))
|
||||
{
|
||||
pObj->parent_pci_dev = pPci_dev;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
Level = RESTORE_HALT : Restore PCI host and Ralink PCIe Link Control field to its default value.
|
||||
Level = Other Value : Restore from dot11 power save or radio off status. And force PCI host Link Control fields to 0x1
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPPCIeLinkCtrlValueRestore(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Level)
|
||||
{
|
||||
USHORT PCIePowerSaveLevel, reg16;
|
||||
USHORT Configuration;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
return;
|
||||
|
||||
if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
|
||||
||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s.===>\n", __func__));
|
||||
PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
|
||||
if ((PCIePowerSaveLevel&0xff) == 0xff)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("return \n"));
|
||||
return;
|
||||
}
|
||||
|
||||
if (pObj->parent_pci_dev && (pAd->HostLnkCtrlOffset != 0))
|
||||
{
|
||||
PCI_REG_READ_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration);
|
||||
if ((Configuration != 0) &&
|
||||
(Configuration != 0xFFFF))
|
||||
{
|
||||
Configuration &= 0xfefc;
|
||||
// If call from interface down, restore to orginial setting.
|
||||
if (Level == RESTORE_CLOSE)
|
||||
{
|
||||
Configuration |= pAd->HostLnkCtrlConfiguration;
|
||||
}
|
||||
else
|
||||
Configuration |= 0x0;
|
||||
PCI_REG_WIRTE_WORD(pObj->parent_pci_dev, pAd->HostLnkCtrlOffset, Configuration);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Restore PCI host : offset 0x%x = 0x%x\n", pAd->HostLnkCtrlOffset, Configuration));
|
||||
}
|
||||
else
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Restore PCI host : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration));
|
||||
}
|
||||
|
||||
if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0))
|
||||
{
|
||||
PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
|
||||
if ((Configuration != 0) &&
|
||||
(Configuration != 0xFFFF))
|
||||
{
|
||||
Configuration &= 0xfefc;
|
||||
// If call from interface down, restore to orginial setting.
|
||||
if (Level == RESTORE_CLOSE)
|
||||
Configuration |= pAd->RLnkCtrlConfiguration;
|
||||
else
|
||||
Configuration |= 0x0;
|
||||
PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Restore Ralink : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration));
|
||||
}
|
||||
else
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Restore Ralink : PCI_REG_READ_WORD failed (Configuration = 0x%x)\n", Configuration));
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("%s <===\n", __func__));
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
|
||||
Routine Description:
|
||||
|
||||
Arguments:
|
||||
Max : limit Host PCI and Ralink PCIe device's LINK CONTROL field's value.
|
||||
Because now frequently set our device to mode 1 or mode 3 will cause problem.
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
VOID RTMPPCIeLinkCtrlSetting(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN USHORT Max)
|
||||
{
|
||||
USHORT PCIePowerSaveLevel, reg16;
|
||||
USHORT Configuration;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
return;
|
||||
|
||||
if (!((pObj->DeviceID == NIC2860_PCIe_DEVICE_ID)
|
||||
||(pObj->DeviceID == NIC2790_PCIe_DEVICE_ID)))
|
||||
return;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("%s===>\n", __func__));
|
||||
PCIePowerSaveLevel = pAd->PCIePowerSaveLevel;
|
||||
if ((PCIePowerSaveLevel&0xff) == 0xff)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("return \n"));
|
||||
return;
|
||||
}
|
||||
PCIePowerSaveLevel = PCIePowerSaveLevel>>6;
|
||||
|
||||
|
||||
if (pObj->pci_dev && (pAd->RLnkCtrlOffset != 0))
|
||||
{
|
||||
// first 2892 chip not allow to frequently set mode 3. will cause hang problem.
|
||||
if (PCIePowerSaveLevel > Max)
|
||||
PCIePowerSaveLevel = Max;
|
||||
|
||||
PCI_REG_READ_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
|
||||
Configuration |= 0x100;
|
||||
PCI_REG_WIRTE_WORD(pObj->pci_dev, pAd->RLnkCtrlOffset, Configuration);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Write Ralink device : offset 0x%x = 0x%x\n", pAd->RLnkCtrlOffset, Configuration));
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE,("RTMPPCIePowerLinkCtrl <==============\n"));
|
||||
}
|
@ -1,333 +0,0 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __RT2860_H__
|
||||
#define __RT2860_H__
|
||||
|
||||
#define RT28xx_CHIP_NAME "RT2860"
|
||||
|
||||
#define TXINFO_SIZE 0
|
||||
#define TXPADDING_SIZE 0
|
||||
|
||||
/* ----------------- EEPROM Related MACRO ----------------- */
|
||||
#define RT28xx_EEPROM_READ16(pAd, offset, var) \
|
||||
var = RTMP_EEPROM_READ16(pAd, offset)
|
||||
|
||||
#define RT28xx_EEPROM_WRITE16(pAd, offset, var) \
|
||||
RTMP_EEPROM_WRITE16(pAd, offset, var)
|
||||
|
||||
/* ----------------- TASK/THREAD Related MACRO ----------------- */
|
||||
#define RT28XX_TASK_THREAD_INIT(pAd, Status) \
|
||||
init_thread_task(pAd); NICInitTxRxRingAndBacklogQueue(pAd); \
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
|
||||
/* function declarations */
|
||||
#define IRQ_HANDLE_TYPE irqreturn_t
|
||||
|
||||
IRQ_HANDLE_TYPE
|
||||
rt2860_interrupt(int irq, void *dev_instance);
|
||||
|
||||
/* ----------------- Frimware Related MACRO ----------------- */
|
||||
#define RT28XX_WRITE_FIRMWARE(_pAd, _pFwImage, _FwLen) \
|
||||
do{ \
|
||||
ULONG _i, _firm; \
|
||||
RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x10000); \
|
||||
\
|
||||
for(_i=0; _i<_FwLen; _i+=4) \
|
||||
{ \
|
||||
_firm = _pFwImage[_i] + \
|
||||
(_pFwImage[_i+3] << 24) + \
|
||||
(_pFwImage[_i+2] << 16) + \
|
||||
(_pFwImage[_i+1] << 8); \
|
||||
RTMP_IO_WRITE32(_pAd, FIRMWARE_IMAGE_BASE + _i, _firm); \
|
||||
} \
|
||||
RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00000); \
|
||||
RTMP_IO_WRITE32(_pAd, PBF_SYS_CTRL, 0x00001); \
|
||||
\
|
||||
/* initialize BBP R/W access agent */ \
|
||||
RTMP_IO_WRITE32(_pAd, H2M_BBP_AGENT, 0); \
|
||||
RTMP_IO_WRITE32(_pAd, H2M_MAILBOX_CSR, 0); \
|
||||
}while(0)
|
||||
|
||||
/* ----------------- TX Related MACRO ----------------- */
|
||||
#define RT28XX_START_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0)
|
||||
#define RT28XX_STOP_DEQUEUE(pAd, QueIdx, irqFlags) do{}while(0)
|
||||
|
||||
|
||||
#define RT28XX_HAS_ENOUGH_FREE_DESC(pAd, pTxBlk, freeNum, pPacket) \
|
||||
((freeNum) >= (ULONG)(pTxBlk->TotalFragNum + RTMP_GET_PACKET_FRAGMENTS(pPacket) + 3)) /* rough estimate we will use 3 more descriptor. */
|
||||
#define RT28XX_RELEASE_DESC_RESOURCE(pAd, QueIdx) \
|
||||
do{}while(0)
|
||||
|
||||
#define NEED_QUEUE_BACK_FOR_AGG(pAd, QueIdx, freeNum, _TxFrameType) \
|
||||
(((freeNum != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 0)) || (freeNum<3))
|
||||
//(((freeNum) != (TX_RING_SIZE-1)) && (pAd->TxSwQueue[QueIdx].Number == 1 /*0*/))
|
||||
|
||||
|
||||
#define HAL_KickOutMgmtTx(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen) \
|
||||
RtmpPCIMgmtKickOut(_pAd, _QueIdx, _pPacket, _pSrcBufVA, _SrcBufLen)
|
||||
|
||||
#define RTMP_PKT_TAIL_PADDING 0
|
||||
|
||||
#define fRTMP_ADAPTER_NEED_STOP_TX 0
|
||||
|
||||
#define HAL_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber) \
|
||||
/* RtmpPCI_WriteSubTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)*/
|
||||
|
||||
#define HAL_WriteTxResource(pAd, pTxBlk,bIsLast, pFreeNumber) \
|
||||
RtmpPCI_WriteSingleTxResource(pAd, pTxBlk, bIsLast, pFreeNumber)
|
||||
|
||||
#define HAL_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber) \
|
||||
RtmpPCI_WriteFragTxResource(pAd, pTxBlk, fragNum, pFreeNumber)
|
||||
|
||||
#define HAL_WriteMultiTxResource(pAd, pTxBlk,frameNum, pFreeNumber) \
|
||||
RtmpPCI_WriteMultiTxResource(pAd, pTxBlk, frameNum, pFreeNumber)
|
||||
|
||||
#define HAL_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx) \
|
||||
RtmpPCI_FinalWriteTxResource(_pAd, _pTxBlk, _TotalMPDUSize, _FirstTxIdx)
|
||||
|
||||
#define HAL_LastTxIdx(_pAd, _QueIdx,_LastTxIdx) \
|
||||
/*RtmpPCIDataLastTxIdx(_pAd, _QueIdx,_LastTxIdx)*/
|
||||
|
||||
#define HAL_KickOutTx(_pAd, _pTxBlk, _QueIdx) \
|
||||
RTMP_IO_WRITE32((_pAd), TX_CTX_IDX0+((_QueIdx)*0x10), (_pAd)->TxRing[(_QueIdx)].TxCpuIdx)
|
||||
/* RtmpPCIDataKickOut(_pAd, _pTxBlk, _QueIdx)*/
|
||||
|
||||
#define HAL_KickOutNullFrameTx(_pAd, _QueIdx, _pNullFrame, _frameLen) \
|
||||
MiniportMMRequest(_pAd, _QueIdx, _pNullFrame, _frameLen)
|
||||
|
||||
#define GET_TXRING_FREENO(_pAd, _QueIdx) \
|
||||
(_pAd->TxRing[_QueIdx].TxSwFreeIdx > _pAd->TxRing[_QueIdx].TxCpuIdx) ? \
|
||||
(_pAd->TxRing[_QueIdx].TxSwFreeIdx - _pAd->TxRing[_QueIdx].TxCpuIdx - 1) \
|
||||
: \
|
||||
(_pAd->TxRing[_QueIdx].TxSwFreeIdx + TX_RING_SIZE - _pAd->TxRing[_QueIdx].TxCpuIdx - 1);
|
||||
|
||||
|
||||
#define GET_MGMTRING_FREENO(_pAd) \
|
||||
(_pAd->MgmtRing.TxSwFreeIdx > _pAd->MgmtRing.TxCpuIdx) ? \
|
||||
(_pAd->MgmtRing.TxSwFreeIdx - _pAd->MgmtRing.TxCpuIdx - 1) \
|
||||
: \
|
||||
(_pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - _pAd->MgmtRing.TxCpuIdx - 1);
|
||||
|
||||
|
||||
/* ----------------- RX Related MACRO ----------------- */
|
||||
|
||||
// no use
|
||||
#define RT28XX_RCV_PKT_GET_INIT(pAd)
|
||||
#define RT28XX_RV_A_BUF_END
|
||||
//#define RT28XX_RV_ALL_BUF_END
|
||||
|
||||
|
||||
/* ----------------- ASIC Related MACRO ----------------- */
|
||||
// no use
|
||||
#define RT28XX_DMA_POST_WRITE(pAd)
|
||||
|
||||
// reset MAC of a station entry to 0x000000000000
|
||||
#define RT28XX_STA_ENTRY_MAC_RESET(pAd, Wcid) \
|
||||
AsicDelWcidTab(pAd, Wcid);
|
||||
|
||||
// add this entry into ASIC RX WCID search table
|
||||
#define RT28XX_STA_ENTRY_ADD(pAd, pEntry) \
|
||||
AsicUpdateRxWCIDTable(pAd, pEntry->Aid, pEntry->Addr);
|
||||
|
||||
// remove Pair-wise key material from ASIC
|
||||
#define RT28XX_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid) \
|
||||
AsicRemovePairwiseKeyEntry(pAd, BssIdx, (UCHAR)Wcid);
|
||||
|
||||
// add Client security information into ASIC WCID table and IVEIV table
|
||||
#define RT28XX_STA_SECURITY_INFO_ADD(pAd, apidx, KeyID, pEntry) \
|
||||
RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \
|
||||
pAd->SharedKey[apidx][KeyID].CipherAlg, pEntry);
|
||||
|
||||
#define RT28XX_SECURITY_KEY_ADD(pAd, apidx, KeyID, pEntry) \
|
||||
{ /* update pairwise key information to ASIC Shared Key Table */ \
|
||||
AsicAddSharedKeyEntry(pAd, apidx, KeyID, \
|
||||
pAd->SharedKey[apidx][KeyID].CipherAlg, \
|
||||
pAd->SharedKey[apidx][KeyID].Key, \
|
||||
pAd->SharedKey[apidx][KeyID].TxMic, \
|
||||
pAd->SharedKey[apidx][KeyID].RxMic); \
|
||||
/* update ASIC WCID attribute table and IVEIV table */ \
|
||||
RTMPAddWcidAttributeEntry(pAd, apidx, KeyID, \
|
||||
pAd->SharedKey[apidx][KeyID].CipherAlg, \
|
||||
pEntry); }
|
||||
|
||||
|
||||
// Insert the BA bitmap to ASIC for the Wcid entry
|
||||
#define RT28XX_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID) \
|
||||
do{ \
|
||||
UINT32 _Value = 0, _Offset; \
|
||||
_Offset = MAC_WCID_BASE + (_Aid) * HW_WCID_ENTRY_SIZE + 4; \
|
||||
RTMP_IO_READ32((_pAd), _Offset, &_Value); \
|
||||
_Value |= (0x10000<<(_TID)); \
|
||||
RTMP_IO_WRITE32((_pAd), _Offset, _Value); \
|
||||
}while(0)
|
||||
|
||||
|
||||
// Remove the BA bitmap from ASIC for the Wcid entry
|
||||
// bitmap field starts at 0x10000 in ASIC WCID table
|
||||
#define RT28XX_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID) \
|
||||
do{ \
|
||||
UINT32 _Value = 0, _Offset; \
|
||||
_Offset = MAC_WCID_BASE + (_Wcid) * HW_WCID_ENTRY_SIZE + 4; \
|
||||
RTMP_IO_READ32((_pAd), _Offset, &_Value); \
|
||||
_Value &= (~(0x10000 << (_TID))); \
|
||||
RTMP_IO_WRITE32((_pAd), _Offset, _Value); \
|
||||
}while(0)
|
||||
|
||||
|
||||
/* ----------------- PCI/USB Related MACRO ----------------- */
|
||||
|
||||
#define RT28XX_HANDLE_DEV_ASSIGN(handle, dev_p) \
|
||||
((POS_COOKIE)handle)->pci_dev = dev_p;
|
||||
|
||||
// set driver data
|
||||
#define RT28XX_DRVDATA_SET(_a) pci_set_drvdata(_a, net_dev);
|
||||
|
||||
#define RT28XX_UNMAP() \
|
||||
{ if (net_dev->base_addr) { \
|
||||
iounmap((void *)(net_dev->base_addr)); \
|
||||
release_mem_region(pci_resource_start(dev_p, 0), \
|
||||
pci_resource_len(dev_p, 0)); } \
|
||||
if (net_dev->irq) pci_release_regions(dev_p); }
|
||||
|
||||
#ifdef PCI_MSI_SUPPORT
|
||||
#define RTMP_MSI_ENABLE(_pAd) \
|
||||
{ POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \
|
||||
(_pAd)->HaveMsi = pci_enable_msi(_pObj->pci_dev) == 0 ? TRUE : FALSE; }
|
||||
|
||||
#define RTMP_MSI_DISABLE(_pAd) \
|
||||
{ POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \
|
||||
if (_pAd->HaveMsi == TRUE) \
|
||||
pci_disable_msi(_pObj->pci_dev); \
|
||||
_pAd->HaveMsi = FALSE; }
|
||||
#else
|
||||
#define RTMP_MSI_ENABLE(_pAd)
|
||||
#define RTMP_MSI_DISABLE(_pAd)
|
||||
#endif // PCI_MSI_SUPPORT //
|
||||
|
||||
#define SA_SHIRQ IRQF_SHARED
|
||||
|
||||
#define RT28XX_IRQ_REQUEST(net_dev) \
|
||||
{ PRTMP_ADAPTER _pAd = (PRTMP_ADAPTER)((net_dev)->ml_priv); \
|
||||
POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \
|
||||
RTMP_MSI_ENABLE(_pAd); \
|
||||
if ((retval = request_irq(_pObj->pci_dev->irq, \
|
||||
rt2860_interrupt, SA_SHIRQ, \
|
||||
(net_dev)->name, (net_dev)))) { \
|
||||
printk("RT2860: request_irq ERROR(%d)\n", retval); \
|
||||
return retval; } }
|
||||
|
||||
#define RT28XX_IRQ_RELEASE(net_dev) \
|
||||
{ PRTMP_ADAPTER _pAd = (PRTMP_ADAPTER)((net_dev)->ml_priv); \
|
||||
POS_COOKIE _pObj = (POS_COOKIE)(_pAd->OS_Cookie); \
|
||||
synchronize_irq(_pObj->pci_dev->irq); \
|
||||
free_irq(_pObj->pci_dev->irq, (net_dev)); \
|
||||
RTMP_MSI_DISABLE(_pAd); }
|
||||
|
||||
#define RT28XX_IRQ_INIT(pAd) \
|
||||
{ pAd->int_enable_reg = ((DELAYINTMASK) | \
|
||||
(RxINT|TxDataInt|TxMgmtInt)) & ~(0x03); \
|
||||
pAd->int_disable_mask = 0; \
|
||||
pAd->int_pending = 0; }
|
||||
|
||||
#define RT28XX_IRQ_ENABLE(pAd) \
|
||||
{ /* clear garbage ints */ \
|
||||
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, 0xffffffff); \
|
||||
NICEnableInterrupt(pAd); }
|
||||
|
||||
#define RT28XX_PUT_DEVICE(dev_p)
|
||||
|
||||
|
||||
/* ----------------- MLME Related MACRO ----------------- */
|
||||
#define RT28XX_MLME_HANDLER(pAd) MlmeHandler(pAd)
|
||||
|
||||
#define RT28XX_MLME_PRE_SANITY_CHECK(pAd)
|
||||
|
||||
#define RT28XX_MLME_STA_QUICK_RSP_WAKE_UP(pAd) \
|
||||
RTMPSetTimer(&pAd->StaCfg.StaQuickResponeForRateUpTimer, 100);
|
||||
|
||||
#define RT28XX_MLME_RESET_STATE_MACHINE(pAd) \
|
||||
MlmeRestartStateMachine(pAd)
|
||||
|
||||
#define RT28XX_HANDLE_COUNTER_MEASURE(_pAd, _pEntry) \
|
||||
HandleCounterMeasure(_pAd, _pEntry)
|
||||
|
||||
/* ----------------- Power Save Related MACRO ----------------- */
|
||||
#define RT28XX_PS_POLL_ENQUEUE(pAd) EnqueuePsPoll(pAd)
|
||||
|
||||
//
|
||||
// Device ID & Vendor ID, these values should match EEPROM value
|
||||
//
|
||||
#define NIC2860_PCI_DEVICE_ID 0x0601
|
||||
#define NIC2860_PCIe_DEVICE_ID 0x0681
|
||||
#define NIC2760_PCI_DEVICE_ID 0x0701 // 1T/2R Cardbus ???
|
||||
#define NIC2790_PCIe_DEVICE_ID 0x0781 // 1T/2R miniCard
|
||||
|
||||
#define NIC_PCI_VENDOR_ID 0x1814
|
||||
|
||||
#define VEN_AWT_PCIe_DEVICE_ID 0x1059
|
||||
#define VEN_AWT_PCI_VENDOR_ID 0x1A3B
|
||||
|
||||
#define EDIMAX_PCI_VENDOR_ID 0x1432
|
||||
|
||||
// For RTMPPCIePowerLinkCtrlRestore () function
|
||||
#define RESTORE_HALT 1
|
||||
#define RESTORE_WAKEUP 2
|
||||
#define RESTORE_CLOSE 3
|
||||
|
||||
#define PowerSafeCID 1
|
||||
#define PowerRadioOffCID 2
|
||||
#define PowerWakeCID 3
|
||||
#define CID0MASK 0x000000ff
|
||||
#define CID1MASK 0x0000ff00
|
||||
#define CID2MASK 0x00ff0000
|
||||
#define CID3MASK 0xff000000
|
||||
|
||||
#define PCI_REG_READ_WORD(pci_dev, offset, Configuration) \
|
||||
if (pci_read_config_word(pci_dev, offset, ®16) == 0) \
|
||||
Configuration = le2cpu16(reg16); \
|
||||
else \
|
||||
Configuration = 0;
|
||||
|
||||
#define PCI_REG_WIRTE_WORD(pci_dev, offset, Configuration) \
|
||||
reg16 = cpu2le16(Configuration); \
|
||||
pci_write_config_word(pci_dev, offset, reg16); \
|
||||
|
||||
#define RT28XX_STA_FORCE_WAKEUP(pAd, Level) \
|
||||
RT28xxPciStaAsicForceWakeup(pAd, Level);
|
||||
|
||||
#define RT28XX_STA_SLEEP_THEN_AUTO_WAKEUP(pAd, TbttNumToNextWakeUp) \
|
||||
RT28xxPciStaAsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
|
||||
|
||||
#define RT28XX_MLME_RADIO_ON(pAd) \
|
||||
RT28xxPciMlmeRadioOn(pAd);
|
||||
|
||||
#define RT28XX_MLME_RADIO_OFF(pAd) \
|
||||
RT28xxPciMlmeRadioOFF(pAd);
|
||||
|
||||
#endif //__RT2860_H__
|
||||
|
@ -41,29 +41,37 @@
|
||||
#define __RT_CONFIG_H__
|
||||
|
||||
#include "rtmp_type.h"
|
||||
#ifdef LINUX
|
||||
#include "rt_linux.h"
|
||||
#endif
|
||||
#include "rtmp_def.h"
|
||||
#include "rt28xx.h"
|
||||
#include "rtmp_os.h"
|
||||
|
||||
#ifdef RT2860
|
||||
#include "rt2860.h"
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
#include "../rt2870/rt2870.h"
|
||||
#endif // RT2870 //
|
||||
#include "rtmp_def.h"
|
||||
#include "rtmp_chip.h"
|
||||
#include "rtmp_timer.h"
|
||||
|
||||
#include "oid.h"
|
||||
#include "mlme.h"
|
||||
#include "wpa.h"
|
||||
#include "md5.h"
|
||||
#include "crypt_md5.h"
|
||||
#include "crypt_sha2.h"
|
||||
#include "crypt_hmac.h"
|
||||
#include "rtmp.h"
|
||||
#include "ap.h"
|
||||
#include "dfs.h"
|
||||
#include "chlist.h"
|
||||
#include "spectrum.h"
|
||||
|
||||
#include "eeprom.h"
|
||||
#if defined(RTMP_PCI_SUPPORT) || defined(RTMP_USB_SUPPORT)
|
||||
#include "rtmp_mcu.h"
|
||||
#endif
|
||||
|
||||
#undef AP_WSC_INCLUDED
|
||||
#undef STA_WSC_INCLUDED
|
||||
#undef WSC_INCLUDED
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#ifdef IGMP_SNOOP_SUPPORT
|
||||
#include "igmp_snoop.h"
|
||||
#endif // IGMP_SNOOP_SUPPORT //
|
||||
|
@ -30,27 +30,6 @@
|
||||
|
||||
ULONG RTDebugLevel = RT_DEBUG_ERROR;
|
||||
|
||||
BUILD_TIMER_FUNCTION(MlmePeriodicExec);
|
||||
BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);
|
||||
BUILD_TIMER_FUNCTION(APSDPeriodicExec);
|
||||
BUILD_TIMER_FUNCTION(AsicRfTuningExec);
|
||||
#ifdef RT2870
|
||||
BUILD_TIMER_FUNCTION(BeaconUpdateExec);
|
||||
#endif // RT2870 //
|
||||
|
||||
BUILD_TIMER_FUNCTION(BeaconTimeout);
|
||||
BUILD_TIMER_FUNCTION(ScanTimeout);
|
||||
BUILD_TIMER_FUNCTION(AuthTimeout);
|
||||
BUILD_TIMER_FUNCTION(AssocTimeout);
|
||||
BUILD_TIMER_FUNCTION(ReassocTimeout);
|
||||
BUILD_TIMER_FUNCTION(DisassocTimeout);
|
||||
BUILD_TIMER_FUNCTION(LinkDownExec);
|
||||
BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
|
||||
BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
|
||||
#ifdef RT2860
|
||||
BUILD_TIMER_FUNCTION(PsPollWakeExec);
|
||||
BUILD_TIMER_FUNCTION(RadioOnExec);
|
||||
#endif
|
||||
|
||||
// for wireless system event message
|
||||
char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
|
||||
@ -106,7 +85,7 @@ VOID RTMP_SetPeriodicTimer(
|
||||
IN NDIS_MINIPORT_TIMER *pTimer,
|
||||
IN unsigned long timeout)
|
||||
{
|
||||
timeout = ((timeout*HZ) / 1000);
|
||||
timeout = ((timeout*OS_HZ) / 1000);
|
||||
pTimer->expires = jiffies + timeout;
|
||||
add_timer(pTimer);
|
||||
}
|
||||
@ -131,7 +110,7 @@ VOID RTMP_OS_Add_Timer(
|
||||
if (timer_pending(pTimer))
|
||||
return;
|
||||
|
||||
timeout = ((timeout*HZ) / 1000);
|
||||
timeout = ((timeout*OS_HZ) / 1000);
|
||||
pTimer->expires = jiffies + timeout;
|
||||
add_timer(pTimer);
|
||||
}
|
||||
@ -140,7 +119,7 @@ VOID RTMP_OS_Mod_Timer(
|
||||
IN NDIS_MINIPORT_TIMER *pTimer,
|
||||
IN unsigned long timeout)
|
||||
{
|
||||
timeout = ((timeout*HZ) / 1000);
|
||||
timeout = ((timeout*OS_HZ) / 1000);
|
||||
mod_timer(pTimer, jiffies + timeout);
|
||||
}
|
||||
|
||||
@ -186,8 +165,8 @@ void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
|
||||
|
||||
// pAd MUST allow to be NULL
|
||||
NDIS_STATUS os_alloc_mem(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR *mem,
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
OUT UCHAR **mem,
|
||||
IN ULONG size)
|
||||
{
|
||||
*mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
|
||||
@ -200,7 +179,7 @@ NDIS_STATUS os_alloc_mem(
|
||||
// pAd MUST allow to be NULL
|
||||
NDIS_STATUS os_free_mem(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR mem)
|
||||
IN PVOID mem)
|
||||
{
|
||||
|
||||
ASSERT(mem);
|
||||
@ -209,6 +188,20 @@ NDIS_STATUS os_free_mem(
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
PNDIS_PACKET RtmpOSNetPktAlloc(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN int size)
|
||||
{
|
||||
struct sk_buff *skb;
|
||||
/* Add 2 more bytes for ip header alignment*/
|
||||
skb = dev_alloc_skb(size+2);
|
||||
|
||||
return ((PNDIS_PACKET)skb);
|
||||
}
|
||||
|
||||
|
||||
PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length)
|
||||
@ -283,13 +276,16 @@ VOID RTMPFreeAdapter(
|
||||
|
||||
os_cookie=(POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
if (pAd->BeaconBuf)
|
||||
kfree(pAd->BeaconBuf);
|
||||
|
||||
|
||||
NdisFreeSpinLock(&pAd->MgmtRingLock);
|
||||
#ifdef RT2860
|
||||
|
||||
#ifdef RTMP_MAC_PCI
|
||||
NdisFreeSpinLock(&pAd->RxRingLock);
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
for (index =0 ; index < NUM_OF_TX_RING; index++)
|
||||
{
|
||||
NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
|
||||
@ -299,7 +295,9 @@ VOID RTMPFreeAdapter(
|
||||
|
||||
NdisFreeSpinLock(&pAd->irq_lock);
|
||||
|
||||
|
||||
vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
|
||||
if (os_cookie)
|
||||
kfree(os_cookie);
|
||||
}
|
||||
|
||||
@ -379,7 +377,7 @@ NDIS_STATUS RTMPAllocateNdisPacket(
|
||||
ASSERT(DataLen);
|
||||
|
||||
// 1. Allocate a packet
|
||||
pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
|
||||
pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + RTMP_PKT_TAIL_PADDING);
|
||||
if (pPacket == NULL)
|
||||
{
|
||||
*ppPacket = NULL;
|
||||
@ -442,7 +440,7 @@ void RTMP_QueryPacketInfo(
|
||||
OUT UINT *pSrcBufLen)
|
||||
{
|
||||
pPacketInfo->BufferCount = 1;
|
||||
pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
|
||||
pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket);
|
||||
pPacketInfo->PhysicalBufferCount = 1;
|
||||
pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
|
||||
|
||||
@ -464,7 +462,7 @@ void RTMP_QueryNextPacketInfo(
|
||||
if (pPacket)
|
||||
{
|
||||
pPacketInfo->BufferCount = 1;
|
||||
pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
|
||||
pPacketInfo->pFirstBuffer = (PNDIS_BUFFER)GET_OS_PKT_DATAPTR(pPacket);
|
||||
pPacketInfo->PhysicalBufferCount = 1;
|
||||
pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
|
||||
|
||||
@ -485,18 +483,6 @@ void RTMP_QueryNextPacketInfo(
|
||||
}
|
||||
}
|
||||
|
||||
// not yet support MBSS
|
||||
PNET_DEV get_netdev_from_bssid(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR FromWhichBSSID)
|
||||
{
|
||||
PNET_DEV dev_p = NULL;
|
||||
|
||||
dev_p = pAd->net_dev;
|
||||
|
||||
ASSERT(dev_p);
|
||||
return dev_p; /* return one of MBSS */
|
||||
}
|
||||
|
||||
PNDIS_PACKET DuplicatePacket(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
@ -538,9 +524,9 @@ PNDIS_PACKET duplicate_pkt(
|
||||
if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
|
||||
{
|
||||
skb_reserve(skb, 2);
|
||||
NdisMoveMemory(skb_tail_pointer(skb), pHeader802_3, HdrLen);
|
||||
NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
|
||||
skb_put(skb, HdrLen);
|
||||
NdisMoveMemory(skb_tail_pointer(skb), pData, DataSize);
|
||||
NdisMoveMemory(skb->tail, pData, DataSize);
|
||||
skb_put(skb, DataSize);
|
||||
skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
|
||||
pPacket = OSPKT_TO_RTPKT(skb);
|
||||
@ -649,7 +635,9 @@ void wlan_802_11_to_802_3_packet(
|
||||
//
|
||||
|
||||
NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void announce_802_3_packet(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
@ -726,8 +714,8 @@ VOID RTMPSendWirelessEvent(
|
||||
IN CHAR Rssi)
|
||||
{
|
||||
|
||||
union iwreq_data wrqu;
|
||||
PUCHAR pBuf = NULL, pBufPtr = NULL;
|
||||
//union iwreq_data wrqu;
|
||||
PSTRING pBuf = NULL, pBufPtr = NULL;
|
||||
USHORT event, type, BufLen;
|
||||
UCHAR event_table_len = 0;
|
||||
|
||||
@ -788,13 +776,7 @@ VOID RTMPSendWirelessEvent(
|
||||
pBufPtr[pBufPtr - pBuf] = '\0';
|
||||
BufLen = pBufPtr - pBuf;
|
||||
|
||||
memset(&wrqu, 0, sizeof(wrqu));
|
||||
wrqu.data.flags = Event_flag;
|
||||
wrqu.data.length = BufLen;
|
||||
|
||||
//send wireless event
|
||||
wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
|
||||
|
||||
RtmpOSWrielessEventSend(pAd, IWEVCUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen);
|
||||
//DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
|
||||
|
||||
kfree(pBuf);
|
||||
@ -896,7 +878,7 @@ void send_monitor_packets(
|
||||
|
||||
ph->msgcode = DIDmsg_lnxind_wlansniffrm;
|
||||
ph->msglen = sizeof(wlan_ng_prism2_header);
|
||||
strcpy(ph->devname, pAd->net_dev->name);
|
||||
strcpy((PSTRING) ph->devname, (PSTRING) pAd->net_dev->name);
|
||||
|
||||
ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
|
||||
ph->hosttime.status = 0;
|
||||
@ -972,18 +954,275 @@ void send_monitor_packets(
|
||||
|
||||
}
|
||||
|
||||
void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
Device IRQ related functions.
|
||||
|
||||
*******************************************************************************/
|
||||
int RtmpOSIRQRequest(IN PNET_DEV pNetDev)
|
||||
{
|
||||
daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
|
||||
struct net_device *net_dev = pNetDev;
|
||||
PRTMP_ADAPTER pAd = NULL;
|
||||
int retval = 0;
|
||||
|
||||
GET_PAD_FROM_NET_DEV(pAd, pNetDev);
|
||||
|
||||
ASSERT(pAd);
|
||||
|
||||
#ifdef RTMP_PCI_SUPPORT
|
||||
if (pAd->infType == RTMP_DEV_INF_PCI)
|
||||
{
|
||||
POS_COOKIE _pObj = (POS_COOKIE)(pAd->OS_Cookie);
|
||||
RTMP_MSI_ENABLE(pAd);
|
||||
retval = request_irq(_pObj->pci_dev->irq, rt2860_interrupt, SA_SHIRQ, (net_dev)->name, (net_dev));
|
||||
if (retval != 0)
|
||||
printk("RT2860: request_irq ERROR(%d)\n", retval);
|
||||
}
|
||||
#endif // RTMP_PCI_SUPPORT //
|
||||
|
||||
|
||||
return retval;
|
||||
|
||||
}
|
||||
|
||||
|
||||
int RtmpOSIRQRelease(IN PNET_DEV pNetDev)
|
||||
{
|
||||
struct net_device *net_dev = pNetDev;
|
||||
PRTMP_ADAPTER pAd = NULL;
|
||||
|
||||
GET_PAD_FROM_NET_DEV(pAd, net_dev);
|
||||
|
||||
ASSERT(pAd);
|
||||
|
||||
#ifdef RTMP_PCI_SUPPORT
|
||||
if (pAd->infType == RTMP_DEV_INF_PCI)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)(pAd->OS_Cookie);
|
||||
synchronize_irq(pObj->pci_dev->irq);
|
||||
free_irq(pObj->pci_dev->irq, (net_dev));
|
||||
RTMP_MSI_DISABLE(pAd);
|
||||
}
|
||||
#endif // RTMP_PCI_SUPPORT //
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
File open/close related functions.
|
||||
|
||||
*******************************************************************************/
|
||||
RTMP_OS_FD RtmpOSFileOpen(char *pPath, int flag, int mode)
|
||||
{
|
||||
struct file *filePtr;
|
||||
|
||||
filePtr = filp_open(pPath, flag, 0);
|
||||
if (IS_ERR(filePtr))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s(): Error %ld opening %s\n", __func__, -PTR_ERR(filePtr), pPath));
|
||||
}
|
||||
|
||||
return (RTMP_OS_FD)filePtr;
|
||||
}
|
||||
|
||||
int RtmpOSFileClose(RTMP_OS_FD osfd)
|
||||
{
|
||||
filp_close(osfd, NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSFileSeek(RTMP_OS_FD osfd, int offset)
|
||||
{
|
||||
osfd->f_pos = offset;
|
||||
}
|
||||
|
||||
|
||||
int RtmpOSFileRead(RTMP_OS_FD osfd, char *pDataPtr, int readLen)
|
||||
{
|
||||
// The object must have a read method
|
||||
if (osfd->f_op && osfd->f_op->read)
|
||||
{
|
||||
return osfd->f_op->read(osfd, pDataPtr, readLen, &osfd->f_pos);
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("no file read method\n"));
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
int RtmpOSFileWrite(RTMP_OS_FD osfd, char *pDataPtr, int writeLen)
|
||||
{
|
||||
return osfd->f_op->write(osfd, pDataPtr, (size_t)writeLen, &osfd->f_pos);
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSFSInfoChange(RTMP_OS_FS_INFO *pOSFSInfo, BOOLEAN bSet)
|
||||
{
|
||||
if (bSet)
|
||||
{
|
||||
// Save uid and gid used for filesystem access.
|
||||
// Set user and group to 0 (root)
|
||||
pOSFSInfo->fsuid = current_fsuid();
|
||||
pOSFSInfo->fsgid = current_fsgid();
|
||||
pOSFSInfo->fs = get_fs();
|
||||
set_fs(KERNEL_DS);
|
||||
}
|
||||
else
|
||||
{
|
||||
set_fs(pOSFSInfo->fs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
Task create/management/kill related functions.
|
||||
|
||||
*******************************************************************************/
|
||||
NDIS_STATUS RtmpOSTaskKill(
|
||||
IN RTMP_OS_TASK *pTask)
|
||||
{
|
||||
RTMP_ADAPTER *pAd;
|
||||
int ret = NDIS_STATUS_FAILURE;
|
||||
|
||||
pAd = (RTMP_ADAPTER *)pTask->priv;
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
if (pTask->kthread_task)
|
||||
{
|
||||
kthread_stop(pTask->kthread_task);
|
||||
ret = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
#else
|
||||
CHECK_PID_LEGALITY(pTask->taskPID)
|
||||
{
|
||||
printk("Terminate the task(%s) with pid(%d)!\n", pTask->taskName, GET_PID_NUMBER(pTask->taskPID));
|
||||
mb();
|
||||
pTask->task_killed = 1;
|
||||
mb();
|
||||
ret = KILL_THREAD_PID(pTask->taskPID, SIGTERM, 1);
|
||||
if (ret)
|
||||
{
|
||||
printk(KERN_WARNING "kill task(%s) with pid(%d) failed(retVal=%d)!\n",
|
||||
pTask->taskName, GET_PID_NUMBER(pTask->taskPID), ret);
|
||||
}
|
||||
else
|
||||
{
|
||||
wait_for_completion(&pTask->taskComplete);
|
||||
pTask->taskPID = THREAD_PID_INIT_VALUE;
|
||||
pTask->task_killed = 0;
|
||||
ret = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
|
||||
INT RtmpOSTaskNotifyToExit(
|
||||
IN RTMP_OS_TASK *pTask)
|
||||
{
|
||||
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
complete_and_exit(&pTask->taskComplete, 0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSTaskCustomize(
|
||||
IN RTMP_OS_TASK *pTask)
|
||||
{
|
||||
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
|
||||
daemonize((PSTRING)&pTask->taskName[0]/*"%s",pAd->net_dev->name*/);
|
||||
|
||||
allow_signal(SIGTERM);
|
||||
allow_signal(SIGKILL);
|
||||
current->flags |= PF_NOFREEZE;
|
||||
|
||||
/* signal that we've started the thread */
|
||||
complete(pNotify);
|
||||
complete(&pTask->taskComplete);
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RtmpOSTaskAttach(
|
||||
IN RTMP_OS_TASK *pTask,
|
||||
IN int (*fn)(void *),
|
||||
IN void *arg)
|
||||
{
|
||||
NDIS_STATUS status = NDIS_STATUS_SUCCESS;
|
||||
pid_t pid_number = -1;
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
pTask->task_killed = 0;
|
||||
pTask->kthread_task = NULL;
|
||||
pTask->kthread_task = kthread_run(fn, arg, pTask->taskName);
|
||||
if (IS_ERR(pTask->kthread_task))
|
||||
status = NDIS_STATUS_FAILURE;
|
||||
#else
|
||||
pid_number = kernel_thread(fn, arg, RTMP_OS_MGMT_TASK_FLAGS);
|
||||
if (pid_number < 0)
|
||||
{
|
||||
DBGPRINT (RT_DEBUG_ERROR, ("Attach task(%s) failed!\n", pTask->taskName));
|
||||
status = NDIS_STATUS_FAILURE;
|
||||
}
|
||||
else
|
||||
{
|
||||
pTask->taskPID = GET_PID(pid_number);
|
||||
|
||||
// Wait for the thread to start
|
||||
wait_for_completion(&pTask->taskComplete);
|
||||
status = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
#endif
|
||||
return status;
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RtmpOSTaskInit(
|
||||
IN RTMP_OS_TASK *pTask,
|
||||
IN PSTRING pTaskName,
|
||||
IN VOID *pPriv)
|
||||
{
|
||||
int len;
|
||||
|
||||
ASSERT(pTask);
|
||||
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
NdisZeroMemory((PUCHAR)(pTask), sizeof(RTMP_OS_TASK));
|
||||
#endif
|
||||
|
||||
len = strlen(pTaskName);
|
||||
len = len > (RTMP_OS_TASK_NAME_LEN -1) ? (RTMP_OS_TASK_NAME_LEN-1) : len;
|
||||
NdisMoveMemory(&pTask->taskName[0], pTaskName, len);
|
||||
pTask->priv = pPriv;
|
||||
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
RTMP_SEM_EVENT_INIT_LOCKED(&(pTask->taskSema));
|
||||
pTask->taskPID = THREAD_PID_INIT_VALUE;
|
||||
|
||||
init_completion (&pTask->taskComplete);
|
||||
#endif
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
void RTMP_IndicateMediaState(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
@ -1000,3 +1239,259 @@ void RTMP_IndicateMediaState(
|
||||
}
|
||||
}
|
||||
|
||||
int RtmpOSWrielessEventSend(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN UINT32 eventType,
|
||||
IN INT flags,
|
||||
IN PUCHAR pSrcMac,
|
||||
IN PUCHAR pData,
|
||||
IN UINT32 dataLen)
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
|
||||
memset(&wrqu, 0, sizeof(wrqu));
|
||||
|
||||
if (flags>-1)
|
||||
wrqu.data.flags = flags;
|
||||
|
||||
if (pSrcMac)
|
||||
memcpy(wrqu.ap_addr.sa_data, pSrcMac, MAC_ADDR_LEN);
|
||||
|
||||
if ((pData!= NULL) && (dataLen > 0))
|
||||
wrqu.data.length = dataLen;
|
||||
|
||||
wireless_send_event(pAd->net_dev, eventType, &wrqu, (char *)pData);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int RtmpOSNetDevAddrSet(
|
||||
IN PNET_DEV pNetDev,
|
||||
IN PUCHAR pMacAddr)
|
||||
{
|
||||
struct net_device *net_dev;
|
||||
RTMP_ADAPTER *pAd;
|
||||
|
||||
net_dev = pNetDev;
|
||||
GET_PAD_FROM_NET_DEV(pAd, net_dev);
|
||||
|
||||
// work-around for the SuSE due to it has it's own interface name management system.
|
||||
{
|
||||
NdisZeroMemory(pAd->StaCfg.dev_name, 16);
|
||||
NdisMoveMemory(pAd->StaCfg.dev_name, net_dev->name, strlen(net_dev->name));
|
||||
}
|
||||
|
||||
NdisMoveMemory(net_dev->dev_addr, pMacAddr, 6);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* Assign the network dev name for created Ralink WiFi interface.
|
||||
*/
|
||||
static int RtmpOSNetDevRequestName(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN PNET_DEV dev,
|
||||
IN PSTRING pPrefixStr,
|
||||
IN INT devIdx)
|
||||
{
|
||||
PNET_DEV existNetDev;
|
||||
STRING suffixName[IFNAMSIZ];
|
||||
STRING desiredName[IFNAMSIZ];
|
||||
int ifNameIdx, prefixLen, slotNameLen;
|
||||
int Status;
|
||||
|
||||
|
||||
prefixLen = strlen(pPrefixStr);
|
||||
ASSERT((prefixLen < IFNAMSIZ));
|
||||
|
||||
for (ifNameIdx = devIdx; ifNameIdx < 32; ifNameIdx++)
|
||||
{
|
||||
memset(suffixName, 0, IFNAMSIZ);
|
||||
memset(desiredName, 0, IFNAMSIZ);
|
||||
strncpy(&desiredName[0], pPrefixStr, prefixLen);
|
||||
|
||||
sprintf(suffixName, "%d", ifNameIdx);
|
||||
|
||||
slotNameLen = strlen(suffixName);
|
||||
ASSERT(((slotNameLen + prefixLen) < IFNAMSIZ));
|
||||
strcat(desiredName, suffixName);
|
||||
|
||||
existNetDev = RtmpOSNetDevGetByName(dev, &desiredName[0]);
|
||||
if (existNetDev == NULL)
|
||||
break;
|
||||
else
|
||||
RtmpOSNetDeviceRefPut(existNetDev);
|
||||
}
|
||||
|
||||
if(ifNameIdx < 32)
|
||||
{
|
||||
strcpy(&dev->name[0], &desiredName[0]);
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR,
|
||||
("Cannot request DevName with preifx(%s) and in range(0~32) as suffix from OS!\n", pPrefixStr));
|
||||
Status = NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSNetDevClose(
|
||||
IN PNET_DEV pNetDev)
|
||||
{
|
||||
dev_close(pNetDev);
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSNetDevFree(PNET_DEV pNetDev)
|
||||
{
|
||||
ASSERT(pNetDev);
|
||||
|
||||
free_netdev(pNetDev);
|
||||
}
|
||||
|
||||
|
||||
INT RtmpOSNetDevAlloc(
|
||||
IN PNET_DEV *new_dev_p,
|
||||
IN UINT32 privDataSize)
|
||||
{
|
||||
// assign it as null first.
|
||||
*new_dev_p = NULL;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Allocate a net device with private data size=%d!\n", privDataSize));
|
||||
*new_dev_p = alloc_etherdev(privDataSize);
|
||||
if (*new_dev_p)
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
else
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
PNET_DEV RtmpOSNetDevGetByName(PNET_DEV pNetDev, PSTRING pDevName)
|
||||
{
|
||||
PNET_DEV pTargetNetDev = NULL;
|
||||
|
||||
pTargetNetDev = dev_get_by_name(dev_net(pNetDev), pDevName);
|
||||
|
||||
return pTargetNetDev;
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSNetDeviceRefPut(PNET_DEV pNetDev)
|
||||
{
|
||||
/*
|
||||
every time dev_get_by_name is called, and it has returned a valid struct
|
||||
net_device*, dev_put should be called afterwards, because otherwise the
|
||||
machine hangs when the device is unregistered (since dev->refcnt > 1).
|
||||
*/
|
||||
if(pNetDev)
|
||||
dev_put(pNetDev);
|
||||
}
|
||||
|
||||
|
||||
INT RtmpOSNetDevDestory(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN PNET_DEV pNetDev)
|
||||
{
|
||||
|
||||
// TODO: Need to fix this
|
||||
printk("WARNING: This function(%s) not implement yet!!!\n", __func__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
void RtmpOSNetDevDetach(PNET_DEV pNetDev)
|
||||
{
|
||||
unregister_netdev(pNetDev);
|
||||
}
|
||||
|
||||
|
||||
int RtmpOSNetDevAttach(
|
||||
IN PNET_DEV pNetDev,
|
||||
IN RTMP_OS_NETDEV_OP_HOOK *pDevOpHook)
|
||||
{
|
||||
int ret, rtnl_locked = FALSE;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("RtmpOSNetDevAttach()--->\n"));
|
||||
// If we need hook some callback function to the net device structrue, now do it.
|
||||
if (pDevOpHook)
|
||||
{
|
||||
PRTMP_ADAPTER pAd = NULL;
|
||||
|
||||
GET_PAD_FROM_NET_DEV(pAd, pNetDev);
|
||||
|
||||
pNetDev->netdev_ops = pDevOpHook->netdev_ops;
|
||||
|
||||
/* OS specific flags, here we used to indicate if we are virtual interface */
|
||||
pNetDev->priv_flags = pDevOpHook->priv_flags;
|
||||
|
||||
|
||||
if (pAd->OpMode == OPMODE_STA)
|
||||
{
|
||||
pNetDev->wireless_handlers = &rt28xx_iw_handler_def;
|
||||
}
|
||||
|
||||
|
||||
// copy the net device mac address to the net_device structure.
|
||||
NdisMoveMemory(pNetDev->dev_addr, &pDevOpHook->devAddr[0], MAC_ADDR_LEN);
|
||||
|
||||
rtnl_locked = pDevOpHook->needProtcted;
|
||||
}
|
||||
|
||||
if (rtnl_locked)
|
||||
ret = register_netdevice(pNetDev);
|
||||
else
|
||||
ret = register_netdev(pNetDev);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<---RtmpOSNetDevAttach(), ret=%d\n", ret));
|
||||
if (ret == 0)
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
else
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
PNET_DEV RtmpOSNetDevCreate(
|
||||
IN RTMP_ADAPTER *pAd,
|
||||
IN INT devType,
|
||||
IN INT devNum,
|
||||
IN INT privMemSize,
|
||||
IN PSTRING pNamePrefix)
|
||||
{
|
||||
struct net_device *pNetDev = NULL;
|
||||
int status;
|
||||
|
||||
|
||||
/* allocate a new network device */
|
||||
status = RtmpOSNetDevAlloc(&pNetDev, 0 /*privMemSize*/);
|
||||
if (status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
/* allocation fail, exit */
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Allocate network device fail (%s)...\n", pNamePrefix));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* find a available interface name, max 32 interfaces */
|
||||
status = RtmpOSNetDevRequestName(pAd, pNetDev, pNamePrefix, devNum);
|
||||
if (status != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
/* error! no any available ra name can be used! */
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Assign interface name (%s with suffix 0~32) failed...\n", pNamePrefix));
|
||||
RtmpOSNetDevFree(pNetDev);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("The name of the new %s interface is %s...\n", pNamePrefix, pNetDev->name));
|
||||
}
|
||||
|
||||
return pNetDev;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
877
drivers/staging/rt2860/rt_pci_rbus.c
Normal file
877
drivers/staging/rt2860/rt_pci_rbus.c
Normal file
@ -0,0 +1,877 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_pci_rbus.c
|
||||
|
||||
Abstract:
|
||||
Create and register network interface.
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
#include <linux/pci.h>
|
||||
|
||||
IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance);
|
||||
|
||||
static void rx_done_tasklet(unsigned long data);
|
||||
static void mgmt_dma_done_tasklet(unsigned long data);
|
||||
static void ac0_dma_done_tasklet(unsigned long data);
|
||||
static void ac1_dma_done_tasklet(unsigned long data);
|
||||
static void ac2_dma_done_tasklet(unsigned long data);
|
||||
static void ac3_dma_done_tasklet(unsigned long data);
|
||||
static void fifo_statistic_full_tasklet(unsigned long data);
|
||||
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------*/
|
||||
/* Symbol & Macro Definitions */
|
||||
/*---------------------------------------------------------------------*/
|
||||
#define RT2860_INT_RX_DLY (1<<0) // bit 0
|
||||
#define RT2860_INT_TX_DLY (1<<1) // bit 1
|
||||
#define RT2860_INT_RX_DONE (1<<2) // bit 2
|
||||
#define RT2860_INT_AC0_DMA_DONE (1<<3) // bit 3
|
||||
#define RT2860_INT_AC1_DMA_DONE (1<<4) // bit 4
|
||||
#define RT2860_INT_AC2_DMA_DONE (1<<5) // bit 5
|
||||
#define RT2860_INT_AC3_DMA_DONE (1<<6) // bit 6
|
||||
#define RT2860_INT_HCCA_DMA_DONE (1<<7) // bit 7
|
||||
#define RT2860_INT_MGMT_DONE (1<<8) // bit 8
|
||||
|
||||
#define INT_RX RT2860_INT_RX_DONE
|
||||
|
||||
#define INT_AC0_DLY (RT2860_INT_AC0_DMA_DONE) //| RT2860_INT_TX_DLY)
|
||||
#define INT_AC1_DLY (RT2860_INT_AC1_DMA_DONE) //| RT2860_INT_TX_DLY)
|
||||
#define INT_AC2_DLY (RT2860_INT_AC2_DMA_DONE) //| RT2860_INT_TX_DLY)
|
||||
#define INT_AC3_DLY (RT2860_INT_AC3_DMA_DONE) //| RT2860_INT_TX_DLY)
|
||||
#define INT_HCCA_DLY (RT2860_INT_HCCA_DMA_DONE) //| RT2860_INT_TX_DLY)
|
||||
#define INT_MGMT_DLY RT2860_INT_MGMT_DONE
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* Interface-depended memory allocation/Free related procedures.
|
||||
* Mainly for Hardware TxDesc/RxDesc/MgmtDesc, DMA Memory for TxData/RxData, etc.,
|
||||
*
|
||||
**************************************************************************/
|
||||
// Function for TxDesc Memory allocation.
|
||||
void RTMP_AllocateTxDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT Index,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Function for MgmtDesc Memory allocation.
|
||||
void RTMP_AllocateMgmtDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Function for RxDesc Memory allocation.
|
||||
void RTMP_AllocateRxDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
|
||||
}
|
||||
|
||||
|
||||
// Function for free allocated Desc Memory.
|
||||
void RTMP_FreeDescMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN PVOID VirtualAddress,
|
||||
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress);
|
||||
}
|
||||
|
||||
|
||||
// Function for TxData DMA Memory allocation.
|
||||
void RTMP_AllocateFirstTxBuffer(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT Index,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
}
|
||||
|
||||
|
||||
void RTMP_FreeFirstTxBuffer(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
IN PVOID VirtualAddress,
|
||||
IN NDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
pci_free_consistent(pObj->pci_dev, Length, VirtualAddress, PhysicalAddress);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Allocate a common buffer for DMA
|
||||
* ARGUMENTS:
|
||||
* AdapterHandle: AdapterHandle
|
||||
* Length: Number of bytes to allocate
|
||||
* Cached: Whether or not the memory can be cached
|
||||
* VirtualAddress: Pointer to memory is returned here
|
||||
* PhysicalAddress: Physical address corresponding to virtual address
|
||||
*/
|
||||
void RTMP_AllocateSharedMemory(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
*VirtualAddress = (PVOID)pci_alloc_consistent(pObj->pci_dev,sizeof(char)*Length, PhysicalAddress);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FUNCTION: Allocate a packet buffer for DMA
|
||||
* ARGUMENTS:
|
||||
* AdapterHandle: AdapterHandle
|
||||
* Length: Number of bytes to allocate
|
||||
* Cached: Whether or not the memory can be cached
|
||||
* VirtualAddress: Pointer to memory is returned here
|
||||
* PhysicalAddress: Physical address corresponding to virtual address
|
||||
* Notes:
|
||||
* Cached is ignored: always cached memory
|
||||
*/
|
||||
PNDIS_PACKET RTMP_AllocateRxPacketBuffer(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG Length,
|
||||
IN BOOLEAN Cached,
|
||||
OUT PVOID *VirtualAddress,
|
||||
OUT PNDIS_PHYSICAL_ADDRESS PhysicalAddress)
|
||||
{
|
||||
struct sk_buff *pkt;
|
||||
|
||||
pkt = dev_alloc_skb(Length);
|
||||
|
||||
if (pkt == NULL) {
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("can't allocate rx %ld size packet\n",Length));
|
||||
}
|
||||
|
||||
if (pkt) {
|
||||
RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
|
||||
*VirtualAddress = (PVOID) pkt->data;
|
||||
*PhysicalAddress = PCI_MAP_SINGLE(pAd, *VirtualAddress, Length, -1, PCI_DMA_FROMDEVICE);
|
||||
} else {
|
||||
*VirtualAddress = (PVOID) NULL;
|
||||
*PhysicalAddress = (NDIS_PHYSICAL_ADDRESS) NULL;
|
||||
}
|
||||
|
||||
return (PNDIS_PACKET) pkt;
|
||||
}
|
||||
|
||||
|
||||
VOID Invalid_Remaining_Packet(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN ULONG VirtualAddress)
|
||||
{
|
||||
NDIS_PHYSICAL_ADDRESS PhysicalAddress;
|
||||
|
||||
PhysicalAddress = PCI_MAP_SINGLE(pAd, (void *)(VirtualAddress+1600), RX_BUFFER_NORMSIZE-1600, -1, PCI_DMA_FROMDEVICE);
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RtmpNetTaskInit(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->mgmt_dma_done_task, mgmt_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac0_dma_done_task, ac0_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac1_dma_done_task, ac1_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac2_dma_done_task, ac2_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac3_dma_done_task, ac3_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->fifo_statistic_full_task, fifo_statistic_full_tasklet, (unsigned long)pAd);
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
tasklet_kill(&pObj->rx_done_task);
|
||||
tasklet_kill(&pObj->mgmt_dma_done_task);
|
||||
tasklet_kill(&pObj->ac0_dma_done_task);
|
||||
tasklet_kill(&pObj->ac1_dma_done_task);
|
||||
tasklet_kill(&pObj->ac2_dma_done_task);
|
||||
tasklet_kill(&pObj->ac3_dma_done_task);
|
||||
tasklet_kill(&pObj->tbtt_task);
|
||||
tasklet_kill(&pObj->fifo_statistic_full_task);
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RtmpMgmtTaskInit(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close kernel threads.
|
||||
|
||||
Arguments:
|
||||
*pAd the raxx interface data pointer
|
||||
|
||||
Return Value:
|
||||
NONE
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpMgmtTaskExit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static inline void rt2860_int_enable(PRTMP_ADAPTER pAd, unsigned int mode)
|
||||
{
|
||||
u32 regValue;
|
||||
|
||||
pAd->int_disable_mask &= ~(mode);
|
||||
regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask);
|
||||
//if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
|
||||
{
|
||||
RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 1:enable
|
||||
}
|
||||
//else
|
||||
// DBGPRINT(RT_DEBUG_TRACE, ("fOP_STATUS_DOZE !\n"));
|
||||
|
||||
if (regValue != 0)
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);
|
||||
}
|
||||
|
||||
|
||||
static inline void rt2860_int_disable(PRTMP_ADAPTER pAd, unsigned int mode)
|
||||
{
|
||||
u32 regValue;
|
||||
|
||||
pAd->int_disable_mask |= mode;
|
||||
regValue = pAd->int_enable_reg & ~(pAd->int_disable_mask);
|
||||
RTMP_IO_WRITE32(pAd, INT_MASK_CSR, regValue); // 0: disable
|
||||
|
||||
if (regValue == 0)
|
||||
{
|
||||
RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_ACTIVE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* tasklet related procedures.
|
||||
*
|
||||
**************************************************************************/
|
||||
static void mgmt_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
INT_SOURCE_CSR_STRUC IntSource;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
// printk("mgmt_dma_done_process\n");
|
||||
IntSource.word = 0;
|
||||
IntSource.field.MgmtDmaDone = 1;
|
||||
pAd->int_pending &= ~INT_MGMT_DLY;
|
||||
|
||||
RTMPHandleMgmtRingDmaDoneInterrupt(pAd);
|
||||
|
||||
// if you use RTMP_SEM_LOCK, sometimes kernel will hang up, no any
|
||||
// bug report output
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
/*
|
||||
* double check to avoid lose of interrupts
|
||||
*/
|
||||
if (pAd->int_pending & INT_MGMT_DLY)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable TxDataInt again */
|
||||
rt2860_int_enable(pAd, INT_MGMT_DLY);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
static void rx_done_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
BOOLEAN bReschedule = 0;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pAd->int_pending &= ~(INT_RX);
|
||||
bReschedule = STARxDoneInterruptHandle(pAd, 0);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
/*
|
||||
* double check to avoid rotting packet
|
||||
*/
|
||||
if (pAd->int_pending & INT_RX || bReschedule)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->rx_done_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable RxINT again */
|
||||
rt2860_int_enable(pAd, INT_RX);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void fifo_statistic_full_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
pAd->int_pending &= ~(FifoStaFullInt);
|
||||
NICUpdateFifoStaCounters(pAd);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
/*
|
||||
* double check to avoid rotting packet
|
||||
*/
|
||||
if (pAd->int_pending & FifoStaFullInt)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable RxINT again */
|
||||
|
||||
rt2860_int_enable(pAd, FifoStaFullInt);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
|
||||
}
|
||||
|
||||
static void ac3_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
INT_SOURCE_CSR_STRUC IntSource;
|
||||
POS_COOKIE pObj;
|
||||
BOOLEAN bReschedule = 0;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
// printk("ac0_dma_done_process\n");
|
||||
IntSource.word = 0;
|
||||
IntSource.field.Ac3DmaDone = 1;
|
||||
pAd->int_pending &= ~INT_AC3_DLY;
|
||||
|
||||
bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
/*
|
||||
* double check to avoid lose of interrupts
|
||||
*/
|
||||
if ((pAd->int_pending & INT_AC3_DLY) || bReschedule)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->ac3_dma_done_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable TxDataInt again */
|
||||
rt2860_int_enable(pAd, INT_AC3_DLY);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
static void ac2_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
INT_SOURCE_CSR_STRUC IntSource;
|
||||
POS_COOKIE pObj;
|
||||
BOOLEAN bReschedule = 0;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
IntSource.word = 0;
|
||||
IntSource.field.Ac2DmaDone = 1;
|
||||
pAd->int_pending &= ~INT_AC2_DLY;
|
||||
|
||||
bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
|
||||
/*
|
||||
* double check to avoid lose of interrupts
|
||||
*/
|
||||
if ((pAd->int_pending & INT_AC2_DLY) || bReschedule)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->ac2_dma_done_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable TxDataInt again */
|
||||
rt2860_int_enable(pAd, INT_AC2_DLY);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
static void ac1_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
INT_SOURCE_CSR_STRUC IntSource;
|
||||
POS_COOKIE pObj;
|
||||
BOOLEAN bReschedule = 0;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
// printk("ac0_dma_done_process\n");
|
||||
IntSource.word = 0;
|
||||
IntSource.field.Ac1DmaDone = 1;
|
||||
pAd->int_pending &= ~INT_AC1_DLY;
|
||||
|
||||
bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
/*
|
||||
* double check to avoid lose of interrupts
|
||||
*/
|
||||
if ((pAd->int_pending & INT_AC1_DLY) || bReschedule)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->ac1_dma_done_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable TxDataInt again */
|
||||
rt2860_int_enable(pAd, INT_AC1_DLY);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
static void ac0_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
PRTMP_ADAPTER pAd = (PRTMP_ADAPTER) data;
|
||||
INT_SOURCE_CSR_STRUC IntSource;
|
||||
POS_COOKIE pObj;
|
||||
BOOLEAN bReschedule = 0;
|
||||
|
||||
// Do nothing if the driver is starting halt state.
|
||||
// This might happen when timer already been fired before cancel timer with mlmehalt
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST))
|
||||
return;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
// printk("ac0_dma_done_process\n");
|
||||
IntSource.word = 0;
|
||||
IntSource.field.Ac0DmaDone = 1;
|
||||
pAd->int_pending &= ~INT_AC0_DLY;
|
||||
|
||||
// RTMPHandleMgmtRingDmaDoneInterrupt(pAd);
|
||||
bReschedule = RTMPHandleTxRingDmaDoneInterrupt(pAd, IntSource);
|
||||
|
||||
RTMP_INT_LOCK(&pAd->irq_lock, flags);
|
||||
/*
|
||||
* double check to avoid lose of interrupts
|
||||
*/
|
||||
if ((pAd->int_pending & INT_AC0_DLY) || bReschedule)
|
||||
{
|
||||
tasklet_hi_schedule(&pObj->ac0_dma_done_task);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* enable TxDataInt again */
|
||||
rt2860_int_enable(pAd, INT_AC0_DLY);
|
||||
RTMP_INT_UNLOCK(&pAd->irq_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/***************************************************************************
|
||||
*
|
||||
* interrupt handler related procedures.
|
||||
*
|
||||
**************************************************************************/
|
||||
int print_int_count;
|
||||
|
||||
IRQ_HANDLE_TYPE rt2860_interrupt(int irq, void *dev_instance)
|
||||
{
|
||||
struct net_device *net_dev = (struct net_device *) dev_instance;
|
||||
PRTMP_ADAPTER pAd = NULL;
|
||||
INT_SOURCE_CSR_STRUC IntSource;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
GET_PAD_FROM_NET_DEV(pAd, net_dev);
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
|
||||
/* Note 03312008: we can not return here before
|
||||
RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);
|
||||
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word);
|
||||
Or kernel will panic after ifconfig ra0 down sometimes */
|
||||
|
||||
|
||||
//
|
||||
// Inital the Interrupt source.
|
||||
//
|
||||
IntSource.word = 0x00000000L;
|
||||
// McuIntSource.word = 0x00000000L;
|
||||
|
||||
//
|
||||
// Get the interrupt sources & saved to local variable
|
||||
//
|
||||
//RTMP_IO_READ32(pAd, where, &McuIntSource.word);
|
||||
//RTMP_IO_WRITE32(pAd, , McuIntSource.word);
|
||||
|
||||
//
|
||||
// Flag fOP_STATUS_DOZE On, means ASIC put to sleep, elase means ASICK WakeUp
|
||||
// And at the same time, clock maybe turned off that say there is no DMA service.
|
||||
// when ASIC get to sleep.
|
||||
// To prevent system hang on power saving.
|
||||
// We need to check it before handle the INT_SOURCE_CSR, ASIC must be wake up.
|
||||
//
|
||||
// RT2661 => when ASIC is sleeping, MAC register cannot be read and written.
|
||||
// RT2860 => when ASIC is sleeping, MAC register can be read and written.
|
||||
// if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
|
||||
{
|
||||
RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IntSource.word);
|
||||
RTMP_IO_WRITE32(pAd, INT_SOURCE_CSR, IntSource.word); // write 1 to clear
|
||||
}
|
||||
// else
|
||||
// DBGPRINT(RT_DEBUG_TRACE, (">>>fOP_STATUS_DOZE<<<\n"));
|
||||
|
||||
// RTMP_IO_READ32(pAd, INT_SOURCE_CSR, &IsrAfterClear);
|
||||
// RTMP_IO_READ32(pAd, MCU_INT_SOURCE_CSR, &McuIsrAfterClear);
|
||||
// DBGPRINT(RT_DEBUG_INFO, ("====> RTMPHandleInterrupt(ISR=%08x,Mcu ISR=%08x, After clear ISR=%08x, MCU ISR=%08x)\n",
|
||||
// IntSource.word, McuIntSource.word, IsrAfterClear, McuIsrAfterClear));
|
||||
|
||||
// Do nothing if Reset in progress
|
||||
if (RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |fRTMP_ADAPTER_HALT_IN_PROGRESS)))
|
||||
{
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
//
|
||||
// Handle interrupt, walk through all bits
|
||||
// Should start from highest priority interrupt
|
||||
// The priority can be adjust by altering processing if statement
|
||||
//
|
||||
|
||||
#ifdef DBG
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
pAd->bPCIclkOff = FALSE;
|
||||
|
||||
// If required spinlock, each interrupt service routine has to acquire
|
||||
// and release itself.
|
||||
//
|
||||
|
||||
// Do nothing if NIC doesn't exist
|
||||
if (IntSource.word == 0xffffffff)
|
||||
{
|
||||
RTMP_SET_FLAG(pAd, (fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_HALT_IN_PROGRESS));
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
if (IntSource.word & TxCoherent)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, (">>>TxCoherent<<<\n"));
|
||||
RTMPHandleRxCoherentInterrupt(pAd);
|
||||
}
|
||||
|
||||
if (IntSource.word & RxCoherent)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, (">>>RxCoherent<<<\n"));
|
||||
RTMPHandleRxCoherentInterrupt(pAd);
|
||||
}
|
||||
|
||||
if (IntSource.word & FifoStaFullInt)
|
||||
{
|
||||
if ((pAd->int_disable_mask & FifoStaFullInt) == 0)
|
||||
{
|
||||
/* mask FifoStaFullInt */
|
||||
rt2860_int_disable(pAd, FifoStaFullInt);
|
||||
tasklet_hi_schedule(&pObj->fifo_statistic_full_task);
|
||||
}
|
||||
pAd->int_pending |= FifoStaFullInt;
|
||||
}
|
||||
|
||||
if (IntSource.word & INT_MGMT_DLY)
|
||||
{
|
||||
if ((pAd->int_disable_mask & INT_MGMT_DLY) ==0 )
|
||||
{
|
||||
rt2860_int_disable(pAd, INT_MGMT_DLY);
|
||||
tasklet_hi_schedule(&pObj->mgmt_dma_done_task);
|
||||
}
|
||||
pAd->int_pending |= INT_MGMT_DLY ;
|
||||
}
|
||||
|
||||
if (IntSource.word & INT_RX)
|
||||
{
|
||||
if ((pAd->int_disable_mask & INT_RX) == 0)
|
||||
{
|
||||
|
||||
/* mask RxINT */
|
||||
rt2860_int_disable(pAd, INT_RX);
|
||||
tasklet_hi_schedule(&pObj->rx_done_task);
|
||||
}
|
||||
pAd->int_pending |= INT_RX;
|
||||
}
|
||||
|
||||
if (IntSource.word & INT_AC3_DLY)
|
||||
{
|
||||
|
||||
if ((pAd->int_disable_mask & INT_AC3_DLY) == 0)
|
||||
{
|
||||
/* mask TxDataInt */
|
||||
rt2860_int_disable(pAd, INT_AC3_DLY);
|
||||
tasklet_hi_schedule(&pObj->ac3_dma_done_task);
|
||||
}
|
||||
pAd->int_pending |= INT_AC3_DLY;
|
||||
}
|
||||
|
||||
if (IntSource.word & INT_AC2_DLY)
|
||||
{
|
||||
|
||||
if ((pAd->int_disable_mask & INT_AC2_DLY) == 0)
|
||||
{
|
||||
/* mask TxDataInt */
|
||||
rt2860_int_disable(pAd, INT_AC2_DLY);
|
||||
tasklet_hi_schedule(&pObj->ac2_dma_done_task);
|
||||
}
|
||||
pAd->int_pending |= INT_AC2_DLY;
|
||||
}
|
||||
|
||||
if (IntSource.word & INT_AC1_DLY)
|
||||
{
|
||||
|
||||
pAd->int_pending |= INT_AC1_DLY;
|
||||
|
||||
if ((pAd->int_disable_mask & INT_AC1_DLY) == 0)
|
||||
{
|
||||
/* mask TxDataInt */
|
||||
rt2860_int_disable(pAd, INT_AC1_DLY);
|
||||
tasklet_hi_schedule(&pObj->ac1_dma_done_task);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (IntSource.word & INT_AC0_DLY)
|
||||
{
|
||||
|
||||
/*
|
||||
if (IntSource.word & 0x2) {
|
||||
u32 reg;
|
||||
RTMP_IO_READ32(pAd, DELAY_INT_CFG, ®);
|
||||
printk("IntSource.word = %08x, DELAY_REG = %08x\n", IntSource.word, reg);
|
||||
}
|
||||
*/
|
||||
pAd->int_pending |= INT_AC0_DLY;
|
||||
|
||||
if ((pAd->int_disable_mask & INT_AC0_DLY) == 0)
|
||||
{
|
||||
/* mask TxDataInt */
|
||||
rt2860_int_disable(pAd, INT_AC0_DLY);
|
||||
tasklet_hi_schedule(&pObj->ac0_dma_done_task);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
if (IntSource.word & PreTBTTInt)
|
||||
{
|
||||
RTMPHandlePreTBTTInterrupt(pAd);
|
||||
}
|
||||
|
||||
if (IntSource.word & TBTTInt)
|
||||
{
|
||||
RTMPHandleTBTTInterrupt(pAd);
|
||||
}
|
||||
|
||||
{
|
||||
if (IntSource.word & AutoWakeupInt)
|
||||
RTMPHandleTwakeupInterrupt(pAd);
|
||||
}
|
||||
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
/*
|
||||
* invaild or writeback cache
|
||||
* and convert virtual address to physical address
|
||||
*/
|
||||
dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int sd_idx, int direction)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
/*
|
||||
------ Porting Information ------
|
||||
> For Tx Alloc:
|
||||
mgmt packets => sd_idx = 0
|
||||
SwIdx: pAd->MgmtRing.TxCpuIdx
|
||||
pTxD : pAd->MgmtRing.Cell[SwIdx].AllocVa;
|
||||
|
||||
data packets => sd_idx = 1
|
||||
TxIdx : pAd->TxRing[pTxBlk->QueIdx].TxCpuIdx
|
||||
QueIdx: pTxBlk->QueIdx
|
||||
pTxD : pAd->TxRing[pTxBlk->QueIdx].Cell[TxIdx].AllocVa;
|
||||
|
||||
> For Rx Alloc:
|
||||
sd_idx = -1
|
||||
*/
|
||||
|
||||
pAd = (PRTMP_ADAPTER)handle;
|
||||
pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
if (sd_idx == 1)
|
||||
{
|
||||
PTX_BLK pTxBlk;
|
||||
pTxBlk = (PTX_BLK)ptr;
|
||||
return pci_map_single(pObj->pci_dev, pTxBlk->pSrcBufData, pTxBlk->SrcBufLen, direction);
|
||||
}
|
||||
else
|
||||
{
|
||||
return pci_map_single(pObj->pci_dev, ptr, size, direction);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pAd=(PRTMP_ADAPTER)handle;
|
||||
pObj = (POS_COOKIE)pAd->OS_Cookie;
|
||||
|
||||
if (size > 0)
|
||||
pci_unmap_single(pObj->pci_dev, dma_addr, size, direction);
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
828
drivers/staging/rt2860/rt_usb.c
Normal file
828
drivers/staging/rt2860/rt_usb.c
Normal file
@ -0,0 +1,828 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtusb_bulk.c
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
|
||||
*/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
void dump_urb(struct urb* purb)
|
||||
{
|
||||
printk("urb :0x%08lx\n", (unsigned long)purb);
|
||||
printk("\tdev :0x%08lx\n", (unsigned long)purb->dev);
|
||||
printk("\t\tdev->state :0x%d\n", purb->dev->state);
|
||||
printk("\tpipe :0x%08x\n", purb->pipe);
|
||||
printk("\tstatus :%d\n", purb->status);
|
||||
printk("\ttransfer_flags :0x%08x\n", purb->transfer_flags);
|
||||
printk("\ttransfer_buffer :0x%08lx\n", (unsigned long)purb->transfer_buffer);
|
||||
printk("\ttransfer_buffer_length:%d\n", purb->transfer_buffer_length);
|
||||
printk("\tactual_length :%d\n", purb->actual_length);
|
||||
printk("\tsetup_packet :0x%08lx\n", (unsigned long)purb->setup_packet);
|
||||
printk("\tstart_frame :%d\n", purb->start_frame);
|
||||
printk("\tnumber_of_packets :%d\n", purb->number_of_packets);
|
||||
printk("\tinterval :%d\n", purb->interval);
|
||||
printk("\terror_count :%d\n", purb->error_count);
|
||||
printk("\tcontext :0x%08lx\n", (unsigned long)purb->context);
|
||||
printk("\tcomplete :0x%08lx\n\n", (unsigned long)purb->complete);
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Create kernel threads & tasklets.
|
||||
|
||||
Arguments:
|
||||
*net_dev Pointer to wireless net device interface
|
||||
|
||||
Return Value:
|
||||
NDIS_STATUS_SUCCESS
|
||||
NDIS_STATUS_FAILURE
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
NDIS_STATUS RtmpMgmtTaskInit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
RTMP_OS_TASK *pTask;
|
||||
NDIS_STATUS status;
|
||||
|
||||
/*
|
||||
Creat TimerQ Thread, We need init timerQ related structure before create the timer thread.
|
||||
*/
|
||||
RtmpTimerQInit(pAd);
|
||||
|
||||
pTask = &pAd->timerTask;
|
||||
RtmpOSTaskInit(pTask, "RtmpTimerTask", pAd);
|
||||
status = RtmpOSTaskAttach(pTask, RtmpTimerQThread, pTask);
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
printk (KERN_WARNING "%s: unable to start RtmpTimerQThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Creat MLME Thread */
|
||||
pTask = &pAd->mlmeTask;
|
||||
RtmpOSTaskInit(pTask, "RtmpMlmeTask", pAd);
|
||||
status = RtmpOSTaskAttach(pTask, MlmeThread, pTask);
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
printk (KERN_WARNING "%s: unable to start MlmeThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
/* Creat Command Thread */
|
||||
pTask = &pAd->cmdQTask;
|
||||
RtmpOSTaskInit(pTask, "RtmpCmdQTask", pAd);
|
||||
status = RtmpOSTaskAttach(pTask, RTUSBCmdThread, pTask);
|
||||
if (status == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
printk (KERN_WARNING "%s: unable to start RTUSBCmdThread\n", RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev));
|
||||
return NDIS_STATUS_FAILURE;
|
||||
}
|
||||
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Close kernel threads.
|
||||
|
||||
Arguments:
|
||||
*pAd the raxx interface data pointer
|
||||
|
||||
Return Value:
|
||||
NONE
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
VOID RtmpMgmtTaskExit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
INT ret;
|
||||
RTMP_OS_TASK *pTask;
|
||||
|
||||
// Sleep 50 milliseconds so pending io might finish normally
|
||||
RTMPusecDelay(50000);
|
||||
|
||||
// We want to wait until all pending receives and sends to the
|
||||
// device object. We cancel any
|
||||
// irps. Wait until sends and receives have stopped.
|
||||
RTUSBCancelPendingIRPs(pAd);
|
||||
|
||||
// We need clear timerQ related structure before exits of the timer thread.
|
||||
RtmpTimerQExit(pAd);
|
||||
|
||||
/* Terminate Mlme Thread */
|
||||
pTask = &pAd->mlmeTask;
|
||||
ret = RtmpOSTaskKill(pTask);
|
||||
if (ret == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
|
||||
RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName));
|
||||
}
|
||||
|
||||
/* Terminate cmdQ thread */
|
||||
pTask = &pAd->cmdQTask;
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
if (pTask->kthread_task)
|
||||
#else
|
||||
CHECK_PID_LEGALITY(pTask->taskPID)
|
||||
#endif
|
||||
{
|
||||
mb();
|
||||
NdisAcquireSpinLock(&pAd->CmdQLock);
|
||||
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
|
||||
NdisReleaseSpinLock(&pAd->CmdQLock);
|
||||
mb();
|
||||
//RTUSBCMDUp(pAd);
|
||||
ret = RtmpOSTaskKill(pTask);
|
||||
if (ret == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
|
||||
RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName));
|
||||
}
|
||||
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_UNKNOWN;
|
||||
}
|
||||
|
||||
/* Terminate timer thread */
|
||||
pTask = &pAd->timerTask;
|
||||
ret = RtmpOSTaskKill(pTask);
|
||||
if (ret == NDIS_STATUS_FAILURE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s: kill task(%s) failed!\n",
|
||||
RTMP_OS_NETDEV_GET_DEVNAME(pAd->net_dev), pTask->taskName));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_dataout_complete(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
purbb_t pUrb;
|
||||
POS_COOKIE pObj;
|
||||
PHT_TX_CONTEXT pHTTXContext;
|
||||
UCHAR BulkOutPipeId;
|
||||
NTSTATUS Status;
|
||||
unsigned long IrqFlags;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
|
||||
pAd = pHTTXContext->pAd;
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
Status = pUrb->status;
|
||||
|
||||
// Store BulkOut PipeId
|
||||
BulkOutPipeId = pHTTXContext->BulkOutPipeId;
|
||||
pAd->BulkOutDataOneSecCount++;
|
||||
|
||||
//DBGPRINT(RT_DEBUG_LOUD, ("Done-B(%d):I=0x%lx, CWPos=%ld, NBPos=%ld, ENBPos=%ld, bCopy=%d!\n", BulkOutPipeId, in_interrupt(), pHTTXContext->CurWritePosition,
|
||||
// pHTTXContext->NextBulkOutPosition, pHTTXContext->ENextBulkOutPosition, pHTTXContext->bCopySavePad));
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
|
||||
pAd->BulkOutPending[BulkOutPipeId] = FALSE;
|
||||
pHTTXContext->IRPPending = FALSE;
|
||||
pAd->watchDogTxPendingCnt[BulkOutPipeId] = 0;
|
||||
|
||||
if (Status == USB_ST_NOERROR)
|
||||
{
|
||||
pAd->BulkOutComplete++;
|
||||
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
|
||||
|
||||
pAd->Counters8023.GoodTransmits++;
|
||||
//RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
|
||||
FREE_HTTX_RING(pAd, BulkOutPipeId, pHTTXContext);
|
||||
//RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
|
||||
|
||||
|
||||
}
|
||||
else // STATUS_OTHER
|
||||
{
|
||||
PUCHAR pBuf;
|
||||
|
||||
pAd->BulkOutCompleteOther++;
|
||||
|
||||
pBuf = &pHTTXContext->TransferBuffer->field.WirelessPacket[pHTTXContext->NextBulkOutPosition];
|
||||
|
||||
if (!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST |
|
||||
fRTMP_ADAPTER_BULKOUT_RESET)))
|
||||
{
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
|
||||
pAd->bulkResetPipeid = BulkOutPipeId;
|
||||
pAd->bulkResetReq[BulkOutPipeId] = pAd->BulkOutReq;
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[BulkOutPipeId], IrqFlags);
|
||||
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("BulkOutDataPacket failed: ReasonCode=%d!\n", Status));
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Req=0x%lx, Complete=0x%lx, Other=0x%lx\n", pAd->BulkOutReq, pAd->BulkOutComplete, pAd->BulkOutCompleteOther));
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("\t>>BulkOut Header:%x %x %x %x %x %x %x %x\n", pBuf[0], pBuf[1], pBuf[2], pBuf[3], pBuf[4], pBuf[5], pBuf[6], pBuf[7]));
|
||||
//DBGPRINT_RAW(RT_DEBUG_ERROR, (">>BulkOutCompleteCancel=0x%x, BulkOutCompleteOther=0x%x\n", pAd->BulkOutCompleteCancel, pAd->BulkOutCompleteOther));
|
||||
|
||||
}
|
||||
|
||||
//
|
||||
// bInUse = TRUE, means some process are filling TX data, after that must turn on bWaitingBulkOut
|
||||
// bWaitingBulkOut = TRUE, means the TX data are waiting for bulk out.
|
||||
//
|
||||
//RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
|
||||
if ((pHTTXContext->ENextBulkOutPosition != pHTTXContext->CurWritePosition) &&
|
||||
(pHTTXContext->ENextBulkOutPosition != (pHTTXContext->CurWritePosition+8)) &&
|
||||
!RTUSB_TEST_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_FRAG << BulkOutPipeId)))
|
||||
{
|
||||
// Indicate There is data avaliable
|
||||
RTUSB_SET_BULK_FLAG(pAd, (fRTUSB_BULK_OUT_DATA_NORMAL << BulkOutPipeId));
|
||||
}
|
||||
//RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[BulkOutPipeId], IrqFlags);
|
||||
|
||||
// Always call Bulk routine, even reset bulk.
|
||||
// The protection of rest bulk should be in BulkOut routine
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_null_frame_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PTX_CONTEXT pNullContext;
|
||||
purbb_t pUrb;
|
||||
NTSTATUS Status;
|
||||
unsigned long irqFlag;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pNullContext = (PTX_CONTEXT)pUrb->context;
|
||||
pAd = pNullContext->pAd;
|
||||
Status = pUrb->status;
|
||||
|
||||
// Reset Null frame context flags
|
||||
RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
pNullContext->IRPPending = FALSE;
|
||||
pNullContext->InUse = FALSE;
|
||||
pAd->BulkOutPending[0] = FALSE;
|
||||
pAd->watchDogTxPendingCnt[0] = 0;
|
||||
|
||||
if (Status == USB_ST_NOERROR)
|
||||
{
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
|
||||
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
|
||||
}
|
||||
else // STATUS_OTHER
|
||||
{
|
||||
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out Null Frame Failed, ReasonCode=%d!\n", Status));
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
|
||||
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
}
|
||||
}
|
||||
|
||||
// Always call Bulk routine, even reset bulk.
|
||||
// The protectioon of rest bulk should be in BulkOut routine
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_rts_frame_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PTX_CONTEXT pRTSContext;
|
||||
purbb_t pUrb;
|
||||
NTSTATUS Status;
|
||||
unsigned long irqFlag;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pRTSContext = (PTX_CONTEXT)pUrb->context;
|
||||
pAd = pRTSContext->pAd;
|
||||
Status = pUrb->status;
|
||||
|
||||
// Reset RTS frame context flags
|
||||
RTMP_IRQ_LOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
pRTSContext->IRPPending = FALSE;
|
||||
pRTSContext->InUse = FALSE;
|
||||
|
||||
if (Status == USB_ST_NOERROR)
|
||||
{
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
|
||||
}
|
||||
else // STATUS_OTHER
|
||||
{
|
||||
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out RTS Frame Failed\n"));
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
|
||||
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[0], irqFlag);
|
||||
}
|
||||
}
|
||||
|
||||
RTMP_SEM_LOCK(&pAd->BulkOutLock[pRTSContext->BulkOutPipeId]);
|
||||
pAd->BulkOutPending[pRTSContext->BulkOutPipeId] = FALSE;
|
||||
RTMP_SEM_UNLOCK(&pAd->BulkOutLock[pRTSContext->BulkOutPipeId]);
|
||||
|
||||
// Always call Bulk routine, even reset bulk.
|
||||
// The protectioon of rest bulk should be in BulkOut routine
|
||||
RTUSBKickBulkOut(pAd);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_pspoll_frame_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PTX_CONTEXT pPsPollContext;
|
||||
purbb_t pUrb;
|
||||
NTSTATUS Status;
|
||||
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pPsPollContext = (PTX_CONTEXT)pUrb->context;
|
||||
pAd = pPsPollContext->pAd;
|
||||
Status = pUrb->status;
|
||||
|
||||
// Reset PsPoll context flags
|
||||
pPsPollContext->IRPPending = FALSE;
|
||||
pPsPollContext->InUse = FALSE;
|
||||
pAd->watchDogTxPendingCnt[0] = 0;
|
||||
|
||||
if (Status == USB_ST_NOERROR)
|
||||
{
|
||||
RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);
|
||||
}
|
||||
else // STATUS_OTHER
|
||||
{
|
||||
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out PSPoll Failed\n"));
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
|
||||
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
RTMP_SEM_LOCK(&pAd->BulkOutLock[0]);
|
||||
pAd->BulkOutPending[0] = FALSE;
|
||||
RTMP_SEM_UNLOCK(&pAd->BulkOutLock[0]);
|
||||
|
||||
// Always call Bulk routine, even reset bulk.
|
||||
// The protectioon of rest bulk should be in BulkOut routine
|
||||
RTUSBKickBulkOut(pAd);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Handle received packets.
|
||||
|
||||
Arguments:
|
||||
data - URB information pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
static void rx_done_tasklet(unsigned long data)
|
||||
{
|
||||
purbb_t pUrb;
|
||||
PRX_CONTEXT pRxContext;
|
||||
PRTMP_ADAPTER pAd;
|
||||
NTSTATUS Status;
|
||||
unsigned int IrqFlags;
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pRxContext = (PRX_CONTEXT)pUrb->context;
|
||||
pAd = pRxContext->pAd;
|
||||
Status = pUrb->status;
|
||||
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->BulkInLock, IrqFlags);
|
||||
pRxContext->InUse = FALSE;
|
||||
pRxContext->IRPPending = FALSE;
|
||||
pRxContext->BulkInOffset += pUrb->actual_length;
|
||||
//NdisInterlockedDecrement(&pAd->PendingRx);
|
||||
pAd->PendingRx--;
|
||||
|
||||
if (Status == USB_ST_NOERROR)
|
||||
{
|
||||
pAd->BulkInComplete++;
|
||||
pAd->NextRxBulkInPosition = 0;
|
||||
if (pRxContext->BulkInOffset) // As jan's comment, it may bulk-in success but size is zero.
|
||||
{
|
||||
pRxContext->Readable = TRUE;
|
||||
INC_RING_INDEX(pAd->NextRxBulkInIndex, RX_RING_SIZE);
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
|
||||
}
|
||||
else // STATUS_OTHER
|
||||
{
|
||||
pAd->BulkInCompleteFail++;
|
||||
// Still read this packet although it may comtain wrong bytes.
|
||||
pRxContext->Readable = FALSE;
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkInLock, IrqFlags);
|
||||
|
||||
// Parsing all packets. because after reset, the index will reset to all zero.
|
||||
if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_BULKIN_RESET |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk In Failed. Status=%d, BIIdx=0x%x, BIRIdx=0x%x, actual_length= 0x%x\n",
|
||||
Status, pAd->NextRxBulkInIndex, pAd->NextRxBulkInReadIndex, pRxContext->pUrb->actual_length));
|
||||
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);
|
||||
}
|
||||
}
|
||||
|
||||
ASSERT((pRxContext->InUse == pRxContext->IRPPending));
|
||||
|
||||
RTUSBBulkReceive(pAd);
|
||||
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_mgmt_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PTX_CONTEXT pMLMEContext;
|
||||
int index;
|
||||
PNDIS_PACKET pPacket;
|
||||
purbb_t pUrb;
|
||||
NTSTATUS Status;
|
||||
unsigned long IrqFlags;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pMLMEContext = (PTX_CONTEXT)pUrb->context;
|
||||
pAd = pMLMEContext->pAd;
|
||||
Status = pUrb->status;
|
||||
index = pMLMEContext->SelfIdx;
|
||||
|
||||
ASSERT((pAd->MgmtRing.TxDmaIdx == index));
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
|
||||
|
||||
|
||||
if (Status != USB_ST_NOERROR)
|
||||
{
|
||||
//Bulk-Out fail status handle
|
||||
if ((!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_RESET_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST)) &&
|
||||
(!RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET)))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_ERROR, ("Bulk Out MLME Failed, Status=%d!\n", Status));
|
||||
// TODO: How to handle about the MLMEBulkOut failed issue. Need to resend the mgmt pkt?
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET);
|
||||
pAd->bulkResetPipeid = (MGMTPIPEIDX | BULKOUT_MGMT_RESET_FLAG);
|
||||
}
|
||||
}
|
||||
|
||||
pAd->BulkOutPending[MGMTPIPEIDX] = FALSE;
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[MGMTPIPEIDX], IrqFlags);
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->MLMEBulkOutLock, IrqFlags);
|
||||
// Reset MLME context flags
|
||||
pMLMEContext->IRPPending = FALSE;
|
||||
pMLMEContext->InUse = FALSE;
|
||||
pMLMEContext->bWaitingBulkOut = FALSE;
|
||||
pMLMEContext->BulkOutSize = 0;
|
||||
|
||||
pPacket = pAd->MgmtRing.Cell[index].pNdisPacket;
|
||||
pAd->MgmtRing.Cell[index].pNdisPacket = NULL;
|
||||
|
||||
// Increase MgmtRing Index
|
||||
INC_RING_INDEX(pAd->MgmtRing.TxDmaIdx, MGMT_RING_SIZE);
|
||||
pAd->MgmtRing.TxSwFreeIdx++;
|
||||
RTMP_IRQ_UNLOCK(&pAd->MLMEBulkOutLock, IrqFlags);
|
||||
|
||||
// No-matter success or fail, we free the mgmt packet.
|
||||
if (pPacket)
|
||||
RTMPFreeNdisPacket(pAd, pPacket);
|
||||
|
||||
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
// do nothing and return directly.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET) &&
|
||||
((pAd->bulkResetPipeid & BULKOUT_MGMT_RESET_FLAG) == BULKOUT_MGMT_RESET_FLAG))
|
||||
{ // For Mgmt Bulk-Out failed, ignore it now.
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
// Always call Bulk routine, even reset bulk.
|
||||
// The protectioon of rest bulk should be in BulkOut routine
|
||||
if (pAd->MgmtRing.TxSwFreeIdx < MGMT_RING_SIZE /* pMLMEContext->bWaitingBulkOut == TRUE */)
|
||||
{
|
||||
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_MLME);
|
||||
}
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
static void rtusb_ac3_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PHT_TX_CONTEXT pHTTXContext;
|
||||
UCHAR BulkOutPipeId = 3;
|
||||
purbb_t pUrb;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
|
||||
pAd = pHTTXContext->pAd;
|
||||
|
||||
rtusb_dataout_complete((unsigned long)pUrb);
|
||||
|
||||
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
// do nothing and return directly.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
|
||||
{
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
|
||||
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
|
||||
/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
|
||||
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
|
||||
(pHTTXContext->bCurWriting == FALSE))
|
||||
{
|
||||
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
|
||||
}
|
||||
|
||||
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<3);
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_ac2_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PHT_TX_CONTEXT pHTTXContext;
|
||||
UCHAR BulkOutPipeId = 2;
|
||||
purbb_t pUrb;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
|
||||
pAd = pHTTXContext->pAd;
|
||||
|
||||
rtusb_dataout_complete((unsigned long)pUrb);
|
||||
|
||||
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
// do nothing and return directly.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
|
||||
{
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
|
||||
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
|
||||
/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
|
||||
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
|
||||
(pHTTXContext->bCurWriting == FALSE))
|
||||
{
|
||||
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
|
||||
}
|
||||
|
||||
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<2);
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_ac1_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PHT_TX_CONTEXT pHTTXContext;
|
||||
UCHAR BulkOutPipeId = 1;
|
||||
purbb_t pUrb;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
|
||||
pAd = pHTTXContext->pAd;
|
||||
|
||||
rtusb_dataout_complete((unsigned long)pUrb);
|
||||
|
||||
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
// do nothing and return directly.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
|
||||
{
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
|
||||
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
|
||||
/*((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
|
||||
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
|
||||
(pHTTXContext->bCurWriting == FALSE))
|
||||
{
|
||||
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
|
||||
}
|
||||
|
||||
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL<<1);
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_ac0_dma_done_tasklet(unsigned long data)
|
||||
{
|
||||
PRTMP_ADAPTER pAd;
|
||||
PHT_TX_CONTEXT pHTTXContext;
|
||||
UCHAR BulkOutPipeId = 0;
|
||||
purbb_t pUrb;
|
||||
|
||||
|
||||
pUrb = (purbb_t)data;
|
||||
pHTTXContext = (PHT_TX_CONTEXT)pUrb->context;
|
||||
pAd = pHTTXContext->pAd;
|
||||
|
||||
rtusb_dataout_complete((unsigned long)pUrb);
|
||||
|
||||
if ((RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
// do nothing and return directly.
|
||||
}
|
||||
else
|
||||
{
|
||||
if (RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_BULKOUT_RESET))
|
||||
{
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_OUT, NULL, 0);
|
||||
}
|
||||
else
|
||||
{ pHTTXContext = &pAd->TxContext[BulkOutPipeId];
|
||||
if ((pAd->TxSwQueue[BulkOutPipeId].Number > 0) &&
|
||||
/* ((pHTTXContext->CurWritePosition > (pHTTXContext->NextBulkOutPosition + 0x6000)) || (pHTTXContext->NextBulkOutPosition > pHTTXContext->CurWritePosition + 0x6000)) && */
|
||||
(pAd->DeQueueRunning[BulkOutPipeId] == FALSE) &&
|
||||
(pHTTXContext->bCurWriting == FALSE))
|
||||
{
|
||||
RTMPDeQueuePacket(pAd, FALSE, BulkOutPipeId, MAX_TX_PROCESS);
|
||||
}
|
||||
|
||||
RTUSB_SET_BULK_FLAG(pAd, fRTUSB_BULK_OUT_DATA_NORMAL);
|
||||
RTUSBKickBulkOut(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
|
||||
NDIS_STATUS RtmpNetTaskInit(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
POS_COOKIE pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
// Create receive tasklet
|
||||
tasklet_init(&pObj->rx_done_task, rx_done_tasklet, (ULONG)pAd);
|
||||
tasklet_init(&pObj->mgmt_dma_done_task, rtusb_mgmt_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac0_dma_done_task, rtusb_ac0_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac1_dma_done_task, rtusb_ac1_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac2_dma_done_task, rtusb_ac2_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->ac3_dma_done_task, rtusb_ac3_dma_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->tbtt_task, tbtt_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->null_frame_complete_task, rtusb_null_frame_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->rts_frame_complete_task, rtusb_rts_frame_done_tasklet, (unsigned long)pAd);
|
||||
tasklet_init(&pObj->pspoll_frame_complete_task, rtusb_pspoll_frame_done_tasklet, (unsigned long)pAd);
|
||||
|
||||
return NDIS_STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
void RtmpNetTaskExit(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
POS_COOKIE pObj;
|
||||
|
||||
pObj = (POS_COOKIE) pAd->OS_Cookie;
|
||||
|
||||
tasklet_kill(&pObj->rx_done_task);
|
||||
tasklet_kill(&pObj->mgmt_dma_done_task);
|
||||
tasklet_kill(&pObj->ac0_dma_done_task);
|
||||
tasklet_kill(&pObj->ac1_dma_done_task);
|
||||
tasklet_kill(&pObj->ac2_dma_done_task);
|
||||
tasklet_kill(&pObj->ac3_dma_done_task);
|
||||
tasklet_kill(&pObj->tbtt_task);
|
||||
tasklet_kill(&pObj->null_frame_complete_task);
|
||||
tasklet_kill(&pObj->rts_frame_complete_task);
|
||||
tasklet_kill(&pObj->pspoll_frame_complete_task);
|
||||
}
|
File diff suppressed because it is too large
Load Diff
265
drivers/staging/rt2860/rtmp_chip.h
Normal file
265
drivers/staging/rt2860/rtmp_chip.h
Normal file
@ -0,0 +1,265 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_chip.h
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless Chip related definition & structures
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_CHIP_H__
|
||||
#define __RTMP_CHIP_H__
|
||||
|
||||
#include "rtmp_type.h"
|
||||
|
||||
#ifdef RT2860
|
||||
#include "chip/rt2860.h"
|
||||
#endif // RT2860 //
|
||||
#ifdef RT2870
|
||||
#include "chip/rt2870.h"
|
||||
#endif // RT2870 //
|
||||
#ifdef RT3070
|
||||
#include "chip/rt3070.h"
|
||||
#endif // RT3070 //
|
||||
|
||||
// We will have a cost down version which mac version is 0x3090xxxx
|
||||
//
|
||||
// RT3090A facts
|
||||
//
|
||||
// a) 2.4 GHz
|
||||
// b) Replacement for RT3090
|
||||
// c) Internal LNA
|
||||
// d) Interference over channel #14
|
||||
// e) New BBP features (e.g., SIG re-modulation)
|
||||
//
|
||||
#define IS_RT3090A(_pAd) ((((_pAd)->MACVersion & 0xffff0000) == 0x30900000))
|
||||
|
||||
// We will have a cost down version which mac version is 0x3090xxxx
|
||||
#define IS_RT3090(_pAd) ((((_pAd)->MACVersion & 0xffff0000) == 0x30710000) || (IS_RT3090A(_pAd)))
|
||||
|
||||
#define IS_RT3070(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x30700000)
|
||||
#define IS_RT3071(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x30710000)
|
||||
#define IS_RT2070(_pAd) (((_pAd)->RfIcType == RFIC_2020) || ((_pAd)->EFuseTag == 0x27))
|
||||
|
||||
#define IS_RT30xx(_pAd) (((_pAd)->MACVersion & 0xfff00000) == 0x30700000||IS_RT3090A(_pAd))
|
||||
//#define IS_RT305X(_pAd) ((_pAd)->MACVersion == 0x28720200)
|
||||
|
||||
/* RT3572, 3592, 3562, 3062 share the same MAC version */
|
||||
#define IS_RT3572(_pAd) (((_pAd)->MACVersion & 0xffff0000) == 0x35720000)
|
||||
#define IS_VERSION_BEFORE_F(_pAd) (((_pAd)->MACVersion&0xffff) <= 0x0211)
|
||||
// F version is 0x0212, E version is 0x0211. 309x can save more power after F version.
|
||||
#define IS_VERSION_AFTER_F(_pAd) ((((_pAd)->MACVersion&0xffff) >= 0x0212) || (((_pAd)->b3090ESpecialChip == TRUE)))
|
||||
//
|
||||
// RT3390 facts
|
||||
//
|
||||
// a) Base on RT3090 (RF IC: RT3020)
|
||||
// b) 2.4 GHz
|
||||
// c) 1x1
|
||||
// d) Single chip
|
||||
// e) Internal components: PA and LNA
|
||||
//
|
||||
//RT3390,RT3370
|
||||
#define IS_RT3390(_pAd) (((_pAd)->MACVersion & 0xFFFF0000) == 0x33900000)
|
||||
|
||||
// ------------------------------------------------------
|
||||
// PCI registers - base address 0x0000
|
||||
// ------------------------------------------------------
|
||||
#define CHIP_PCI_CFG 0x0000
|
||||
#define CHIP_PCI_EECTRL 0x0004
|
||||
#define CHIP_PCI_MCUCTRL 0x0008
|
||||
|
||||
#define OPT_14 0x114
|
||||
|
||||
#define RETRY_LIMIT 10
|
||||
|
||||
|
||||
|
||||
// ------------------------------------------------------
|
||||
// BBP & RF definition
|
||||
// ------------------------------------------------------
|
||||
#define BUSY 1
|
||||
#define IDLE 0
|
||||
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
// EEPROM definition
|
||||
//-------------------------------------------------------------------------
|
||||
#define EEDO 0x08
|
||||
#define EEDI 0x04
|
||||
#define EECS 0x02
|
||||
#define EESK 0x01
|
||||
#define EERL 0x80
|
||||
|
||||
#define EEPROM_WRITE_OPCODE 0x05
|
||||
#define EEPROM_READ_OPCODE 0x06
|
||||
#define EEPROM_EWDS_OPCODE 0x10
|
||||
#define EEPROM_EWEN_OPCODE 0x13
|
||||
|
||||
#define NUM_EEPROM_BBP_PARMS 19 // Include NIC Config 0, 1, CR, TX ALC step, BBPs
|
||||
#define NUM_EEPROM_TX_G_PARMS 7
|
||||
#define EEPROM_NIC1_OFFSET 0x34 // The address is from NIC config 0, not BBP register ID
|
||||
#define EEPROM_NIC2_OFFSET 0x36 // The address is from NIC config 0, not BBP register ID
|
||||
#define EEPROM_BBP_BASE_OFFSET 0xf0 // The address is from NIC config 0, not BBP register ID
|
||||
#define EEPROM_G_TX_PWR_OFFSET 0x52
|
||||
#define EEPROM_G_TX2_PWR_OFFSET 0x60
|
||||
#define EEPROM_LED1_OFFSET 0x3c
|
||||
#define EEPROM_LED2_OFFSET 0x3e
|
||||
#define EEPROM_LED3_OFFSET 0x40
|
||||
#define EEPROM_LNA_OFFSET 0x44
|
||||
#define EEPROM_RSSI_BG_OFFSET 0x46
|
||||
#define EEPROM_TXMIXER_GAIN_2_4G 0x48
|
||||
#define EEPROM_RSSI_A_OFFSET 0x4a
|
||||
#define EEPROM_TXMIXER_GAIN_5G 0x4c
|
||||
#define EEPROM_DEFINE_MAX_TXPWR 0x4e
|
||||
#define EEPROM_TXPOWER_BYRATE_20MHZ_2_4G 0xde // 20MHZ 2.4G tx power.
|
||||
#define EEPROM_TXPOWER_BYRATE_40MHZ_2_4G 0xee // 40MHZ 2.4G tx power.
|
||||
#define EEPROM_TXPOWER_BYRATE_20MHZ_5G 0xfa // 20MHZ 5G tx power.
|
||||
#define EEPROM_TXPOWER_BYRATE_40MHZ_5G 0x10a // 40MHZ 5G tx power.
|
||||
#define EEPROM_A_TX_PWR_OFFSET 0x78
|
||||
#define EEPROM_A_TX2_PWR_OFFSET 0xa6
|
||||
//#define EEPROM_Japan_TX_PWR_OFFSET 0x90 // 802.11j
|
||||
//#define EEPROM_Japan_TX2_PWR_OFFSET 0xbe
|
||||
//#define EEPROM_TSSI_REF_OFFSET 0x54
|
||||
//#define EEPROM_TSSI_DELTA_OFFSET 0x24
|
||||
//#define EEPROM_CCK_TX_PWR_OFFSET 0x62
|
||||
//#define EEPROM_CALIBRATE_OFFSET 0x7c
|
||||
#define EEPROM_VERSION_OFFSET 0x02
|
||||
#define EEPROM_FREQ_OFFSET 0x3a
|
||||
#define EEPROM_TXPOWER_BYRATE 0xde // 20MHZ power.
|
||||
#define EEPROM_TXPOWER_DELTA 0x50 // 20MHZ AND 40 MHZ use different power. This is delta in 40MHZ.
|
||||
#define VALID_EEPROM_VERSION 1
|
||||
|
||||
|
||||
/*
|
||||
* EEPROM operation related marcos
|
||||
*/
|
||||
#define RT28xx_EEPROM_READ16(_pAd, _offset, _value) \
|
||||
(_pAd)->chipOps.eeread((RTMP_ADAPTER *)(_pAd), (USHORT)(_offset), (PUSHORT)&(_value))
|
||||
|
||||
#define RT28xx_EEPROM_WRITE16(_pAd, _offset, _value) \
|
||||
(_pAd)->chipOps.eewrite((RTMP_ADAPTER *)(_pAd), (USHORT)(_offset), (USHORT)(_value))
|
||||
|
||||
|
||||
|
||||
// -------------------------------------------------------------------
|
||||
// E2PROM data layout
|
||||
// -------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// MCU_LEDCS: MCU LED Control Setting.
|
||||
//
|
||||
typedef union _MCU_LEDCS_STRUC {
|
||||
struct {
|
||||
UCHAR LedMode:7;
|
||||
UCHAR Polarity:1;
|
||||
} field;
|
||||
UCHAR word;
|
||||
} MCU_LEDCS_STRUC, *PMCU_LEDCS_STRUC;
|
||||
|
||||
|
||||
//
|
||||
// EEPROM antenna select format
|
||||
//
|
||||
typedef union _EEPROM_ANTENNA_STRUC {
|
||||
struct {
|
||||
USHORT RxPath:4; // 1: 1R, 2: 2R, 3: 3R
|
||||
USHORT TxPath:4; // 1: 1T, 2: 2T
|
||||
USHORT RfIcType:4; // see E2PROM document
|
||||
USHORT Rsv:4;
|
||||
} field;
|
||||
USHORT word;
|
||||
} EEPROM_ANTENNA_STRUC, *PEEPROM_ANTENNA_STRUC;
|
||||
|
||||
typedef union _EEPROM_NIC_CINFIG2_STRUC {
|
||||
struct {
|
||||
USHORT HardwareRadioControl:1; // 1:enable, 0:disable
|
||||
USHORT DynamicTxAgcControl:1; //
|
||||
USHORT ExternalLNAForG:1; //
|
||||
USHORT ExternalLNAForA:1; // external LNA enable for 2.4G
|
||||
USHORT CardbusAcceleration:1; // !!! NOTE: 0 - enable, 1 - disable
|
||||
USHORT BW40MSidebandForG:1;
|
||||
USHORT BW40MSidebandForA:1;
|
||||
USHORT EnableWPSPBC:1; // WPS PBC Control bit
|
||||
USHORT BW40MAvailForG:1; // 0:enable, 1:disable
|
||||
USHORT BW40MAvailForA:1; // 0:enable, 1:disable
|
||||
USHORT Rsv1:1; // must be 0
|
||||
USHORT AntDiversity:1; // Antenna diversity
|
||||
USHORT Rsv2:3; // must be 0
|
||||
USHORT DACTestBit:1; // control if driver should patch the DAC issue
|
||||
} field;
|
||||
USHORT word;
|
||||
} EEPROM_NIC_CONFIG2_STRUC, *PEEPROM_NIC_CONFIG2_STRUC;
|
||||
|
||||
//
|
||||
// TX_PWR Value valid range 0xFA(-6) ~ 0x24(36)
|
||||
//
|
||||
typedef union _EEPROM_TX_PWR_STRUC {
|
||||
struct {
|
||||
CHAR Byte0; // Low Byte
|
||||
CHAR Byte1; // High Byte
|
||||
} field;
|
||||
USHORT word;
|
||||
} EEPROM_TX_PWR_STRUC, *PEEPROM_TX_PWR_STRUC;
|
||||
|
||||
typedef union _EEPROM_VERSION_STRUC {
|
||||
struct {
|
||||
UCHAR FaeReleaseNumber; // Low Byte
|
||||
UCHAR Version; // High Byte
|
||||
} field;
|
||||
USHORT word;
|
||||
} EEPROM_VERSION_STRUC, *PEEPROM_VERSION_STRUC;
|
||||
|
||||
typedef union _EEPROM_LED_STRUC {
|
||||
struct {
|
||||
USHORT PolarityRDY_G:1; // Polarity RDY_G setting.
|
||||
USHORT PolarityRDY_A:1; // Polarity RDY_A setting.
|
||||
USHORT PolarityACT:1; // Polarity ACT setting.
|
||||
USHORT PolarityGPIO_0:1; // Polarity GPIO#0 setting.
|
||||
USHORT PolarityGPIO_1:1; // Polarity GPIO#1 setting.
|
||||
USHORT PolarityGPIO_2:1; // Polarity GPIO#2 setting.
|
||||
USHORT PolarityGPIO_3:1; // Polarity GPIO#3 setting.
|
||||
USHORT PolarityGPIO_4:1; // Polarity GPIO#4 setting.
|
||||
USHORT LedMode:5; // Led mode.
|
||||
USHORT Rsvd:3; // Reserved
|
||||
} field;
|
||||
USHORT word;
|
||||
} EEPROM_LED_STRUC, *PEEPROM_LED_STRUC;
|
||||
|
||||
typedef union _EEPROM_TXPOWER_DELTA_STRUC {
|
||||
struct {
|
||||
UCHAR DeltaValue:6; // Tx Power dalta value (MAX=4)
|
||||
UCHAR Type:1; // 1: plus the delta value, 0: minus the delta value
|
||||
UCHAR TxPowerEnable:1;// Enable
|
||||
} field;
|
||||
UCHAR value;
|
||||
} EEPROM_TXPOWER_DELTA_STRUC, *PEEPROM_TXPOWER_DELTA_STRUC;
|
||||
|
||||
#endif // __RTMP_CHIP_H__ //
|
@ -41,6 +41,15 @@
|
||||
|
||||
#include "oid.h"
|
||||
|
||||
#undef AP_WSC_INCLUDED
|
||||
#undef STA_WSC_INCLUDED
|
||||
#undef WSC_INCLUDED
|
||||
|
||||
|
||||
|
||||
#if defined(AP_WSC_INCLUDED) || defined(STA_WSC_INCLUDED)
|
||||
#define WSC_INCLUDED
|
||||
#endif
|
||||
//
|
||||
// Debug information verbosity: lower values indicate higher urgency
|
||||
//
|
||||
@ -54,55 +63,28 @@
|
||||
#define NIC_TAG ((ULONG)'0682')
|
||||
#define NIC_DBG_STRING ("**RT28xx**")
|
||||
|
||||
#ifdef RTMP_MAC_USB
|
||||
#define TX_RING_SIZE 8 // 1
|
||||
#define PRIO_RING_SIZE 8
|
||||
#define MGMT_RING_SIZE 32 // PRIO_RING_SIZE
|
||||
#define RX_RING_SIZE 8
|
||||
#define MAX_TX_PROCESS 4
|
||||
#define LOCAL_TXBUF_SIZE 2048
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
//#define PACKED
|
||||
|
||||
#define RALINK_2883_VERSION ((UINT32)0x28830300)
|
||||
#define RALINK_2880E_VERSION ((UINT32)0x28720200)
|
||||
#define RALINK_3070_VERSION ((UINT32)0x30700200)
|
||||
|
||||
//
|
||||
// NDIS version in use by the NIC driver.
|
||||
// The high byte is the major version. The low byte is the minor version.
|
||||
//
|
||||
#ifdef NDIS51_MINIPORT
|
||||
#define NIC_DRIVER_VERSION 0x0501
|
||||
#else
|
||||
#define NIC_DRIVER_VERSION 0x0500
|
||||
#endif
|
||||
|
||||
//
|
||||
// NDIS media type, current is ethernet, change if native wireless supported
|
||||
//
|
||||
#define NIC_MEDIA_TYPE NdisMedium802_3
|
||||
#define NIC_PCI_HDR_LENGTH 0xe2
|
||||
#define NIC_MAX_PACKET_SIZE 2304
|
||||
#define NIC_HEADER_SIZE 14
|
||||
#define MAX_MAP_REGISTERS_NEEDED 32
|
||||
#define MIN_MAP_REGISTERS_NEEDED 2 //Todo: should consider fragment issue.
|
||||
|
||||
//
|
||||
// interface type, we use PCI
|
||||
//
|
||||
#define NIC_INTERFACE_TYPE NdisInterfacePci
|
||||
#define NIC_INTERRUPT_MODE NdisInterruptLevelSensitive
|
||||
|
||||
//
|
||||
// buffer size passed in NdisMQueryAdapterResources
|
||||
// We should only need three adapter resources (IO, interrupt and memory),
|
||||
// Some devices get extra resources, so have room for 10 resources
|
||||
// UF_SIZE (sizeof(NDIS_RESOURCE_LIST) + (10*sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR)))
|
||||
|
||||
|
||||
#define NIC_RESOURCE_B//
|
||||
// IO space length
|
||||
//
|
||||
#define NIC_MAP_IOSPACE_LENGTH sizeof(CSR_STRUC)
|
||||
|
||||
#define MAX_RX_PKT_LEN 1520
|
||||
|
||||
//
|
||||
// Entry number for each DMA descriptor ring
|
||||
//
|
||||
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
#define TX_RING_SIZE 64 //64
|
||||
#define MGMT_RING_SIZE 128
|
||||
#define RX_RING_SIZE 128 //64
|
||||
@ -110,15 +92,7 @@
|
||||
#define MAX_DMA_DONE_PROCESS TX_RING_SIZE
|
||||
#define MAX_TX_DONE_PROCESS TX_RING_SIZE //8
|
||||
#define LOCAL_TXBUF_SIZE 2
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
#define TX_RING_SIZE 8 // 1
|
||||
#define PRIO_RING_SIZE 8
|
||||
#define MGMT_RING_SIZE 32 // PRIO_RING_SIZE
|
||||
#define RX_RING_SIZE 8
|
||||
#define MAX_TX_PROCESS 4
|
||||
#define LOCAL_TXBUF_SIZE 2048
|
||||
#endif // RT2870 //
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
#define MAX_RX_PROCESS 128 //64 //32
|
||||
#define NUM_OF_LOCAL_TXBUF 2
|
||||
@ -143,16 +117,43 @@
|
||||
#define MAX_RX_PROCESS_CNT (RX_RING_SIZE)
|
||||
|
||||
|
||||
/*
|
||||
WMM Note: If memory of your system is not much, please reduce the definition;
|
||||
or when you do WMM test, the queue for low priority AC will be full, i.e.
|
||||
TX_RING_SIZE + MAX_PACKETS_IN_QUEUE packets for the AC will be buffered in
|
||||
WLAN, maybe no any packet buffer can be got in Ethernet driver.
|
||||
|
||||
Sometimes no packet buffer can be got in Ethernet driver, the system will
|
||||
send flow control packet to the sender to slow down its sending rate.
|
||||
So no WMM can be saw in the air.
|
||||
*/
|
||||
|
||||
/*
|
||||
Need to use 64 in vxworks for test case WMM A5-T07
|
||||
Two dnlink (10Mbps) from a WMM station to a non-WMM station.
|
||||
If use 256, queue is not enough.
|
||||
And in rt_main_end.c, clConfig.clNum = RX_RING_SIZE * 3; is changed to
|
||||
clConfig.clNum = RX_RING_SIZE * 4;
|
||||
*/
|
||||
// TODO: For VxWorks the size is 256. Shall we cahnge the value as 256 for all OS?????
|
||||
#define MAX_PACKETS_IN_QUEUE (512) //(512) // to pass WMM A5-WPAPSK
|
||||
|
||||
#define MAX_PACKETS_IN_MCAST_PS_QUEUE 32
|
||||
#define MAX_PACKETS_IN_PS_QUEUE 128 //32
|
||||
#define WMM_NUM_OF_AC 4 /* AC0, AC1, AC2, and AC3 */
|
||||
|
||||
|
||||
#ifdef RTMP_EFUSE_SUPPORT
|
||||
//2008/09/11:KH add to support efuse<--
|
||||
#define MAX_EEPROM_BIN_FILE_SIZE 1024
|
||||
#define EFUSE_BUFFER_PATH "/tmp/RT30xxEEPROM.bin"
|
||||
//2008/09/11:KH add to support efuse-->
|
||||
#endif // RTMP_EFUSE_SUPPORT //
|
||||
|
||||
// RxFilter
|
||||
#define STANORMAL 0x17f97
|
||||
#define APNORMAL 0x15f97
|
||||
#define PSPXLINK 0x17f93
|
||||
//
|
||||
// RTMP_ADAPTER flags
|
||||
//
|
||||
@ -203,9 +204,9 @@
|
||||
#define fOP_STATUS_TX_AMSDU_INUSED 0x00002000
|
||||
#define fOP_STATUS_MAX_RETRY_ENABLED 0x00004000
|
||||
#define fOP_STATUS_WAKEUP_NOW 0x00008000
|
||||
#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE 0x00020000
|
||||
#define fOP_STATUS_PCIE_DEVICE 0x00020000
|
||||
#define fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE fOP_STATUS_PCIE_DEVICE
|
||||
|
||||
#ifdef RT2860
|
||||
//
|
||||
// RTMP_ADAPTER PSFlags : related to advanced power save.
|
||||
//
|
||||
@ -218,7 +219,8 @@
|
||||
// Indicate driver should IMMEDIATELY fo to sleep after receiving AP's beacon in which doesn't indicate unicate nor multicast packets for me
|
||||
//. This flag is used ONLY in RTMPHandleRxDoneInterrupt routine.
|
||||
#define fRTMP_PS_GO_TO_SLEEP_NOW 0x00000008
|
||||
#endif
|
||||
#define fRTMP_PS_TOGGLE_L1 0x00000010 // Use Toggle L1 mechanism for rt28xx PCIe
|
||||
|
||||
|
||||
#define CCKSETPROTECT 0x1
|
||||
#define OFDMSETPROTECT 0x2
|
||||
@ -266,6 +268,7 @@
|
||||
#define fRX_FILTER_ACCEPT_MULTICAST NDIS_PACKET_TYPE_MULTICAST
|
||||
#define fRX_FILTER_ACCEPT_BROADCAST NDIS_PACKET_TYPE_BROADCAST
|
||||
#define fRX_FILTER_ACCEPT_ALL_MULTICAST NDIS_PACKET_TYPE_ALL_MULTICAST
|
||||
#define fRX_FILTER_ACCEPT_PROMISCUOUS NDIS_PACKET_TYPE_PROMISCUOUS
|
||||
|
||||
//
|
||||
// Error code section
|
||||
@ -321,17 +324,15 @@
|
||||
#define MAX_APCLI_NUM 0
|
||||
|
||||
#define MAX_MBSSID_NUM 1
|
||||
#if defined(RT2860) || defined(RT30xx)
|
||||
#ifdef MBSS_SUPPORT
|
||||
#undef MAX_MBSSID_NUM
|
||||
#define MAX_MBSSID_NUM (8 - MAX_MESH_NUM - MAX_APCLI_NUM)
|
||||
#endif // MBSS_SUPPORT //
|
||||
#endif
|
||||
|
||||
/* sanity check for apidx */
|
||||
#define MBSS_MR_APIDX_SANITY_CHECK(apidx) \
|
||||
{ if (apidx > MAX_MBSSID_NUM) { \
|
||||
printk("%s> Error! apidx = %d > MAX_MBSSID_NUM!\n", __func__, apidx); \
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("%s> Error! apidx = %d > MAX_MBSSID_NUM!\n", __func__, apidx)); \
|
||||
apidx = MAIN_MBSSID; } }
|
||||
|
||||
#define VALID_WCID(_wcid) ((_wcid) > 0 && (_wcid) < MAX_LEN_OF_MAC_TABLE )
|
||||
@ -397,6 +398,7 @@
|
||||
#define HASH_TABLE_SIZE 256
|
||||
#define MAX_VIE_LEN 1024 // New for WPA cipher suite variable IE sizes.
|
||||
#define MAX_SUPPORT_MCS 32
|
||||
#define MAX_NUM_OF_BBP_LATCH 140
|
||||
|
||||
//============================================================
|
||||
// ASIC WCID Table definition.
|
||||
@ -515,6 +517,9 @@
|
||||
#define MLME_QOS_UNSPECIFY 32
|
||||
#define MLME_REQUEST_DECLINED 37
|
||||
#define MLME_REQUEST_WITH_INVALID_PARAM 38
|
||||
#define MLME_INVALID_GROUP_CIPHER 41
|
||||
#define MLME_INVALID_PAIRWISE_CIPHER 42
|
||||
#define MLME_INVALID_AKMP 43
|
||||
#define MLME_DLS_NOT_ALLOW_IN_QBSS 48
|
||||
#define MLME_DEST_STA_NOT_IN_QBSS 49
|
||||
#define MLME_DEST_STA_IS_NOT_A_QSTA 50
|
||||
@ -569,6 +574,7 @@
|
||||
// For 802.11n D3.03
|
||||
//#define IE_NEW_EXT_CHA_OFFSET 62 // 802.11n d1. New extension channel offset elemet
|
||||
#define IE_SECONDARY_CH_OFFSET 62 // 802.11n D3.03 Secondary Channel Offset element
|
||||
#define IE_WAPI 68 // WAPI information element
|
||||
#define IE_2040_BSS_COEXIST 72 // 802.11n D3.0.3
|
||||
#define IE_2040_BSS_INTOLERANT_REPORT 73 // 802.11n D3.03
|
||||
#define IE_OVERLAPBSS_SCAN_PARM 74 // 802.11n D3.03
|
||||
@ -605,17 +611,22 @@
|
||||
#define SYNC_STATE_MACHINE 4
|
||||
#define MLME_CNTL_STATE_MACHINE 5
|
||||
#define WPA_PSK_STATE_MACHINE 6
|
||||
#define LEAP_STATE_MACHINE 7
|
||||
//#define LEAP_STATE_MACHINE 7
|
||||
#define AIRONET_STATE_MACHINE 8
|
||||
#define ACTION_STATE_MACHINE 9
|
||||
|
||||
// AP MLME state machines
|
||||
#define AP_ASSOC_STATE_MACHINE 11
|
||||
#define AP_AUTH_STATE_MACHINE 12
|
||||
#define AP_AUTH_RSP_STATE_MACHINE 13
|
||||
#define AP_SYNC_STATE_MACHINE 14
|
||||
#define AP_CNTL_STATE_MACHINE 15
|
||||
#define AP_WPA_STATE_MACHINE 16
|
||||
#define WSC_STATE_MACHINE 17
|
||||
#define WSC_UPNP_STATE_MACHINE 18
|
||||
|
||||
|
||||
#define WPA_STATE_MACHINE 23
|
||||
|
||||
|
||||
|
||||
//
|
||||
// STA's CONTROL/CONNECT state machine: states, events, total function #
|
||||
@ -630,9 +641,9 @@
|
||||
#define CNTL_WAIT_AUTH2 7
|
||||
#define CNTL_WAIT_OID_LIST_SCAN 8
|
||||
#define CNTL_WAIT_OID_DISASSOC 9
|
||||
#ifdef RT2870
|
||||
#ifdef RTMP_MAC_USB
|
||||
#define CNTL_WAIT_SCAN_FOR_CONNECT 10
|
||||
#endif // RT2870 //
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
#define MT2_ASSOC_CONF 34
|
||||
#define MT2_AUTH_CONF 35
|
||||
@ -646,6 +657,7 @@
|
||||
#define MT2_GET_CONF 43
|
||||
#define MT2_SET_CONF 44
|
||||
#define MT2_RESET_CONF 45
|
||||
#define MT2_FT_OTD_CONF 46
|
||||
#define MT2_MLME_ROAMING_REQ 52
|
||||
|
||||
#define CNTL_FUNC_SIZE 1
|
||||
@ -691,8 +703,11 @@
|
||||
#define MT2_PEER_BA_CATE 3
|
||||
#define MT2_PEER_PUBLIC_CATE 4
|
||||
#define MT2_PEER_RM_CATE 5
|
||||
/* "FT_CATEGORY_BSS_TRANSITION equal to 6" is defined file of "dot11r_ft.h" */
|
||||
#define MT2_PEER_HT_CATE 7 // 7.4.7
|
||||
#define MAX_PEER_CATE_MSG 7
|
||||
|
||||
|
||||
#define MT2_MLME_ADD_BA_CATE 8
|
||||
#define MT2_MLME_ORI_DELBA_CATE 9
|
||||
#define MT2_MLME_REC_DELBA_CATE 10
|
||||
@ -822,35 +837,8 @@
|
||||
#define DLS_FUNC_SIZE (MAX_DLS_STATE * MAX_DLS_MSG)
|
||||
|
||||
//
|
||||
// STA's WPA-PSK State machine: states, events, total function #
|
||||
// WSC State machine: states, events, total function #
|
||||
//
|
||||
#define WPA_PSK_IDLE 0
|
||||
#define MAX_WPA_PSK_STATE 1
|
||||
|
||||
#define WPA_MACHINE_BASE 0
|
||||
#define MT2_EAPPacket 0
|
||||
#define MT2_EAPOLStart 1
|
||||
#define MT2_EAPOLLogoff 2
|
||||
#define MT2_EAPOLKey 3
|
||||
#define MT2_EAPOLASFAlert 4
|
||||
#define MAX_WPA_PSK_MSG 5
|
||||
|
||||
#define WPA_PSK_FUNC_SIZE (MAX_WPA_PSK_STATE * MAX_WPA_PSK_MSG)
|
||||
|
||||
//
|
||||
// STA's CISCO-AIRONET State machine: states, events, total function #
|
||||
//
|
||||
#define AIRONET_IDLE 0
|
||||
#define AIRONET_SCANNING 1
|
||||
#define MAX_AIRONET_STATE 2
|
||||
|
||||
#define AIRONET_MACHINE_BASE 0
|
||||
#define MT2_AIRONET_MSG 0
|
||||
#define MT2_AIRONET_SCAN_REQ 1
|
||||
#define MT2_AIRONET_SCAN_DONE 2
|
||||
#define MAX_AIRONET_MSG 3
|
||||
|
||||
#define AIRONET_FUNC_SIZE (MAX_AIRONET_STATE * MAX_AIRONET_MSG)
|
||||
|
||||
//
|
||||
// AP's CONTROL/CONNECT state machine: states, events, total function #
|
||||
@ -882,24 +870,13 @@
|
||||
#define AP_AUTH_MACHINE_BASE 0
|
||||
#define APMT2_MLME_DEAUTH_REQ 0
|
||||
#define APMT2_CLS2ERR 1
|
||||
#define AP_MAX_AUTH_MSG 2
|
||||
#define APMT2_PEER_DEAUTH 2
|
||||
#define APMT2_PEER_AUTH_REQ 3
|
||||
#define APMT2_PEER_AUTH_CONFIRM 4
|
||||
#define AP_MAX_AUTH_MSG 5
|
||||
|
||||
#define AP_AUTH_FUNC_SIZE (AP_MAX_AUTH_STATE * AP_MAX_AUTH_MSG)
|
||||
|
||||
//
|
||||
// AP's AUTH-RSP state machine: states, events, total function #
|
||||
//
|
||||
#define AP_AUTH_RSP_IDLE 0
|
||||
#define AP_MAX_AUTH_RSP_STATE 1
|
||||
|
||||
#define AP_AUTH_RSP_MACHINE_BASE 0
|
||||
#define APMT2_AUTH_CHALLENGE_TIMEOUT 0
|
||||
#define APMT2_PEER_AUTH_ODD 1
|
||||
#define APMT2_PEER_DEAUTH 2
|
||||
#define AP_MAX_AUTH_RSP_MSG 3
|
||||
|
||||
#define AP_AUTH_RSP_FUNC_SIZE (AP_MAX_AUTH_RSP_STATE * AP_MAX_AUTH_RSP_MSG)
|
||||
|
||||
//
|
||||
// AP's SYNC state machine: states, events, total function #
|
||||
//
|
||||
@ -919,20 +896,22 @@
|
||||
#define AP_SYNC_FUNC_SIZE (AP_MAX_SYNC_STATE * AP_MAX_SYNC_MSG)
|
||||
|
||||
//
|
||||
// AP's WPA state machine: states, events, total function #
|
||||
// Common WPA state machine: states, events, total function #
|
||||
//
|
||||
#define AP_WPA_PTK 0
|
||||
#define AP_MAX_WPA_PTK_STATE 1
|
||||
#define WPA_PTK 0
|
||||
#define MAX_WPA_PTK_STATE 1
|
||||
|
||||
#define WPA_MACHINE_BASE 0
|
||||
#define MT2_EAPPacket 0
|
||||
#define MT2_EAPOLStart 1
|
||||
#define MT2_EAPOLLogoff 2
|
||||
#define MT2_EAPOLKey 3
|
||||
#define MT2_EAPOLASFAlert 4
|
||||
#define MAX_WPA_MSG 5
|
||||
|
||||
#define WPA_FUNC_SIZE (MAX_WPA_PTK_STATE * MAX_WPA_MSG)
|
||||
|
||||
#define AP_WPA_MACHINE_BASE 0
|
||||
#define APMT2_EAPPacket 0
|
||||
#define APMT2_EAPOLStart 1
|
||||
#define APMT2_EAPOLLogoff 2
|
||||
#define APMT2_EAPOLKey 3
|
||||
#define APMT2_EAPOLASFAlert 4
|
||||
#define AP_MAX_WPA_MSG 5
|
||||
|
||||
#define AP_WPA_FUNC_SIZE (AP_MAX_WPA_PTK_STATE * AP_MAX_WPA_MSG)
|
||||
|
||||
// =============================================================================
|
||||
|
||||
@ -1178,12 +1157,16 @@
|
||||
#define REGION_4_A_BAND 4 // 149, 153, 157, 161, 165
|
||||
#define REGION_5_A_BAND 5 // 149, 153, 157, 161
|
||||
#define REGION_6_A_BAND 6 // 36, 40, 44, 48
|
||||
#define REGION_7_A_BAND 7 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165
|
||||
#define REGION_7_A_BAND 7 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161, 165, 169, 173
|
||||
#define REGION_8_A_BAND 8 // 52, 56, 60, 64
|
||||
#define REGION_9_A_BAND 9 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 132, 136, 140, 149, 153, 157, 161, 165
|
||||
#define REGION_10_A_BAND 10 // 36, 40, 44, 48, 149, 153, 157, 161, 165
|
||||
#define REGION_11_A_BAND 11 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 149, 153, 157, 161
|
||||
#define REGION_MAXIMUM_A_BAND 11
|
||||
#define REGION_12_A_BAND 12 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140
|
||||
#define REGION_13_A_BAND 13 // 52, 56, 60, 64, 100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140, 149, 153, 157, 161
|
||||
#define REGION_14_A_BAND 14 // 36, 40, 44, 48, 52, 56, 60, 64, 100, 104, 108, 112, 116, 136, 140, 149, 153, 157, 161, 165
|
||||
#define REGION_15_A_BAND 15 // 149, 153, 157, 161, 165, 169, 173
|
||||
#define REGION_MAXIMUM_A_BAND 15
|
||||
|
||||
// pTxD->CipherAlg
|
||||
#define CIPHER_NONE 0
|
||||
@ -1196,15 +1179,6 @@
|
||||
#define CIPHER_TKIP_NO_MIC 7 // MIC appended by driver: not a valid value in hardware key table
|
||||
#define CIPHER_SMS4 8
|
||||
|
||||
// value domain of pAd->RfIcType
|
||||
#define RFIC_2820 1 // 2.4G 2T3R
|
||||
#define RFIC_2850 2 // 2.4G/5G 2T3R
|
||||
#define RFIC_2720 3 // 2.4G 1T2R
|
||||
#define RFIC_2750 4 // 2.4G/5G 1T2R
|
||||
#define RFIC_3020 5 // 2.4G 1T1R
|
||||
#define RFIC_2020 6 // 2.4G B/G
|
||||
#define RFIC_3021 7 // 2.4G 1T2R
|
||||
#define RFIC_3022 8 // 2.4G 2T2R
|
||||
|
||||
// LED Status.
|
||||
#define LED_LINK_DOWN 0
|
||||
@ -1219,7 +1193,8 @@
|
||||
// value domain of pAd->LedCntl.LedMode and E2PROM
|
||||
#define LED_MODE_DEFAULT 0
|
||||
#define LED_MODE_TWO_LED 1
|
||||
#define LED_MODE_SIGNAL_STREGTH 8 // EEPROM define =8
|
||||
//#define LED_MODE_SIGNAL_STREGTH 8 // EEPROM define =8
|
||||
#define LED_MODE_SIGNAL_STREGTH 0x40 // EEPROM define = 64
|
||||
|
||||
// RC4 init value, used fro WEP & TKIP
|
||||
#define PPPINITFCS32 0xffffffff /* Initial FCS value */
|
||||
@ -1305,7 +1280,12 @@
|
||||
#define INT_APCLI 0x0400
|
||||
#define INT_MESH 0x0500
|
||||
|
||||
// Use bitmap to allow coexist of ATE_TXFRAME and ATE_RXFRAME(i.e.,to support LoopBack mode)
|
||||
#define INF_MAIN_DEV_NAME "wlan"
|
||||
#define INF_MBSSID_DEV_NAME "ra"
|
||||
#define INF_WDS_DEV_NAME "wds"
|
||||
#define INF_APCLI_DEV_NAME "apcli"
|
||||
#define INF_MESH_DEV_NAME "mesh"
|
||||
|
||||
|
||||
// WEP Key TYPE
|
||||
#define WEP_HEXADECIMAL_TYPE 0
|
||||
@ -1380,7 +1360,7 @@
|
||||
#define MAX_NUM_OF_INIT_DLS_ENTRY 1
|
||||
#define MAX_NUM_OF_DLS_ENTRY MAX_NUMBER_OF_DLS_ENTRY
|
||||
|
||||
//Block ACK , rt2860, kathy
|
||||
//Block ACK, kathy
|
||||
#define MAX_TX_REORDERBUF 64
|
||||
#define MAX_RX_REORDERBUF 64
|
||||
#define DEFAULT_TX_TIMEOUT 30
|
||||
@ -1392,29 +1372,13 @@
|
||||
#define IW_ESSID_MAX_SIZE 32
|
||||
#endif
|
||||
|
||||
#ifdef MCAST_RATE_SPECIFIC
|
||||
#define MCAST_DISABLE 0
|
||||
#define MCAST_CCK 1
|
||||
#define MCAST_OFDM 2
|
||||
#define MCAST_HTMIX 3
|
||||
#endif // MCAST_RATE_SPECIFIC //
|
||||
|
||||
#ifdef RT2860
|
||||
// For AsicRadioOff/AsicRadioOn/AsicForceWakeup function
|
||||
// This is to indicate from where to call this function.
|
||||
#define DOT11POWERSAVE 0 // TO do .11 power save sleep
|
||||
#define GUIRADIO_OFF 1 // To perform Radio OFf command from GUI
|
||||
#define RTMP_HALT 2 // Called from Halt handler.
|
||||
#define GUI_IDLE_POWER_SAVE 3 // Call to sleep before link up with AP
|
||||
#define FROM_TX 4 // Force wake up from Tx packet.
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
// For AsicRadioOff/AsicRadioOn function
|
||||
#define DOT11POWERSAVE 0
|
||||
#define GUIRADIO_OFF 1
|
||||
#define RTMP_HALT 2
|
||||
#define GUI_IDLE_POWER_SAVE 3
|
||||
#endif
|
||||
// --
|
||||
|
||||
|
||||
// definition for WpaSupport flag
|
||||
#define WPA_SUPPLICANT_DISABLE 0
|
||||
@ -1458,6 +1422,41 @@
|
||||
#define cpu2be16(x) SWAP16((x))
|
||||
#define be2cpu16(x) SWAP16((x))
|
||||
|
||||
|
||||
#define ABS(_x, _y) ((_x) > (_y)) ? ((_x) -(_y)) : ((_y) -(_x))
|
||||
|
||||
|
||||
#define A2Dec(_X, _p) \
|
||||
{ \
|
||||
UCHAR *p; \
|
||||
_X = 0; \
|
||||
p = _p; \
|
||||
while (((*p >= '0') && (*p <= '9'))) \
|
||||
{ \
|
||||
if ((*p >= '0') && (*p <= '9')) \
|
||||
_X = _X * 10 + *p - 48; \
|
||||
p++; \
|
||||
} \
|
||||
}
|
||||
|
||||
|
||||
#define A2Hex(_X, _p) \
|
||||
do{ \
|
||||
char *__p; \
|
||||
(_X) = 0; \
|
||||
__p = (char *)(_p); \
|
||||
while (((*__p >= 'a') && (*__p <= 'f')) || ((*__p >= 'A') && (*__p <= 'F')) || ((*__p >= '0') && (*__p <= '9'))) \
|
||||
{ \
|
||||
if ((*__p >= 'a') && (*__p <= 'f')) \
|
||||
(_X) = (_X) * 16 + *__p - 87; \
|
||||
else if ((*__p >= 'A') && (*__p <= 'F')) \
|
||||
(_X) = (_X) * 16 + *__p - 55; \
|
||||
else if ((*__p >= '0') && (*__p <= '9')) \
|
||||
(_X) = (_X) * 16 + *__p - 48; \
|
||||
__p++; \
|
||||
} \
|
||||
}while(0)
|
||||
|
||||
#endif // __RTMP_DEF_H__
|
||||
|
||||
|
||||
|
102
drivers/staging/rt2860/rtmp_dot11.h
Normal file
102
drivers/staging/rt2860/rtmp_dot11.h
Normal file
@ -0,0 +1,102 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef __DOT11_BASE_H__
|
||||
#define __DOT11_BASE_H__
|
||||
|
||||
#include "rtmp_type.h"
|
||||
|
||||
|
||||
// 4-byte HTC field. maybe included in any frame except non-QOS data frame. The Order bit must set 1.
|
||||
typedef struct PACKED {
|
||||
UINT32 MA:1; //management action payload exist in (QoS Null+HTC)
|
||||
UINT32 TRQ:1; //sounding request
|
||||
UINT32 MRQ:1; //MCS feedback. Request for a MCS feedback
|
||||
UINT32 MRSorASI:3; // MRQ Sequence identifier. unchanged during entire procedure. 0x000-0x110.
|
||||
UINT32 MFS:3; //SET to the received value of MRS. 0x111 for unsolicited MFB.
|
||||
UINT32 MFBorASC:7; //Link adaptation feedback containing recommended MCS. 0x7f for no feedback or not available
|
||||
UINT32 CalPos:2; // calibration position
|
||||
UINT32 CalSeq:2; //calibration sequence
|
||||
UINT32 FBKReq:2; //feedback request
|
||||
UINT32 CSISTEERING:2; //CSI/ STEERING
|
||||
UINT32 ZLFAnnouce:1; // ZLF announcement
|
||||
UINT32 rsv:5; //calibration sequence
|
||||
UINT32 ACConstraint:1; //feedback request
|
||||
UINT32 RDG:1; //RDG / More PPDU
|
||||
} HT_CONTROL, *PHT_CONTROL;
|
||||
|
||||
// 2-byte QOS CONTROL field
|
||||
typedef struct PACKED {
|
||||
USHORT TID:4;
|
||||
USHORT EOSP:1;
|
||||
USHORT AckPolicy:2; //0: normal ACK 1:No ACK 2:scheduled under MTBA/PSMP 3: BA
|
||||
USHORT AMsduPresent:1;
|
||||
USHORT Txop_QueueSize:8;
|
||||
} QOS_CONTROL, *PQOS_CONTROL;
|
||||
|
||||
|
||||
// 2-byte Frame control field
|
||||
typedef struct PACKED {
|
||||
USHORT Ver:2; // Protocol version
|
||||
USHORT Type:2; // MSDU type
|
||||
USHORT SubType:4; // MSDU subtype
|
||||
USHORT ToDs:1; // To DS indication
|
||||
USHORT FrDs:1; // From DS indication
|
||||
USHORT MoreFrag:1; // More fragment bit
|
||||
USHORT Retry:1; // Retry status bit
|
||||
USHORT PwrMgmt:1; // Power management bit
|
||||
USHORT MoreData:1; // More data bit
|
||||
USHORT Wep:1; // Wep data
|
||||
USHORT Order:1; // Strict order expected
|
||||
} FRAME_CONTROL, *PFRAME_CONTROL;
|
||||
|
||||
typedef struct PACKED _HEADER_802_11 {
|
||||
FRAME_CONTROL FC;
|
||||
USHORT Duration;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
UCHAR Addr3[MAC_ADDR_LEN];
|
||||
USHORT Frag:4;
|
||||
USHORT Sequence:12;
|
||||
UCHAR Octet[0];
|
||||
} HEADER_802_11, *PHEADER_802_11;
|
||||
|
||||
typedef struct PACKED _PSPOLL_FRAME {
|
||||
FRAME_CONTROL FC;
|
||||
USHORT Aid;
|
||||
UCHAR Bssid[MAC_ADDR_LEN];
|
||||
UCHAR Ta[MAC_ADDR_LEN];
|
||||
} PSPOLL_FRAME, *PPSPOLL_FRAME;
|
||||
|
||||
typedef struct PACKED _RTS_FRAME {
|
||||
FRAME_CONTROL FC;
|
||||
USHORT Duration;
|
||||
UCHAR Addr1[MAC_ADDR_LEN];
|
||||
UCHAR Addr2[MAC_ADDR_LEN];
|
||||
}RTS_FRAME, *PRTS_FRAME;
|
||||
|
||||
#endif // __DOT11_BASE_H__ //
|
84
drivers/staging/rt2860/rtmp_iface.h
Normal file
84
drivers/staging/rt2860/rtmp_iface.h
Normal file
@ -0,0 +1,84 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rt_iface.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_IFACE_H__
|
||||
#define __RTMP_IFACE_H__
|
||||
|
||||
|
||||
#ifdef RTMP_PCI_SUPPORT
|
||||
#include "iface/rtmp_pci.h"
|
||||
#endif // RTMP_PCI_SUPPORT //
|
||||
#ifdef RTMP_USB_SUPPORT
|
||||
#include "iface/rtmp_usb.h"
|
||||
#endif // RTMP_USB_SUPPORT //
|
||||
|
||||
typedef struct _INF_PCI_CONFIG_
|
||||
{
|
||||
unsigned long CSRBaseAddress; // PCI MMIO Base Address, all access will use
|
||||
unsigned int irq_num;
|
||||
}INF_PCI_CONFIG;
|
||||
|
||||
|
||||
typedef struct _INF_USB_CONFIG_
|
||||
{
|
||||
UINT8 BulkInEpAddr; // bulk-in endpoint address
|
||||
UINT8 BulkOutEpAddr[6]; // bulk-out endpoint address
|
||||
}INF_USB_CONFIG;
|
||||
|
||||
|
||||
typedef struct _INF_RBUS_CONFIG_
|
||||
{
|
||||
unsigned long csr_addr;
|
||||
unsigned int irq;
|
||||
}INF_RBUS_CONFIG;
|
||||
|
||||
|
||||
typedef enum _RTMP_INF_TYPE_
|
||||
{
|
||||
RTMP_DEV_INF_UNKNOWN = 0,
|
||||
RTMP_DEV_INF_PCI = 1,
|
||||
RTMP_DEV_INF_USB = 2,
|
||||
RTMP_DEV_INF_RBUS = 4,
|
||||
}RTMP_INF_TYPE;
|
||||
|
||||
|
||||
typedef union _RTMP_INF_CONFIG_{
|
||||
struct _INF_PCI_CONFIG_ pciConfig;
|
||||
struct _INF_USB_CONFIG_ usbConfig;
|
||||
struct _INF_RBUS_CONFIG_ rbusConfig;
|
||||
}RTMP_INF_CONFIG;
|
||||
|
||||
#endif // __RTMP_IFACE_H__ //
|
55
drivers/staging/rt2860/rtmp_mcu.h
Normal file
55
drivers/staging/rt2860/rtmp_mcu.h
Normal file
@ -0,0 +1,55 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_mcu.h
|
||||
|
||||
Abstract:
|
||||
Miniport header file for mcu related information
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_MCU_H__
|
||||
#define __RTMP_MCU_H__
|
||||
|
||||
|
||||
INT RtmpAsicEraseFirmware(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
NDIS_STATUS RtmpAsicLoadFirmware(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
INT RtmpAsicSendCommandToMcu(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR Command,
|
||||
IN UCHAR Token,
|
||||
IN UCHAR Arg0,
|
||||
IN UCHAR Arg1);
|
||||
|
||||
#endif // __RTMP_MCU_H__ //
|
98
drivers/staging/rt2860/rtmp_os.h
Normal file
98
drivers/staging/rt2860/rtmp_os.h
Normal file
@ -0,0 +1,98 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_os.h
|
||||
|
||||
Abstract:
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
--------- ---------- ----------------------------------------------
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __RTMP_OS_H__
|
||||
#define __RTMP_OS_H__
|
||||
|
||||
#ifdef LINUX
|
||||
#include "rt_linux.h"
|
||||
#endif // LINUX //
|
||||
|
||||
|
||||
|
||||
/*
|
||||
This data structure mainly strip some callback function defined in
|
||||
"struct net_device" in kernel source "include/linux/netdevice.h".
|
||||
|
||||
The definition of this data structure may various depends on different
|
||||
OS. Use it carefully.
|
||||
*/
|
||||
typedef struct _RTMP_OS_NETDEV_OP_HOOK_
|
||||
{
|
||||
const struct net_device_ops *netdev_ops;
|
||||
void *priv;
|
||||
int priv_flags;
|
||||
unsigned char devAddr[6];
|
||||
unsigned char devName[16];
|
||||
unsigned char needProtcted;
|
||||
}RTMP_OS_NETDEV_OP_HOOK, *PRTMP_OS_NETDEV_OP_HOOK;
|
||||
|
||||
|
||||
typedef enum _RTMP_TASK_STATUS_
|
||||
{
|
||||
RTMP_TASK_STAT_UNKNOWN = 0,
|
||||
RTMP_TASK_STAT_INITED = 1,
|
||||
RTMP_TASK_STAT_RUNNING = 2,
|
||||
RTMP_TASK_STAT_STOPED = 4,
|
||||
}RTMP_TASK_STATUS;
|
||||
#define RTMP_TASK_CAN_DO_INSERT (RTMP_TASK_STAT_INITED |RTMP_TASK_STAT_RUNNING)
|
||||
|
||||
#define RTMP_OS_TASK_NAME_LEN 16
|
||||
typedef struct _RTMP_OS_TASK_
|
||||
{
|
||||
char taskName[RTMP_OS_TASK_NAME_LEN];
|
||||
void *priv;
|
||||
//unsigned long taskFlags;
|
||||
RTMP_TASK_STATUS taskStatus;
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
RTMP_OS_SEM taskSema;
|
||||
RTMP_OS_PID taskPID;
|
||||
struct completion taskComplete;
|
||||
#endif
|
||||
unsigned char task_killed;
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
struct task_struct *kthread_task;
|
||||
wait_queue_head_t kthread_q;
|
||||
BOOLEAN kthread_running;
|
||||
#endif
|
||||
}RTMP_OS_TASK;
|
||||
|
||||
|
||||
int RtmpOSIRQRequest(IN PNET_DEV pNetDev);
|
||||
int RtmpOSIRQRelease(IN PNET_DEV pNetDev);
|
||||
|
||||
#endif // __RMTP_OS_H__ //
|
156
drivers/staging/rt2860/rtmp_timer.h
Normal file
156
drivers/staging/rt2860/rtmp_timer.h
Normal file
@ -0,0 +1,156 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
|
||||
Module Name:
|
||||
rtmp_timer.h
|
||||
|
||||
Abstract:
|
||||
Ralink Wireless Driver timer related data structures and delcarations
|
||||
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
Name Date Modification logs
|
||||
Shiang Tu Aug-28-2008 init version
|
||||
|
||||
*/
|
||||
|
||||
#ifndef __RTMP_TIMER_H__
|
||||
#define __RTMP_TIMER_H__
|
||||
|
||||
#include "rtmp_os.h"
|
||||
|
||||
|
||||
#define DECLARE_TIMER_FUNCTION(_func) \
|
||||
void rtmp_timer_##_func(unsigned long data)
|
||||
|
||||
#define GET_TIMER_FUNCTION(_func) \
|
||||
rtmp_timer_##_func
|
||||
|
||||
|
||||
/* ----------------- Timer Related MARCO ---------------*/
|
||||
// In some os or chipset, we have a lot of timer functions and will read/write register,
|
||||
// it's not allowed in Linux USB sub-system to do it ( because of sleep issue when
|
||||
// submit to ctrl pipe). So we need a wrapper function to take care it.
|
||||
|
||||
#ifdef RTMP_TIMER_TASK_SUPPORT
|
||||
typedef VOID (*RTMP_TIMER_TASK_HANDLE)(
|
||||
IN PVOID SystemSpecific1,
|
||||
IN PVOID FunctionContext,
|
||||
IN PVOID SystemSpecific2,
|
||||
IN PVOID SystemSpecific3);
|
||||
#endif // RTMP_TIMER_TASK_SUPPORT //
|
||||
|
||||
typedef struct _RALINK_TIMER_STRUCT {
|
||||
RTMP_OS_TIMER TimerObj; // Ndis Timer object
|
||||
BOOLEAN Valid; // Set to True when call RTMPInitTimer
|
||||
BOOLEAN State; // True if timer cancelled
|
||||
BOOLEAN PeriodicType; // True if timer is periodic timer
|
||||
BOOLEAN Repeat; // True if periodic timer
|
||||
ULONG TimerValue; // Timer value in milliseconds
|
||||
ULONG cookie; // os specific object
|
||||
#ifdef RTMP_TIMER_TASK_SUPPORT
|
||||
RTMP_TIMER_TASK_HANDLE handle;
|
||||
void *pAd;
|
||||
#endif // RTMP_TIMER_TASK_SUPPORT //
|
||||
}RALINK_TIMER_STRUCT, *PRALINK_TIMER_STRUCT;
|
||||
|
||||
|
||||
#ifdef RTMP_TIMER_TASK_SUPPORT
|
||||
typedef struct _RTMP_TIMER_TASK_ENTRY_
|
||||
{
|
||||
RALINK_TIMER_STRUCT *pRaTimer;
|
||||
struct _RTMP_TIMER_TASK_ENTRY_ *pNext;
|
||||
}RTMP_TIMER_TASK_ENTRY;
|
||||
|
||||
|
||||
#define TIMER_QUEUE_SIZE_MAX 128
|
||||
typedef struct _RTMP_TIMER_TASK_QUEUE_
|
||||
{
|
||||
unsigned int status;
|
||||
unsigned char *pTimerQPoll;
|
||||
RTMP_TIMER_TASK_ENTRY *pQPollFreeList;
|
||||
RTMP_TIMER_TASK_ENTRY *pQHead;
|
||||
RTMP_TIMER_TASK_ENTRY *pQTail;
|
||||
}RTMP_TIMER_TASK_QUEUE;
|
||||
|
||||
#define BUILD_TIMER_FUNCTION(_func) \
|
||||
void rtmp_timer_##_func(unsigned long data) \
|
||||
{ \
|
||||
PRALINK_TIMER_STRUCT _pTimer = (PRALINK_TIMER_STRUCT)data; \
|
||||
RTMP_TIMER_TASK_ENTRY *_pQNode; \
|
||||
RTMP_ADAPTER *_pAd; \
|
||||
\
|
||||
_pTimer->handle = _func; \
|
||||
_pAd = (RTMP_ADAPTER *)_pTimer->pAd; \
|
||||
_pQNode = RtmpTimerQInsert(_pAd, _pTimer); \
|
||||
if ((_pQNode == NULL) && (_pAd->TimerQ.status & RTMP_TASK_CAN_DO_INSERT)) \
|
||||
RTMP_OS_Add_Timer(&_pTimer->TimerObj, OS_HZ); \
|
||||
}
|
||||
#else
|
||||
#define BUILD_TIMER_FUNCTION(_func) \
|
||||
void rtmp_timer_##_func(unsigned long data) \
|
||||
{ \
|
||||
PRALINK_TIMER_STRUCT pTimer = (PRALINK_TIMER_STRUCT) data; \
|
||||
\
|
||||
_func(NULL, (PVOID) pTimer->cookie, NULL, pTimer); \
|
||||
if (pTimer->Repeat) \
|
||||
RTMP_OS_Add_Timer(&pTimer->TimerObj, pTimer->TimerValue); \
|
||||
}
|
||||
#endif // RTMP_TIMER_TASK_SUPPORT //
|
||||
|
||||
|
||||
DECLARE_TIMER_FUNCTION(MlmePeriodicExec);
|
||||
DECLARE_TIMER_FUNCTION(MlmeRssiReportExec);
|
||||
DECLARE_TIMER_FUNCTION(AsicRxAntEvalTimeout);
|
||||
DECLARE_TIMER_FUNCTION(APSDPeriodicExec);
|
||||
DECLARE_TIMER_FUNCTION(AsicRfTuningExec);
|
||||
#ifdef RTMP_MAC_USB
|
||||
DECLARE_TIMER_FUNCTION(BeaconUpdateExec);
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
DECLARE_TIMER_FUNCTION(BeaconTimeout);
|
||||
DECLARE_TIMER_FUNCTION(ScanTimeout);
|
||||
DECLARE_TIMER_FUNCTION(AuthTimeout);
|
||||
DECLARE_TIMER_FUNCTION(AssocTimeout);
|
||||
DECLARE_TIMER_FUNCTION(ReassocTimeout);
|
||||
DECLARE_TIMER_FUNCTION(DisassocTimeout);
|
||||
DECLARE_TIMER_FUNCTION(LinkDownExec);
|
||||
DECLARE_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
|
||||
DECLARE_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
|
||||
DECLARE_TIMER_FUNCTION(PsPollWakeExec);
|
||||
DECLARE_TIMER_FUNCTION(RadioOnExec);
|
||||
|
||||
#ifdef RTMP_MAC_USB
|
||||
DECLARE_TIMER_FUNCTION(RtmpUsbStaAsicForceWakeupTimeout);
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
#if defined(AP_LED) || defined(STA_LED)
|
||||
DECLARE_TIMER_FUNCTION(LedCtrlMain);
|
||||
#endif
|
||||
|
||||
|
||||
#endif // __RTMP_TIMER_H__ //
|
@ -38,8 +38,10 @@
|
||||
#ifndef __RTMP_TYPE_H__
|
||||
#define __RTMP_TYPE_H__
|
||||
|
||||
|
||||
#define PACKED __attribute__ ((packed))
|
||||
|
||||
#ifdef LINUX
|
||||
// Put platform dependent declaration here
|
||||
// For example, linux type definition
|
||||
typedef unsigned char UINT8;
|
||||
@ -48,6 +50,7 @@ typedef unsigned int UINT32;
|
||||
typedef unsigned long long UINT64;
|
||||
typedef int INT32;
|
||||
typedef long long INT64;
|
||||
#endif // LINUX //
|
||||
|
||||
typedef unsigned char * PUINT8;
|
||||
typedef unsigned short * PUINT16;
|
||||
@ -56,22 +59,30 @@ typedef unsigned long long * PUINT64;
|
||||
typedef int * PINT32;
|
||||
typedef long long * PINT64;
|
||||
|
||||
// modified for fixing compile warning on Sigma 8634 platform
|
||||
typedef char STRING;
|
||||
typedef signed char CHAR;
|
||||
|
||||
typedef signed short SHORT;
|
||||
typedef signed int INT;
|
||||
typedef signed long LONG;
|
||||
typedef signed long long LONGLONG;
|
||||
|
||||
|
||||
#ifdef LINUX
|
||||
typedef unsigned char UCHAR;
|
||||
typedef unsigned short USHORT;
|
||||
typedef unsigned int UINT;
|
||||
typedef unsigned long ULONG;
|
||||
#endif // LINUX //
|
||||
typedef unsigned long long ULONGLONG;
|
||||
|
||||
typedef unsigned char BOOLEAN;
|
||||
#ifdef LINUX
|
||||
typedef void VOID;
|
||||
#endif // LINUX //
|
||||
|
||||
typedef char * PSTRING;
|
||||
typedef VOID * PVOID;
|
||||
typedef CHAR * PCHAR;
|
||||
typedef UCHAR * PUCHAR;
|
||||
@ -90,5 +101,47 @@ typedef union _LARGE_INTEGER {
|
||||
INT64 QuadPart;
|
||||
} LARGE_INTEGER;
|
||||
|
||||
#endif // __RTMP_TYPE_H__
|
||||
|
||||
//
|
||||
// Register set pair for initialzation register set definition
|
||||
//
|
||||
typedef struct _RTMP_REG_PAIR
|
||||
{
|
||||
ULONG Register;
|
||||
ULONG Value;
|
||||
} RTMP_REG_PAIR, *PRTMP_REG_PAIR;
|
||||
|
||||
typedef struct _REG_PAIR
|
||||
{
|
||||
UCHAR Register;
|
||||
UCHAR Value;
|
||||
} REG_PAIR, *PREG_PAIR;
|
||||
|
||||
//
|
||||
// Register set pair for initialzation register set definition
|
||||
//
|
||||
typedef struct _RTMP_RF_REGS
|
||||
{
|
||||
UCHAR Channel;
|
||||
ULONG R1;
|
||||
ULONG R2;
|
||||
ULONG R3;
|
||||
ULONG R4;
|
||||
} RTMP_RF_REGS, *PRTMP_RF_REGS;
|
||||
|
||||
typedef struct _FREQUENCY_ITEM {
|
||||
UCHAR Channel;
|
||||
UCHAR N;
|
||||
UCHAR R;
|
||||
UCHAR K;
|
||||
} FREQUENCY_ITEM, *PFREQUENCY_ITEM;
|
||||
|
||||
|
||||
typedef int NTSTATUS;
|
||||
|
||||
|
||||
#define STATUS_SUCCESS 0x00
|
||||
#define STATUS_UNSUCCESSFUL 0x01
|
||||
|
||||
#endif // __RTMP_TYPE_H__ //
|
||||
|
||||
|
189
drivers/staging/rt2860/rtusb_io.h
Normal file
189
drivers/staging/rt2860/rtusb_io.h
Normal file
@ -0,0 +1,189 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __RTUSB_IO_H__
|
||||
#define __RTUSB_IO_H__
|
||||
|
||||
#include "rtmp_type.h"
|
||||
|
||||
// New for MeetingHouse Api support
|
||||
#define CMDTHREAD_VENDOR_RESET 0x0D730101 // cmd
|
||||
#define CMDTHREAD_VENDOR_UNPLUG 0x0D730102 // cmd
|
||||
#define CMDTHREAD_VENDOR_SWITCH_FUNCTION 0x0D730103 // cmd
|
||||
#define CMDTHREAD_MULTI_WRITE_MAC 0x0D730107 // cmd
|
||||
#define CMDTHREAD_MULTI_READ_MAC 0x0D730108 // cmd
|
||||
#define CMDTHREAD_VENDOR_EEPROM_WRITE 0x0D73010A // cmd
|
||||
#define CMDTHREAD_VENDOR_EEPROM_READ 0x0D73010B // cmd
|
||||
#define CMDTHREAD_VENDOR_ENTER_TESTMODE 0x0D73010C // cmd
|
||||
#define CMDTHREAD_VENDOR_EXIT_TESTMODE 0x0D73010D // cmd
|
||||
#define CMDTHREAD_VENDOR_WRITE_BBP 0x0D730119 // cmd
|
||||
#define CMDTHREAD_VENDOR_READ_BBP 0x0D730118 // cmd
|
||||
#define CMDTHREAD_VENDOR_WRITE_RF 0x0D73011A // cmd
|
||||
#define CMDTHREAD_VENDOR_FLIP_IQ 0x0D73011D // cmd
|
||||
#define CMDTHREAD_RESET_BULK_OUT 0x0D730210 // cmd
|
||||
#define CMDTHREAD_RESET_BULK_IN 0x0D730211 // cmd
|
||||
#define CMDTHREAD_SET_PSM_BIT 0x0D730212 // cmd
|
||||
#define CMDTHREAD_SET_RADIO 0x0D730214 // cmd
|
||||
#define CMDTHREAD_UPDATE_TX_RATE 0x0D730216 // cmd
|
||||
#define CMDTHREAD_802_11_ADD_KEY_WEP 0x0D730218 // cmd
|
||||
#define CMDTHREAD_RESET_FROM_ERROR 0x0D73021A // cmd
|
||||
#define CMDTHREAD_LINK_DOWN 0x0D73021B // cmd
|
||||
#define CMDTHREAD_RESET_FROM_NDIS 0x0D73021C // cmd
|
||||
#define CMDTHREAD_CHECK_GPIO 0x0D730215 // cmd
|
||||
#define CMDTHREAD_FORCE_WAKE_UP 0x0D730222 // cmd
|
||||
#define CMDTHREAD_SET_BW 0x0D730225 // cmd
|
||||
#define CMDTHREAD_SET_ASIC_WCID 0x0D730226 // cmd
|
||||
#define CMDTHREAD_SET_ASIC_WCID_CIPHER 0x0D730227 // cmd
|
||||
#define CMDTHREAD_QKERIODIC_EXECUT 0x0D73023D // cmd
|
||||
#define RT_CMD_SET_KEY_TABLE 0x0D730228 // cmd
|
||||
#define RT_CMD_SET_RX_WCID_TABLE 0x0D730229 // cmd
|
||||
#define CMDTHREAD_SET_CLIENT_MAC_ENTRY 0x0D73023E // cmd
|
||||
#define CMDTHREAD_SET_GROUP_KEY 0x0D73023F // cmd
|
||||
#define CMDTHREAD_SET_PAIRWISE_KEY 0x0D730240 // cmd
|
||||
|
||||
#define CMDTHREAD_802_11_QUERY_HARDWARE_REGISTER 0x0D710105 // cmd
|
||||
#define CMDTHREAD_802_11_SET_PHY_MODE 0x0D79010C // cmd
|
||||
#define CMDTHREAD_802_11_SET_STA_CONFIG 0x0D790111 // cmd
|
||||
#define CMDTHREAD_802_11_SET_PREAMBLE 0x0D790101 // cmd
|
||||
#define CMDTHREAD_802_11_COUNTER_MEASURE 0x0D790102 // cmd
|
||||
// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
|
||||
#define CMDTHREAD_UPDATE_PROTECT 0x0D790103 // cmd
|
||||
// end johnli
|
||||
|
||||
|
||||
//CMDTHREAD_MULTI_READ_MAC
|
||||
//CMDTHREAD_MULTI_WRITE_MAC
|
||||
//CMDTHREAD_VENDOR_EEPROM_READ
|
||||
//CMDTHREAD_VENDOR_EEPROM_WRITE
|
||||
typedef struct _CMDHandler_TLV {
|
||||
USHORT Offset;
|
||||
USHORT Length;
|
||||
UCHAR DataFirst;
|
||||
} CMDHandler_TLV, *PCMDHandler_TLV;
|
||||
|
||||
|
||||
typedef struct _CmdQElmt {
|
||||
UINT command;
|
||||
PVOID buffer;
|
||||
ULONG bufferlength;
|
||||
BOOLEAN CmdFromNdis;
|
||||
BOOLEAN SetOperation;
|
||||
struct _CmdQElmt *next;
|
||||
} CmdQElmt, *PCmdQElmt;
|
||||
|
||||
typedef struct _CmdQ {
|
||||
UINT size;
|
||||
CmdQElmt *head;
|
||||
CmdQElmt *tail;
|
||||
UINT32 CmdQState;
|
||||
}CmdQ, *PCmdQ;
|
||||
|
||||
|
||||
#define EnqueueCmd(cmdq, cmdqelmt) \
|
||||
{ \
|
||||
if (cmdq->size == 0) \
|
||||
cmdq->head = cmdqelmt; \
|
||||
else \
|
||||
cmdq->tail->next = cmdqelmt; \
|
||||
cmdq->tail = cmdqelmt; \
|
||||
cmdqelmt->next = NULL; \
|
||||
cmdq->size++; \
|
||||
}
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
||||
USB Cmd to ASIC Related MACRO
|
||||
|
||||
******************************************************************************/
|
||||
// reset MAC of a station entry to 0xFFFFFFFFFFFF
|
||||
#define RTMP_STA_ENTRY_MAC_RESET(pAd, Wcid) \
|
||||
{ RT_SET_ASIC_WCID SetAsicWcid; \
|
||||
SetAsicWcid.WCID = Wcid; \
|
||||
SetAsicWcid.SetTid = 0xffffffff; \
|
||||
SetAsicWcid.DeleteTid = 0xffffffff; \
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_ASIC_WCID, \
|
||||
&SetAsicWcid, sizeof(RT_SET_ASIC_WCID)); }
|
||||
|
||||
// add this entry into ASIC RX WCID search table
|
||||
#define RTMP_STA_ENTRY_ADD(pAd, pEntry) \
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_CLIENT_MAC_ENTRY, \
|
||||
pEntry, sizeof(MAC_TABLE_ENTRY));
|
||||
|
||||
// add by johnli, fix "in_interrupt" error when call "MacTableDeleteEntry" in Rx tasklet
|
||||
// Set MAC register value according operation mode
|
||||
#define RTMP_UPDATE_PROTECT(pAd) \
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_UPDATE_PROTECT, NULL, 0);
|
||||
// end johnli
|
||||
|
||||
// remove Pair-wise key material from ASIC
|
||||
// yet implement
|
||||
#define RTMP_STA_ENTRY_KEY_DEL(pAd, BssIdx, Wcid)
|
||||
|
||||
// add Client security information into ASIC WCID table and IVEIV table
|
||||
#define RTMP_STA_SECURITY_INFO_ADD(pAd, apidx, KeyID, pEntry) \
|
||||
{ RTMP_STA_ENTRY_MAC_RESET(pAd, pEntry->Aid); \
|
||||
if (pEntry->Aid >= 1) { \
|
||||
RT_SET_ASIC_WCID_ATTRI SetAsicWcidAttri; \
|
||||
SetAsicWcidAttri.WCID = pEntry->Aid; \
|
||||
if ((pEntry->AuthMode <= Ndis802_11AuthModeAutoSwitch) && \
|
||||
(pEntry->WepStatus == Ndis802_11Encryption1Enabled)) \
|
||||
{ \
|
||||
SetAsicWcidAttri.Cipher = pAd->SharedKey[apidx][KeyID].CipherAlg; \
|
||||
} \
|
||||
else if (pEntry->AuthMode == Ndis802_11AuthModeWPANone) \
|
||||
{ \
|
||||
SetAsicWcidAttri.Cipher = pAd->SharedKey[apidx][KeyID].CipherAlg; \
|
||||
} \
|
||||
else SetAsicWcidAttri.Cipher = 0; \
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("aid cipher = %ld\n",SetAsicWcidAttri.Cipher)); \
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_SET_ASIC_WCID_CIPHER, \
|
||||
&SetAsicWcidAttri, sizeof(RT_SET_ASIC_WCID_ATTRI)); } }
|
||||
|
||||
// Insert the BA bitmap to ASIC for the Wcid entry
|
||||
#define RTMP_ADD_BA_SESSION_TO_ASIC(_pAd, _Aid, _TID) \
|
||||
do{ \
|
||||
RT_SET_ASIC_WCID SetAsicWcid; \
|
||||
SetAsicWcid.WCID = (_Aid); \
|
||||
SetAsicWcid.SetTid = (0x10000<<(_TID)); \
|
||||
SetAsicWcid.DeleteTid = 0xffffffff; \
|
||||
RTUSBEnqueueInternalCmd((_pAd), CMDTHREAD_SET_ASIC_WCID, &SetAsicWcid, sizeof(RT_SET_ASIC_WCID)); \
|
||||
}while(0)
|
||||
|
||||
// Remove the BA bitmap from ASIC for the Wcid entry
|
||||
#define RTMP_DEL_BA_SESSION_FROM_ASIC(_pAd, _Wcid, _TID) \
|
||||
do{ \
|
||||
RT_SET_ASIC_WCID SetAsicWcid; \
|
||||
SetAsicWcid.WCID = (_Wcid); \
|
||||
SetAsicWcid.SetTid = (0xffffffff); \
|
||||
SetAsicWcid.DeleteTid = (0x10000<<(_TID) ); \
|
||||
RTUSBEnqueueInternalCmd((_pAd), CMDTHREAD_SET_ASIC_WCID, &SetAsicWcid, sizeof(RT_SET_ASIC_WCID)); \
|
||||
}while(0)
|
||||
|
||||
|
||||
#endif // __RTUSB_IO_H__ //
|
@ -23,7 +23,7 @@
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************
|
||||
*/
|
||||
*/
|
||||
|
||||
#ifndef __SPECTRUM_H__
|
||||
#define __SPECTRUM_H__
|
||||
@ -31,112 +31,10 @@
|
||||
#include "rtmp_type.h"
|
||||
#include "spectrum_def.h"
|
||||
|
||||
typedef struct PACKED _TPC_REPORT_INFO
|
||||
{
|
||||
UINT8 TxPwr;
|
||||
UINT8 LinkMargin;
|
||||
} TPC_REPORT_INFO, *PTPC_REPORT_INFO;
|
||||
|
||||
typedef struct PACKED _CH_SW_ANN_INFO
|
||||
{
|
||||
UINT8 ChSwMode;
|
||||
UINT8 Channel;
|
||||
UINT8 ChSwCnt;
|
||||
} CH_SW_ANN_INFO, *PCH_SW_ANN_INFO;
|
||||
|
||||
typedef union PACKED _MEASURE_REQ_MODE
|
||||
{
|
||||
struct PACKED
|
||||
{
|
||||
UINT8 Rev0:1;
|
||||
UINT8 Enable:1;
|
||||
UINT8 Request:1;
|
||||
UINT8 Report:1;
|
||||
UINT8 Rev1:4;
|
||||
} field;
|
||||
UINT8 word;
|
||||
} MEASURE_REQ_MODE, *PMEASURE_REQ_MODE;
|
||||
|
||||
typedef struct PACKED _MEASURE_REQ
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
} MEASURE_REQ, *PMEASURE_REQ;
|
||||
|
||||
typedef struct PACKED _MEASURE_REQ_INFO
|
||||
{
|
||||
UINT8 Token;
|
||||
MEASURE_REQ_MODE ReqMode;
|
||||
UINT8 ReqType;
|
||||
MEASURE_REQ MeasureReq;
|
||||
} MEASURE_REQ_INFO, *PMEASURE_REQ_INFO;
|
||||
|
||||
typedef union PACKED _MEASURE_BASIC_REPORT_MAP
|
||||
{
|
||||
struct PACKED
|
||||
{
|
||||
UINT8 BSS:1;
|
||||
UINT8 OfdmPreamble:1;
|
||||
UINT8 UnidentifiedSignal:1;
|
||||
UINT8 Radar:1;
|
||||
UINT8 Unmeasure:1;
|
||||
UINT8 Rev:3;
|
||||
} field;
|
||||
UINT8 word;
|
||||
} MEASURE_BASIC_REPORT_MAP, *PMEASURE_BASIC_REPORT_MAP;
|
||||
|
||||
typedef struct PACKED _MEASURE_BASIC_REPORT
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
MEASURE_BASIC_REPORT_MAP Map;
|
||||
} MEASURE_BASIC_REPORT, *PMEASURE_BASIC_REPORT;
|
||||
|
||||
typedef struct PACKED _MEASURE_CCA_REPORT
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
UINT8 CCA_Busy_Fraction;
|
||||
} MEASURE_CCA_REPORT, *PMEASURE_CCA_REPORT;
|
||||
|
||||
typedef struct PACKED _MEASURE_RPI_REPORT
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
UINT8 RPI_Density[8];
|
||||
} MEASURE_RPI_REPORT, *PMEASURE_RPI_REPORT;
|
||||
|
||||
typedef union PACKED _MEASURE_REPORT_MODE
|
||||
{
|
||||
struct PACKED
|
||||
{
|
||||
UINT8 Late:1;
|
||||
UINT8 Incapable:1;
|
||||
UINT8 Refused:1;
|
||||
UINT8 Rev:5;
|
||||
} field;
|
||||
UINT8 word;
|
||||
} MEASURE_REPORT_MODE, *PMEASURE_REPORT_MODE;
|
||||
|
||||
typedef struct PACKED _MEASURE_REPORT_INFO
|
||||
{
|
||||
UINT8 Token;
|
||||
MEASURE_REPORT_MODE ReportMode;
|
||||
UINT8 ReportType;
|
||||
UINT8 Octect[0];
|
||||
} MEASURE_REPORT_INFO, *PMEASURE_REPORT_INFO;
|
||||
|
||||
typedef struct PACKED _QUIET_INFO
|
||||
{
|
||||
UINT8 QuietCnt;
|
||||
UINT8 QuietPeriod;
|
||||
UINT8 QuietDuration;
|
||||
UINT8 QuietOffset;
|
||||
} QUIET_INFO, *PQUIET_INFO;
|
||||
CHAR RTMP_GetTxPwr(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN HTTRANSMIT_SETTING HTTxMode);
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
@ -150,14 +48,17 @@ typedef struct PACKED _QUIET_INFO
|
||||
Return : None.
|
||||
==========================================================================
|
||||
*/
|
||||
VOID EnqueueMeasurementReq(
|
||||
VOID MakeMeasurementReqFrame(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR pDA,
|
||||
OUT PUCHAR pOutBuffer,
|
||||
OUT PULONG pFrameLen,
|
||||
IN UINT8 TotalLen,
|
||||
IN UINT8 Category,
|
||||
IN UINT8 Action,
|
||||
IN UINT8 MeasureToken,
|
||||
IN UINT8 MeasureReqMode,
|
||||
IN UINT8 MeasureReqType,
|
||||
IN UINT8 MeasureCh,
|
||||
IN UINT16 MeasureDuration);
|
||||
IN UINT8 NumOfRepetitions);
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
@ -264,11 +165,16 @@ VOID PeerSpectrumAction(
|
||||
*/
|
||||
INT Set_MeasureReq_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg);
|
||||
IN PSTRING arg);
|
||||
|
||||
INT Set_TpcReq_Proc(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PUCHAR arg);
|
||||
IN PSTRING arg);
|
||||
|
||||
INT Set_PwrConstraint(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PSTRING arg);
|
||||
|
||||
|
||||
VOID MeasureReqTabInit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
@ -276,6 +182,38 @@ VOID MeasureReqTabInit(
|
||||
VOID MeasureReqTabExit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
PMEASURE_REQ_ENTRY MeasureReqLookUp(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 DialogToken);
|
||||
|
||||
PMEASURE_REQ_ENTRY MeasureReqInsert(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 DialogToken);
|
||||
|
||||
VOID MeasureReqDelete(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UINT8 DialogToken);
|
||||
|
||||
VOID InsertChannelRepIE(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
IN PSTRING pCountry,
|
||||
IN UINT8 RegulatoryClass);
|
||||
|
||||
VOID InsertTpcReportIE(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
IN UINT8 TxPwr,
|
||||
IN UINT8 LinkMargin);
|
||||
|
||||
VOID InsertDialogToken(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
IN UINT8 DialogToken);
|
||||
|
||||
VOID TpcReqTabInit(
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
@ -288,5 +226,10 @@ VOID NotifyChSwAnnToPeerAPs(
|
||||
IN PUCHAR pTA,
|
||||
IN UINT8 ChSwMode,
|
||||
IN UINT8 Channel);
|
||||
|
||||
VOID RguClass_BuildBcnChList(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
OUT PUCHAR pBuf,
|
||||
OUT PULONG pBufLen);
|
||||
#endif // __SPECTRUM_H__ //
|
||||
|
||||
|
@ -39,21 +39,15 @@
|
||||
#ifndef __SPECTRUM_DEF_H__
|
||||
#define __SPECTRUM_DEF_H__
|
||||
|
||||
#define MAX_MEASURE_REQ_TAB_SIZE 3
|
||||
|
||||
#define MAX_MEASURE_REQ_TAB_SIZE 32
|
||||
#define MAX_HASH_MEASURE_REQ_TAB_SIZE MAX_MEASURE_REQ_TAB_SIZE
|
||||
|
||||
#define MAX_TPC_REQ_TAB_SIZE 3
|
||||
#define MAX_TPC_REQ_TAB_SIZE 32
|
||||
#define MAX_HASH_TPC_REQ_TAB_SIZE MAX_TPC_REQ_TAB_SIZE
|
||||
|
||||
#define MIN_RCV_PWR 100 /* Negative value ((dBm) */
|
||||
|
||||
#define RM_TPC_REQ 0
|
||||
#define RM_MEASURE_REQ 1
|
||||
|
||||
#define RM_BASIC 0
|
||||
#define RM_CCA 1
|
||||
#define RM_RPI_HISTOGRAM 2
|
||||
|
||||
#define TPC_REQ_AGE_OUT 500 /* ms */
|
||||
#define MQ_REQ_AGE_OUT 500 /* ms */
|
||||
|
||||
@ -91,5 +85,141 @@ typedef struct _TPC_REQ_TAB
|
||||
TPC_REQ_ENTRY Content[MAX_TPC_REQ_TAB_SIZE];
|
||||
} TPC_REQ_TAB, *PTPC_REQ_TAB;
|
||||
|
||||
|
||||
/* The regulatory information */
|
||||
typedef struct _DOT11_CHANNEL_SET
|
||||
{
|
||||
UCHAR NumberOfChannels;
|
||||
UINT8 MaxTxPwr;
|
||||
UCHAR ChannelList[16];
|
||||
} DOT11_CHANNEL_SET, *PDOT11_CHANNEL_SET;
|
||||
|
||||
typedef struct _DOT11_REGULATORY_INFORMATION
|
||||
{
|
||||
UCHAR RegulatoryClass;
|
||||
DOT11_CHANNEL_SET ChannelSet;
|
||||
} DOT11_REGULATORY_INFORMATION, *PDOT11_REGULATORY_INFORMATION;
|
||||
|
||||
|
||||
|
||||
#define RM_TPC_REQ 0
|
||||
#define RM_MEASURE_REQ 1
|
||||
|
||||
#define RM_BASIC 0
|
||||
#define RM_CCA 1
|
||||
#define RM_RPI_HISTOGRAM 2
|
||||
#define RM_CH_LOAD 3
|
||||
#define RM_NOISE_HISTOGRAM 4
|
||||
|
||||
|
||||
typedef struct PACKED _TPC_REPORT_INFO
|
||||
{
|
||||
UINT8 TxPwr;
|
||||
UINT8 LinkMargin;
|
||||
} TPC_REPORT_INFO, *PTPC_REPORT_INFO;
|
||||
|
||||
typedef struct PACKED _CH_SW_ANN_INFO
|
||||
{
|
||||
UINT8 ChSwMode;
|
||||
UINT8 Channel;
|
||||
UINT8 ChSwCnt;
|
||||
} CH_SW_ANN_INFO, *PCH_SW_ANN_INFO;
|
||||
|
||||
typedef union PACKED _MEASURE_REQ_MODE
|
||||
{
|
||||
struct PACKED
|
||||
{
|
||||
UINT8 Parallel:1;
|
||||
UINT8 Enable:1;
|
||||
UINT8 Request:1;
|
||||
UINT8 Report:1;
|
||||
UINT8 DurationMandatory:1;
|
||||
UINT8 :3;
|
||||
} field;
|
||||
UINT8 word;
|
||||
} MEASURE_REQ_MODE, *PMEASURE_REQ_MODE;
|
||||
|
||||
typedef struct PACKED _MEASURE_REQ
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
} MEASURE_REQ, *PMEASURE_REQ;
|
||||
|
||||
typedef struct PACKED _MEASURE_REQ_INFO
|
||||
{
|
||||
UINT8 Token;
|
||||
MEASURE_REQ_MODE ReqMode;
|
||||
UINT8 ReqType;
|
||||
UINT8 Oct[0];
|
||||
} MEASURE_REQ_INFO, *PMEASURE_REQ_INFO;
|
||||
|
||||
typedef union PACKED _MEASURE_BASIC_REPORT_MAP
|
||||
{
|
||||
struct PACKED
|
||||
{
|
||||
UINT8 BSS:1;
|
||||
|
||||
UINT8 OfdmPreamble:1;
|
||||
UINT8 UnidentifiedSignal:1;
|
||||
UINT8 Radar:1;
|
||||
UINT8 Unmeasure:1;
|
||||
UINT8 Rev:3;
|
||||
} field;
|
||||
UINT8 word;
|
||||
} MEASURE_BASIC_REPORT_MAP, *PMEASURE_BASIC_REPORT_MAP;
|
||||
|
||||
typedef struct PACKED _MEASURE_BASIC_REPORT
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
MEASURE_BASIC_REPORT_MAP Map;
|
||||
} MEASURE_BASIC_REPORT, *PMEASURE_BASIC_REPORT;
|
||||
|
||||
typedef struct PACKED _MEASURE_CCA_REPORT
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
UINT8 CCA_Busy_Fraction;
|
||||
} MEASURE_CCA_REPORT, *PMEASURE_CCA_REPORT;
|
||||
|
||||
typedef struct PACKED _MEASURE_RPI_REPORT
|
||||
{
|
||||
UINT8 ChNum;
|
||||
UINT64 MeasureStartTime;
|
||||
UINT16 MeasureDuration;
|
||||
UINT8 RPI_Density[8];
|
||||
} MEASURE_RPI_REPORT, *PMEASURE_RPI_REPORT;
|
||||
|
||||
typedef union PACKED _MEASURE_REPORT_MODE
|
||||
{
|
||||
struct PACKED
|
||||
{
|
||||
UINT8 Late:1;
|
||||
UINT8 Incapable:1;
|
||||
UINT8 Refused:1;
|
||||
UINT8 Rev:5;
|
||||
} field;
|
||||
UINT8 word;
|
||||
} MEASURE_REPORT_MODE, *PMEASURE_REPORT_MODE;
|
||||
|
||||
typedef struct PACKED _MEASURE_REPORT_INFO
|
||||
{
|
||||
UINT8 Token;
|
||||
UINT8 ReportMode;
|
||||
UINT8 ReportType;
|
||||
UINT8 Octect[0];
|
||||
} MEASURE_REPORT_INFO, *PMEASURE_REPORT_INFO;
|
||||
|
||||
typedef struct PACKED _QUIET_INFO
|
||||
{
|
||||
UINT8 QuietCnt;
|
||||
UINT8 QuietPeriod;
|
||||
UINT16 QuietDuration;
|
||||
UINT16 QuietOffset;
|
||||
} QUIET_INFO, *PQUIET_INFO;
|
||||
|
||||
#endif // __SPECTRUM_DEF_H__ //
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -149,7 +149,7 @@ VOID AssocTimeout(IN PVOID SystemSpecific1,
|
||||
return;
|
||||
|
||||
MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_ASSOC_TIMEOUT, 0, NULL);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -177,7 +177,7 @@ VOID ReassocTimeout(IN PVOID SystemSpecific1,
|
||||
return;
|
||||
|
||||
MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_REASSOC_TIMEOUT, 0, NULL);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -205,7 +205,7 @@ VOID DisassocTimeout(IN PVOID SystemSpecific1,
|
||||
return;
|
||||
|
||||
MlmeEnqueue(pAd, ASSOC_STATE_MACHINE, MT2_DISASSOC_TIMEOUT, 0, NULL);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -236,7 +236,6 @@ VOID MlmeAssocReqAction(
|
||||
{
|
||||
UCHAR ApAddr[6];
|
||||
HEADER_802_11 AssocHdr;
|
||||
UCHAR Ccx2Len = 5;
|
||||
UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
|
||||
USHORT ListenIntv;
|
||||
ULONG Timeout;
|
||||
@ -247,13 +246,6 @@ VOID MlmeAssocReqAction(
|
||||
ULONG FrameLen = 0;
|
||||
ULONG tmp;
|
||||
USHORT VarIesOffset;
|
||||
UCHAR CkipFlag;
|
||||
UCHAR CkipNegotiationBuffer[CKIP_NEGOTIATION_LENGTH];
|
||||
UCHAR AironetCkipIe = IE_AIRONET_CKIP;
|
||||
UCHAR AironetCkipLen = CKIP_NEGOTIATION_LENGTH;
|
||||
UCHAR AironetIPAddressIE = IE_AIRONET_IPADDRESS;
|
||||
UCHAR AironetIPAddressLen = AIRONET_IPADDRESS_LENGTH;
|
||||
UCHAR AironetIPAddressBuffer[AIRONET_IPADDRESS_LENGTH] = {0x00, 0x40, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00};
|
||||
USHORT Status;
|
||||
|
||||
// Block all authentication request durning WPA block period
|
||||
@ -454,7 +446,8 @@ VOID MlmeAssocReqAction(
|
||||
RSNIe = IE_WPA2;
|
||||
}
|
||||
|
||||
if (pAd->StaCfg.WpaSupplicantUP != 1)
|
||||
if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE) &&
|
||||
(pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE))
|
||||
RTMPMakeRSNIE(pAd, pAd->StaCfg.AuthMode, pAd->StaCfg.WepStatus, BSS0);
|
||||
|
||||
// Check for WPA PMK cache list
|
||||
@ -471,7 +464,18 @@ VOID MlmeAssocReqAction(
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef RT2860
|
||||
/*
|
||||
When AuthMode is WPA2-Enterprise and AP reboot or STA lost AP,
|
||||
AP would not do PMK cache with STA after STA re-connect to AP again.
|
||||
In this case, driver doesn't need to send PMKID to AP and WpaSupplicant.
|
||||
*/
|
||||
if ((pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2) &&
|
||||
(NdisEqualMemory(pAd->MlmeAux.Bssid, pAd->CommonCfg.LastBssid, MAC_ADDR_LEN)))
|
||||
{
|
||||
FoundPMK = FALSE;
|
||||
}
|
||||
#endif // RT2860 //
|
||||
if (FoundPMK)
|
||||
{
|
||||
// Set PMK number
|
||||
@ -481,7 +485,8 @@ VOID MlmeAssocReqAction(
|
||||
}
|
||||
}
|
||||
|
||||
if (pAd->StaCfg.WpaSupplicantUP == 1)
|
||||
if ((pAd->StaCfg.WpaSupplicantUP == WPA_SUPPLICANT_ENABLE) &&
|
||||
(pAd->StaCfg.bRSN_IE_FromWpaSupplicant == TRUE))
|
||||
{
|
||||
MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
|
||||
pAd->StaCfg.RSNIE_Len, pAd->StaCfg.RSN_IE,
|
||||
@ -498,7 +503,8 @@ VOID MlmeAssocReqAction(
|
||||
|
||||
FrameLen += tmp;
|
||||
|
||||
if (pAd->StaCfg.WpaSupplicantUP != 1)
|
||||
if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_ENABLE) ||
|
||||
(pAd->StaCfg.bRSN_IE_FromWpaSupplicant == FALSE))
|
||||
{
|
||||
// Append Variable IE
|
||||
NdisMoveMemory(pAd->StaCfg.ReqVarIEs + VarIesOffset, &RSNIe, 1);
|
||||
@ -513,53 +519,6 @@ VOID MlmeAssocReqAction(
|
||||
pAd->StaCfg.ReqVarIELen = VarIesOffset;
|
||||
}
|
||||
|
||||
// We have update that at PeerBeaconAtJoinRequest()
|
||||
CkipFlag = pAd->StaCfg.CkipFlag;
|
||||
if (CkipFlag != 0)
|
||||
{
|
||||
NdisZeroMemory(CkipNegotiationBuffer, CKIP_NEGOTIATION_LENGTH);
|
||||
CkipNegotiationBuffer[2] = 0x66;
|
||||
// Make it try KP & MIC, since we have to follow the result from AssocRsp
|
||||
CkipNegotiationBuffer[8] = 0x18;
|
||||
CkipNegotiationBuffer[CKIP_NEGOTIATION_LENGTH - 1] = 0x22;
|
||||
CkipFlag = 0x18;
|
||||
|
||||
MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
|
||||
1, &AironetCkipIe,
|
||||
1, &AironetCkipLen,
|
||||
AironetCkipLen, CkipNegotiationBuffer,
|
||||
END_OF_ARGS);
|
||||
FrameLen += tmp;
|
||||
}
|
||||
|
||||
// Add CCX v2 request if CCX2 admin state is on
|
||||
if (pAd->StaCfg.CCXControl.field.Enable == 1)
|
||||
{
|
||||
|
||||
//
|
||||
// Add AironetIPAddressIE for Cisco CCX 2.X
|
||||
// Add CCX Version
|
||||
//
|
||||
MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
|
||||
1, &AironetIPAddressIE,
|
||||
1, &AironetIPAddressLen,
|
||||
AironetIPAddressLen, AironetIPAddressBuffer,
|
||||
1, &Ccx2Ie,
|
||||
1, &Ccx2Len,
|
||||
Ccx2Len, Ccx2IeInfo,
|
||||
END_OF_ARGS);
|
||||
FrameLen += tmp;
|
||||
|
||||
// Add by James 03/06/27
|
||||
// Set Variable IEs Length
|
||||
pAd->StaCfg.ReqVarIELen = VarIesOffset;
|
||||
pAd->StaCfg.AssocInfo.RequestIELength = VarIesOffset;
|
||||
|
||||
// OffsetResponseIEs follow ReqVarIE
|
||||
pAd->StaCfg.AssocInfo.OffsetResponseIEs = sizeof(NDIS_802_11_ASSOCIATION_INFORMATION) + pAd->StaCfg.ReqVarIELen;
|
||||
// End Add by James
|
||||
}
|
||||
|
||||
|
||||
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
@ -600,7 +559,6 @@ VOID MlmeReassocReqAction(
|
||||
{
|
||||
UCHAR ApAddr[6];
|
||||
HEADER_802_11 ReassocHdr;
|
||||
UCHAR Ccx2Len = 5;
|
||||
UCHAR WmeIe[9] = {IE_VENDOR_SPECIFIC, 0x07, 0x00, 0x50, 0xf2, 0x02, 0x00, 0x01, 0x00};
|
||||
USHORT CapabilityInfo, ListenIntv;
|
||||
ULONG Timeout;
|
||||
@ -749,20 +707,6 @@ VOID MlmeReassocReqAction(
|
||||
FrameLen += TmpLen;
|
||||
}
|
||||
|
||||
// Add CCX v2 request if CCX2 admin state is on
|
||||
if (pAd->StaCfg.CCXControl.field.Enable == 1)
|
||||
{
|
||||
//
|
||||
// Add CCX Version
|
||||
//
|
||||
MakeOutgoingFrame(pOutBuffer + FrameLen, &tmp,
|
||||
1, &Ccx2Ie,
|
||||
1, &Ccx2Len,
|
||||
Ccx2Len, Ccx2IeInfo,
|
||||
END_OF_ARGS);
|
||||
FrameLen += tmp;
|
||||
}
|
||||
|
||||
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
|
||||
@ -800,9 +744,10 @@ VOID MlmeDisassocReqAction(
|
||||
ULONG FrameLen = 0;
|
||||
NDIS_STATUS NStatus;
|
||||
BOOLEAN TimerCancelled;
|
||||
ULONG Timeout = 0;
|
||||
ULONG Timeout = 500;
|
||||
USHORT Status;
|
||||
|
||||
|
||||
// skip sanity check
|
||||
pDisassocReq = (PMLME_DISASSOC_REQ_STRUCT)(Elem->Msg);
|
||||
|
||||
@ -845,11 +790,9 @@ VOID MlmeDisassocReqAction(
|
||||
RTMPSetTimer(&pAd->MlmeAux.DisassocTimer, Timeout); /* in mSec */
|
||||
pAd->Mlme.AssocMachine.CurrState = DISASSOC_WAIT_RSP;
|
||||
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
|
||||
wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
|
||||
}
|
||||
|
||||
RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
@ -876,7 +819,7 @@ VOID PeerAssocRspAction(
|
||||
EDCA_PARM EdcaParm;
|
||||
HT_CAPABILITY_IE HtCapability;
|
||||
ADD_HT_INFO_IE AddHtInfo; // AP might use this additional ht info IE
|
||||
UCHAR HtCapabilityLen;
|
||||
UCHAR HtCapabilityLen = 0;
|
||||
UCHAR AddHtInfoLen;
|
||||
UCHAR NewExtChannelOffset = 0xff;
|
||||
|
||||
@ -889,24 +832,10 @@ VOID PeerAssocRspAction(
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():ASSOC - receive ASSOC_RSP to me (status=%d)\n", Status));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspAction():MacTable [%d].AMsduSize = %d. ClientStatusFlags = 0x%lx \n",Elem->Wcid, pAd->MacTab.Content[BSSID_WCID].AMsduSize, pAd->MacTab.Content[BSSID_WCID].ClientStatusFlags));
|
||||
RTMPCancelTimer(&pAd->MlmeAux.AssocTimer, &TimerCancelled);
|
||||
|
||||
|
||||
if(Status == MLME_SUCCESS)
|
||||
{
|
||||
#ifdef RT2860
|
||||
// go to procedure listed on page 376
|
||||
AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen,
|
||||
&EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo);
|
||||
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
wext_notify_event_assoc(pAd);
|
||||
|
||||
memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
|
||||
memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
|
||||
wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
|
||||
|
||||
}
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
UCHAR MaxSupportedRateIn500Kbps = 0;
|
||||
UCHAR idx;
|
||||
|
||||
@ -926,23 +855,14 @@ VOID PeerAssocRspAction(
|
||||
AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen,
|
||||
&EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo);
|
||||
|
||||
StaAddMacTableEntry(pAd, &pAd->MacTab.Content[BSSID_WCID], MaxSupportedRateIn500Kbps, &HtCapability, HtCapabilityLen, CapabilityInfo);
|
||||
#endif
|
||||
pAd->StaCfg.CkipFlag = CkipFlag;
|
||||
if (CkipFlag & 0x18)
|
||||
{
|
||||
NdisZeroMemory(pAd->StaCfg.TxSEQ, 4);
|
||||
NdisZeroMemory(pAd->StaCfg.RxSEQ, 4);
|
||||
NdisZeroMemory(pAd->StaCfg.CKIPMIC, 4);
|
||||
pAd->StaCfg.GIV[0] = RandomByte(pAd);
|
||||
pAd->StaCfg.GIV[1] = RandomByte(pAd);
|
||||
pAd->StaCfg.GIV[2] = RandomByte(pAd);
|
||||
pAd->StaCfg.bCkipOn = TRUE;
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<CCX> pAd->StaCfg.CkipFlag = 0x%02x\n", pAd->StaCfg.CkipFlag));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
StaAddMacTableEntry(pAd,
|
||||
&pAd->MacTab.Content[BSSID_WCID],
|
||||
MaxSupportedRateIn500Kbps,
|
||||
&HtCapability,
|
||||
HtCapabilityLen,
|
||||
&AddHtInfo,
|
||||
AddHtInfoLen,
|
||||
CapabilityInfo);
|
||||
}
|
||||
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_ASSOC_CONF, 2, &Status);
|
||||
@ -998,25 +918,19 @@ VOID PeerReassocRspAction(
|
||||
AssocPostProc(pAd, Addr2, CapabilityInfo, Aid, SupRate, SupRateLen, ExtRate, ExtRateLen,
|
||||
&EdcaParm, &HtCapability, HtCapabilityLen, &AddHtInfo);
|
||||
|
||||
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
wext_notify_event_assoc(pAd);
|
||||
|
||||
memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
|
||||
memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
|
||||
wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
|
||||
|
||||
RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, &pAd->MlmeAux.Bssid[0], NULL, 0);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
{
|
||||
// CkipFlag is no use for reassociate
|
||||
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_REASSOC_CONF, 2, &Status);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ASSOC - PeerReassocRspAction() sanity check fail\n"));
|
||||
@ -1123,6 +1037,10 @@ VOID AssocPostProc(
|
||||
|
||||
pVIE = pAd->ScanTab.BssEntry[Idx].VarIEs;
|
||||
len = pAd->ScanTab.BssEntry[Idx].VarIELen;
|
||||
//KH need to check again
|
||||
// Don't allow to go to sleep mode if authmode is WPA-related.
|
||||
//This can make Authentication process more smoothly.
|
||||
RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_CAN_GO_SLEEP);
|
||||
|
||||
while (len > 0)
|
||||
{
|
||||
@ -1147,6 +1065,8 @@ VOID AssocPostProc(
|
||||
pVIE += (pEid->Len + 2);
|
||||
len -= (pEid->Len + 2);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
if (pAd->MacTab.Content[BSSID_WCID].RSNIE_Len == 0)
|
||||
@ -1190,19 +1110,12 @@ VOID PeerDisassocAction(
|
||||
RTMPSendWirelessEvent(pAd, IW_DISASSOC_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
|
||||
}
|
||||
|
||||
//
|
||||
// Get Current System time and Turn on AdjacentAPReport
|
||||
//
|
||||
NdisGetSystemUpTime(&pAd->StaCfg.CCXAdjacentAPLinkDownTime);
|
||||
pAd->StaCfg.CCXAdjacentAPReportFlag = TRUE;
|
||||
|
||||
LinkDown(pAd, TRUE);
|
||||
pAd->Mlme.AssocMachine.CurrState = ASSOC_IDLE;
|
||||
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
|
||||
wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
|
||||
}
|
||||
|
||||
RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
@ -1359,143 +1272,16 @@ VOID Cls3errAction(
|
||||
COPY_MAC_ADDR(pAd->StaCfg.DisassocSta, pAddr);
|
||||
}
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
Description:
|
||||
Switch between WEP and CKIP upon new association up.
|
||||
Parameters:
|
||||
|
||||
IRQL = DISPATCH_LEVEL
|
||||
|
||||
==========================================================================
|
||||
*/
|
||||
VOID SwitchBetweenWepAndCkip(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
int i;
|
||||
SHAREDKEY_MODE_STRUC csr1;
|
||||
|
||||
// if KP is required. change the CipherAlg in hardware shard key table from WEP
|
||||
// to CKIP. else remain as WEP
|
||||
if (pAd->StaCfg.bCkipOn && (pAd->StaCfg.CkipFlag & 0x10))
|
||||
{
|
||||
// modify hardware key table so that MAC use correct algorithm to decrypt RX
|
||||
RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE, &csr1.word);
|
||||
if (csr1.field.Bss0Key0CipherAlg == CIPHER_WEP64)
|
||||
csr1.field.Bss0Key0CipherAlg = CIPHER_CKIP64;
|
||||
else if (csr1.field.Bss0Key0CipherAlg == CIPHER_WEP128)
|
||||
csr1.field.Bss0Key0CipherAlg = CIPHER_CKIP128;
|
||||
|
||||
if (csr1.field.Bss0Key1CipherAlg == CIPHER_WEP64)
|
||||
csr1.field.Bss0Key1CipherAlg = CIPHER_CKIP64;
|
||||
else if (csr1.field.Bss0Key1CipherAlg == CIPHER_WEP128)
|
||||
csr1.field.Bss0Key1CipherAlg = CIPHER_CKIP128;
|
||||
|
||||
if (csr1.field.Bss0Key2CipherAlg == CIPHER_WEP64)
|
||||
csr1.field.Bss0Key2CipherAlg = CIPHER_CKIP64;
|
||||
else if (csr1.field.Bss0Key2CipherAlg == CIPHER_WEP128)
|
||||
csr1.field.Bss0Key2CipherAlg = CIPHER_CKIP128;
|
||||
|
||||
if (csr1.field.Bss0Key3CipherAlg == CIPHER_WEP64)
|
||||
csr1.field.Bss0Key3CipherAlg = CIPHER_CKIP64;
|
||||
else if (csr1.field.Bss0Key3CipherAlg == CIPHER_WEP128)
|
||||
csr1.field.Bss0Key3CipherAlg = CIPHER_CKIP128;
|
||||
RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE, csr1.word);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SwitchBetweenWepAndCkip: modify BSS0 cipher to %s\n", CipherName[csr1.field.Bss0Key0CipherAlg]));
|
||||
|
||||
// modify software key table so that driver can specify correct algorithm in TXD upon TX
|
||||
for (i=0; i<SHARE_KEY_NUM; i++)
|
||||
{
|
||||
if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_WEP64)
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_CKIP64;
|
||||
else if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_WEP128)
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_CKIP128;
|
||||
}
|
||||
}
|
||||
|
||||
// else if KP NOT inused. change the CipherAlg in hardware shard key table from CKIP
|
||||
// to WEP.
|
||||
else
|
||||
{
|
||||
// modify hardware key table so that MAC use correct algorithm to decrypt RX
|
||||
RTMP_IO_READ32(pAd, SHARED_KEY_MODE_BASE, &csr1.word);
|
||||
if (csr1.field.Bss0Key0CipherAlg == CIPHER_CKIP64)
|
||||
csr1.field.Bss0Key0CipherAlg = CIPHER_WEP64;
|
||||
else if (csr1.field.Bss0Key0CipherAlg == CIPHER_CKIP128)
|
||||
csr1.field.Bss0Key0CipherAlg = CIPHER_WEP128;
|
||||
|
||||
if (csr1.field.Bss0Key1CipherAlg == CIPHER_CKIP64)
|
||||
csr1.field.Bss0Key1CipherAlg = CIPHER_WEP64;
|
||||
else if (csr1.field.Bss0Key1CipherAlg == CIPHER_CKIP128)
|
||||
csr1.field.Bss0Key1CipherAlg = CIPHER_WEP128;
|
||||
|
||||
if (csr1.field.Bss0Key2CipherAlg == CIPHER_CKIP64)
|
||||
csr1.field.Bss0Key2CipherAlg = CIPHER_WEP64;
|
||||
else if (csr1.field.Bss0Key2CipherAlg == CIPHER_CKIP128)
|
||||
csr1.field.Bss0Key2CipherAlg = CIPHER_WEP128;
|
||||
|
||||
if (csr1.field.Bss0Key3CipherAlg == CIPHER_CKIP64)
|
||||
csr1.field.Bss0Key3CipherAlg = CIPHER_WEP64;
|
||||
else if (csr1.field.Bss0Key3CipherAlg == CIPHER_CKIP128)
|
||||
csr1.field.Bss0Key3CipherAlg = CIPHER_WEP128;
|
||||
|
||||
// modify software key table so that driver can specify correct algorithm in TXD upon TX
|
||||
for (i=0; i<SHARE_KEY_NUM; i++)
|
||||
{
|
||||
if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_CKIP64)
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_WEP64;
|
||||
else if (pAd->SharedKey[BSS0][i].CipherAlg == CIPHER_CKIP128)
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_WEP128;
|
||||
}
|
||||
|
||||
//
|
||||
// On WPA-NONE, must update CipherAlg.
|
||||
// Because the OID_802_11_WEP_STATUS was been set after OID_802_11_ADD_KEY
|
||||
// and CipherAlg will be CIPHER_NONE by Windows ZeroConfig.
|
||||
// So we need to update CipherAlg after connect.
|
||||
//
|
||||
if (pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPANone)
|
||||
{
|
||||
for (i = 0; i < SHARE_KEY_NUM; i++)
|
||||
{
|
||||
if (pAd->SharedKey[BSS0][i].KeyLen != 0)
|
||||
{
|
||||
if (pAd->StaCfg.WepStatus == Ndis802_11Encryption2Enabled)
|
||||
{
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_TKIP;
|
||||
}
|
||||
else if (pAd->StaCfg.WepStatus == Ndis802_11Encryption3Enabled)
|
||||
{
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_AES;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
pAd->SharedKey[BSS0][i].CipherAlg = CIPHER_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
csr1.field.Bss0Key0CipherAlg = pAd->SharedKey[BSS0][0].CipherAlg;
|
||||
csr1.field.Bss0Key1CipherAlg = pAd->SharedKey[BSS0][1].CipherAlg;
|
||||
csr1.field.Bss0Key2CipherAlg = pAd->SharedKey[BSS0][2].CipherAlg;
|
||||
csr1.field.Bss0Key3CipherAlg = pAd->SharedKey[BSS0][3].CipherAlg;
|
||||
}
|
||||
RTMP_IO_WRITE32(pAd, SHARED_KEY_MODE_BASE, csr1.word);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SwitchBetweenWepAndCkip: modify BSS0 cipher to %s\n", CipherName[csr1.field.Bss0Key0CipherAlg]));
|
||||
}
|
||||
}
|
||||
|
||||
int wext_notify_event_assoc(
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
char custom[IW_CUSTOM_MAX] = {0};
|
||||
|
||||
if (pAd->StaCfg.ReqVarIELen <= IW_CUSTOM_MAX)
|
||||
{
|
||||
wrqu.data.length = pAd->StaCfg.ReqVarIELen;
|
||||
memcpy(custom, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen);
|
||||
wireless_send_event(pAd->net_dev, IWEVASSOCREQIE, &wrqu, custom);
|
||||
NdisMoveMemory(custom, pAd->StaCfg.ReqVarIEs, pAd->StaCfg.ReqVarIELen);
|
||||
RtmpOSWrielessEventSend(pAd, IWEVASSOCREQIE, -1, NULL, custom, pAd->StaCfg.ReqVarIELen);
|
||||
}
|
||||
else
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("pAd->StaCfg.ReqVarIELen > MAX_CUSTOM_LEN\n"));
|
||||
@ -1504,13 +1290,15 @@ int wext_notify_event_assoc(
|
||||
|
||||
}
|
||||
|
||||
#ifdef RT2870
|
||||
|
||||
BOOLEAN StaAddMacTableEntry(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PMAC_TABLE_ENTRY pEntry,
|
||||
IN UCHAR MaxSupportedRateIn500Kbps,
|
||||
IN HT_CAPABILITY_IE *pHtCapability,
|
||||
IN UCHAR HtCapabilityLen,
|
||||
IN ADD_HT_INFO_IE *pAddHtInfo,
|
||||
IN UCHAR AddHtInfoLen,
|
||||
IN USHORT CapabilityInfo)
|
||||
{
|
||||
UCHAR MaxSupportedRate = RATE_11;
|
||||
@ -1586,6 +1374,7 @@ BOOLEAN StaAddMacTableEntry(
|
||||
CLIENT_STATUS_CLEAR_FLAG(pEntry, fCLIENT_STATUS_PIGGYBACK_CAPABLE);
|
||||
}
|
||||
|
||||
NdisZeroMemory(&pEntry->HTCapability, sizeof(pEntry->HTCapability));
|
||||
// If this Entry supports 802.11n, upgrade to HT rate.
|
||||
if ((HtCapabilityLen != 0) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
|
||||
{
|
||||
@ -1605,7 +1394,9 @@ BOOLEAN StaAddMacTableEntry(
|
||||
pAd->CommonCfg.AddHTInfo.AddHtInfo2.NonGfPresent = 1;
|
||||
}
|
||||
|
||||
if ((pHtCapability->HtCapInfo.ChannelWidth) && (pAd->CommonCfg.DesiredHtPhy.ChannelWidth))
|
||||
if ((pHtCapability->HtCapInfo.ChannelWidth) &&
|
||||
(pAd->CommonCfg.DesiredHtPhy.ChannelWidth) &&
|
||||
((pAd->StaCfg.BssType == BSS_INFRA) || ((pAd->StaCfg.BssType == BSS_ADHOC) && (pAddHtInfo->AddHtInfo.ExtChanOffset == pAd->CommonCfg.AddHTInfo.AddHtInfo.ExtChanOffset))))
|
||||
{
|
||||
pEntry->MaxHTPhyMode.field.BW= BW_40;
|
||||
pEntry->MaxHTPhyMode.field.ShortGI = ((pAd->CommonCfg.DesiredHtPhy.ShortGIfor40)&(pHtCapability->HtCapInfo.ShortGIfor40));
|
||||
@ -1677,14 +1468,13 @@ BOOLEAN StaAddMacTableEntry(
|
||||
CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_RDG_CAPABLE);
|
||||
if (pHtCapability->ExtHtCapInfo.MCSFeedback == 0x03)
|
||||
CLIENT_STATUS_SET_FLAG(pEntry, fCLIENT_STATUS_MCSFEEDBACK_CAPABLE);
|
||||
NdisMoveMemory(&pEntry->HTCapability, pHtCapability, HtCapabilityLen);
|
||||
}
|
||||
else
|
||||
{
|
||||
pAd->MacTab.fAnyStationIsLegacy = TRUE;
|
||||
}
|
||||
|
||||
NdisMoveMemory(&pEntry->HTCapability, pHtCapability, sizeof(HT_CAPABILITY_IE));
|
||||
|
||||
pEntry->HTPhyMode.word = pEntry->MaxHTPhyMode.word;
|
||||
pEntry->CurrTxRate = pEntry->MaxSupportedRate;
|
||||
|
||||
@ -1726,4 +1516,3 @@ BOOLEAN StaAddMacTableEntry(
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* RT2870 */
|
||||
|
@ -108,7 +108,7 @@ VOID AuthTimeout(
|
||||
|
||||
|
||||
MlmeEnqueue(pAd, AUTH_STATE_MACHINE, MT2_AUTH_TIMEOUT, 0, NULL);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
|
||||
@ -124,59 +124,12 @@ VOID MlmeAuthReqAction(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN MLME_QUEUE_ELEM *Elem)
|
||||
{
|
||||
UCHAR Addr[6];
|
||||
USHORT Alg, Seq, Status;
|
||||
ULONG Timeout;
|
||||
HEADER_802_11 AuthHdr;
|
||||
BOOLEAN TimerCancelled;
|
||||
NDIS_STATUS NStatus;
|
||||
PUCHAR pOutBuffer = NULL;
|
||||
ULONG FrameLen = 0;
|
||||
|
||||
// Block all authentication request durning WPA block period
|
||||
if (pAd->StaCfg.bBlockAssoc == TRUE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Block Auth request durning WPA block period!\n"));
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
|
||||
Status = MLME_STATE_MACHINE_REJECT;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
|
||||
}
|
||||
else if(MlmeAuthReqSanity(pAd, Elem->Msg, Elem->MsgLen, Addr, &Timeout, &Alg))
|
||||
{
|
||||
// reset timer
|
||||
RTMPCancelTimer(&pAd->MlmeAux.AuthTimer, &TimerCancelled);
|
||||
COPY_MAC_ADDR(pAd->MlmeAux.Bssid, Addr);
|
||||
pAd->MlmeAux.Alg = Alg;
|
||||
Seq = 1;
|
||||
Status = MLME_SUCCESS;
|
||||
|
||||
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
|
||||
if(NStatus != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AUTH - MlmeAuthReqAction(Alg:%d) allocate memory failed\n", Alg));
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
|
||||
Status = MLME_FAIL_NO_RESOURCE;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
|
||||
return;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("AUTH - Send AUTH request seq#1 (Alg=%d)...\n", Alg));
|
||||
MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr, pAd->MlmeAux.Bssid);
|
||||
MakeOutgoingFrame(pOutBuffer, &FrameLen,
|
||||
sizeof(HEADER_802_11),&AuthHdr,
|
||||
2, &Alg,
|
||||
2, &Seq,
|
||||
2, &Status,
|
||||
END_OF_ARGS);
|
||||
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
|
||||
RTMPSetTimer(&pAd->MlmeAux.AuthTimer, Timeout);
|
||||
if (AUTH_ReqSend(pAd, Elem, &pAd->MlmeAux.AuthTimer, "AUTH", 1, NULL, 0))
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_WAIT_SEQ2;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT_ERR(("AUTH - MlmeAuthReqAction() sanity check failed\n"));
|
||||
USHORT Status;
|
||||
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
|
||||
Status = MLME_INVALID_FORMAT;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
|
||||
@ -207,7 +160,7 @@ VOID PeerAuthRspAtSeq2Action(
|
||||
ULONG FrameLen = 0;
|
||||
USHORT Status2;
|
||||
|
||||
if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, ChlgText))
|
||||
if (PeerAuthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Alg, &Seq, &Status, (PCHAR)ChlgText))
|
||||
{
|
||||
if (MAC_ADDR_EQUAL(pAd->MlmeAux.Bssid, Addr2) && Seq == 2)
|
||||
{
|
||||
@ -217,8 +170,7 @@ VOID PeerAuthRspAtSeq2Action(
|
||||
if (Status == MLME_SUCCESS)
|
||||
{
|
||||
// Authentication Mode "LEAP" has allow for CCX 1.X
|
||||
if ((pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen)
|
||||
)
|
||||
if (pAd->MlmeAux.Alg == Ndis802_11AuthModeOpen)
|
||||
{
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
|
||||
@ -457,4 +409,82 @@ VOID Cls2errAction(
|
||||
COPY_MAC_ADDR(pAd->StaCfg.DeauthSta, pAddr);
|
||||
}
|
||||
|
||||
BOOLEAN AUTH_ReqSend(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN PMLME_QUEUE_ELEM pElem,
|
||||
IN PRALINK_TIMER_STRUCT pAuthTimer,
|
||||
IN PSTRING pSMName,
|
||||
IN USHORT SeqNo,
|
||||
IN PUCHAR pNewElement,
|
||||
IN ULONG ElementLen)
|
||||
{
|
||||
USHORT Alg, Seq, Status;
|
||||
UCHAR Addr[6];
|
||||
ULONG Timeout;
|
||||
HEADER_802_11 AuthHdr;
|
||||
BOOLEAN TimerCancelled;
|
||||
NDIS_STATUS NStatus;
|
||||
PUCHAR pOutBuffer = NULL;
|
||||
ULONG FrameLen = 0, tmp = 0;
|
||||
|
||||
// Block all authentication request durning WPA block period
|
||||
if (pAd->StaCfg.bBlockAssoc == TRUE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s - Block Auth request durning WPA block period!\n", pSMName));
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
|
||||
Status = MLME_STATE_MACHINE_REJECT;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
|
||||
}
|
||||
else if(MlmeAuthReqSanity(pAd, pElem->Msg, pElem->MsgLen, Addr, &Timeout, &Alg))
|
||||
{
|
||||
/* reset timer */
|
||||
RTMPCancelTimer(pAuthTimer, &TimerCancelled);
|
||||
|
||||
COPY_MAC_ADDR(pAd->MlmeAux.Bssid, Addr);
|
||||
pAd->MlmeAux.Alg = Alg;
|
||||
Seq = SeqNo;
|
||||
Status = MLME_SUCCESS;
|
||||
|
||||
NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory
|
||||
if(NStatus != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s - MlmeAuthReqAction(Alg:%d) allocate memory failed\n", pSMName, Alg));
|
||||
pAd->Mlme.AuthMachine.CurrState = AUTH_REQ_IDLE;
|
||||
Status = MLME_FAIL_NO_RESOURCE;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_AUTH_CONF, 2, &Status);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("%s - Send AUTH request seq#1 (Alg=%d)...\n", pSMName, Alg));
|
||||
MgtMacHeaderInit(pAd, &AuthHdr, SUBTYPE_AUTH, 0, Addr, pAd->MlmeAux.Bssid);
|
||||
MakeOutgoingFrame(pOutBuffer, &FrameLen,
|
||||
sizeof(HEADER_802_11),&AuthHdr,
|
||||
2, &Alg,
|
||||
2, &Seq,
|
||||
2, &Status,
|
||||
END_OF_ARGS);
|
||||
|
||||
if (pNewElement && ElementLen)
|
||||
{
|
||||
MakeOutgoingFrame(pOutBuffer+FrameLen, &tmp,
|
||||
ElementLen, pNewElement,
|
||||
END_OF_ARGS);
|
||||
FrameLen += tmp;
|
||||
}
|
||||
|
||||
MiniportMMRequest(pAd, 0, pOutBuffer, FrameLen);
|
||||
MlmeFreeMemory(pAd, pOutBuffer);
|
||||
|
||||
RTMPSetTimer(pAuthTimer, Timeout);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT_ERR(("%s - MlmeAuthReqAction() sanity check failed\n", pSMName));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
@ -123,20 +123,24 @@ VOID PeerDeauthAction(
|
||||
|
||||
if (PeerDeauthSanity(pAd, Elem->Msg, Elem->MsgLen, Addr2, &Reason))
|
||||
{
|
||||
if (INFRA_ON(pAd) && MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid))
|
||||
if (INFRA_ON(pAd)
|
||||
&& MAC_ADDR_EQUAL(Addr2, pAd->CommonCfg.Bssid)
|
||||
)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("AUTH_RSP - receive DE-AUTH from our AP (Reason=%d)\n", Reason));
|
||||
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
|
||||
wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
|
||||
}
|
||||
|
||||
RtmpOSWrielessEventSend(pAd, SIOCGIWAP, -1, NULL, NULL, 0);
|
||||
|
||||
|
||||
// send wireless event - for deauthentication
|
||||
if (pAd->CommonCfg.bWirelessEvent)
|
||||
RTMPSendWirelessEvent(pAd, IW_DEAUTH_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
|
||||
|
||||
if ((pAd->StaCfg.WpaSupplicantUP != WPA_SUPPLICANT_DISABLE) &&
|
||||
(pAd->StaCfg.AuthMode == Ndis802_11AuthModeWPA2))
|
||||
pAd->StaCfg.bLostAp = TRUE;
|
||||
|
||||
LinkDown(pAd, TRUE);
|
||||
}
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -33,8 +33,6 @@
|
||||
Revision History:
|
||||
Who When What
|
||||
-------- ---------- ----------------------------------------------
|
||||
John Aug/17/04 major modification for RT2561/2661
|
||||
Jan Lee Mar/17/06 major modification for RT2860 New Ring Design
|
||||
*/
|
||||
#include "../rt_config.h"
|
||||
|
||||
@ -64,6 +62,7 @@ VOID STARxEAPOLFrameIndicate(
|
||||
int idx = 0;
|
||||
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("Receive EAP-SUCCESS Packet\n"));
|
||||
//pAd->StaCfg.PortSecured = WPA_802_1X_PORT_SECURED;
|
||||
STA_PORT_SECURED(pAd);
|
||||
|
||||
if (pAd->StaCfg.IEEE8021x_required_keys == FALSE)
|
||||
@ -74,7 +73,7 @@ VOID STARxEAPOLFrameIndicate(
|
||||
|
||||
if (pAd->StaCfg.DesireSharedKey[idx].KeyLen > 0)
|
||||
{
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
MAC_TABLE_ENTRY *pEntry = &pAd->MacTab.Content[BSSID_WCID];
|
||||
|
||||
// Set key material and cipherAlg to Asic
|
||||
@ -88,8 +87,8 @@ VOID STARxEAPOLFrameIndicate(
|
||||
|
||||
pAd->IndicateMediaState = NdisMediaStateConnected;
|
||||
pAd->ExtraInfo = GENERAL_LINK_UP;
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
#endif // RTMP_MAC_PCI //
|
||||
#ifdef RTMP_MAC_USB
|
||||
union
|
||||
{
|
||||
char buf[sizeof(NDIS_802_11_WEP)+MAX_LEN_OF_KEY- 1];
|
||||
@ -113,7 +112,7 @@ VOID STARxEAPOLFrameIndicate(
|
||||
pAd->ExtraInfo = GENERAL_LINK_UP;
|
||||
// need to enqueue cmd to thread
|
||||
RTUSBEnqueueCmdFromNdis(pAd, OID_802_11_ADD_WEP, TRUE, &WepKey, sizeof(WepKey.keyinfo) + len - 1);
|
||||
#endif // RT2870 //
|
||||
#endif // RTMP_MAC_USB //
|
||||
// For Preventing ShardKey Table is cleared by remove key procedure.
|
||||
pAd->SharedKey[BSS0][idx].CipherAlg = CipherAlg;
|
||||
pAd->SharedKey[BSS0][idx].KeyLen = pAd->StaCfg.DesireSharedKey[idx].KeyLen;
|
||||
@ -156,6 +155,7 @@ VOID STARxDataFrameAnnounce(
|
||||
// non-EAP frame
|
||||
if (!RTMPCheckWPAframe(pAd, pEntry, pRxBlk->pData, pRxBlk->DataSize, FromWhichBSSID))
|
||||
{
|
||||
|
||||
{
|
||||
// drop all non-EAP DATA frame before
|
||||
// this client's Port-Access-Control is secured
|
||||
@ -309,13 +309,13 @@ VOID STAHandleRxDataFrame(
|
||||
if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable && (pHeader->FC.SubType & 0x08))
|
||||
{
|
||||
UCHAR *pData;
|
||||
DBGPRINT(RT_DEBUG_TRACE,("bAPSDCapable\n"));
|
||||
DBGPRINT(RT_DEBUG_INFO,("bAPSDCapable\n"));
|
||||
|
||||
// Qos bit 4
|
||||
pData = (PUCHAR)pHeader + LENGTH_802_11;
|
||||
if ((*pData >> 4) & 0x01)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE,("RxDone- Rcv EOSP frame, driver may fall into sleep\n"));
|
||||
DBGPRINT(RT_DEBUG_INFO,("RxDone- Rcv EOSP frame, driver may fall into sleep\n"));
|
||||
pAd->CommonCfg.bInServicePeriod = FALSE;
|
||||
|
||||
// Force driver to fall into sleep mode when rcv EOSP frame
|
||||
@ -332,7 +332,7 @@ VOID STAHandleRxDataFrame(
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM) && (TbttNumToNextWakeUp > NextDtim))
|
||||
TbttNumToNextWakeUp = NextDtim;
|
||||
|
||||
MlmeSetPsmBit(pAd, PWR_SAVE);
|
||||
RTMP_SET_PSM_BIT(pAd, PWR_SAVE);
|
||||
// if WMM-APSD is failed, try to disable following line
|
||||
AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
|
||||
}
|
||||
@ -442,6 +442,23 @@ VOID STAHandleRxDataFrame(
|
||||
}
|
||||
pRxBlk->UserPriority = UserPriority;
|
||||
|
||||
/* check if need to resend PS Poll when received packet with MoreData = 1 */
|
||||
if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1))
|
||||
{
|
||||
if ((((UserPriority == 0) || (UserPriority == 3)) &&
|
||||
pAd->CommonCfg.bAPSDAC_BE == 0) ||
|
||||
(((UserPriority == 1) || (UserPriority == 2)) &&
|
||||
pAd->CommonCfg.bAPSDAC_BK == 0) ||
|
||||
(((UserPriority == 4) || (UserPriority == 5)) &&
|
||||
pAd->CommonCfg.bAPSDAC_VI == 0) ||
|
||||
(((UserPriority == 6) || (UserPriority == 7)) &&
|
||||
pAd->CommonCfg.bAPSDAC_VO == 0))
|
||||
{
|
||||
/* non-UAPSD delivery-enabled AC */
|
||||
RTMP_PS_POLL_ENQUEUE(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
// 3. Order bit: A-Ralink or HTC+
|
||||
if (pHeader->FC.Order)
|
||||
{
|
||||
@ -451,7 +468,7 @@ VOID STAHandleRxDataFrame(
|
||||
RX_BLK_SET_FLAG(pRxBlk, fRX_ARALINK);
|
||||
}
|
||||
else
|
||||
#endif
|
||||
#endif // AGGREGATION_SUPPORT //
|
||||
{
|
||||
RX_BLK_SET_FLAG(pRxBlk, fRX_HTC);
|
||||
// skip HTC contorl field
|
||||
@ -574,27 +591,31 @@ VOID STAHandleRxMgmtFrame(
|
||||
do
|
||||
{
|
||||
|
||||
|
||||
/* check if need to resend PS Poll when received packet with MoreData = 1 */
|
||||
if ((pAd->StaCfg.Psm == PWR_SAVE) && (pHeader->FC.MoreData == 1))
|
||||
{
|
||||
/* for UAPSD, all management frames will be VO priority */
|
||||
if (pAd->CommonCfg.bAPSDAC_VO == 0)
|
||||
{
|
||||
/* non-UAPSD delivery-enabled AC */
|
||||
RTMP_PS_POLL_ENQUEUE(pAd);
|
||||
}
|
||||
}
|
||||
|
||||
/* TODO: if MoreData == 0, station can go to sleep */
|
||||
|
||||
|
||||
// We should collect RSSI not only U2M data but also my beacon
|
||||
if (pAd->RxAnt.EvaluatePeriod == 0 &&
|
||||
pHeader->FC.SubType == SUBTYPE_BEACON &&
|
||||
MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2)) {
|
||||
if ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))
|
||||
&& (pAd->RxAnt.EvaluatePeriod == 0))
|
||||
{
|
||||
Update_Rssi_Sample(pAd, &pAd->StaCfg.RssiSample, pRxWI);
|
||||
|
||||
pAd->StaCfg.LastSNR0 = (UCHAR)(pRxWI->SNR0);
|
||||
pAd->StaCfg.LastSNR1 = (UCHAR)(pRxWI->SNR1);
|
||||
}
|
||||
|
||||
#ifdef RT2870
|
||||
// collect rssi information for antenna diversity
|
||||
if (pAd->NicConfig2.field.AntDiversity)
|
||||
{
|
||||
if ((pRxD->U2M) || ((pHeader->FC.SubType == SUBTYPE_BEACON) && (MAC_ADDR_EQUAL(&pAd->CommonCfg.Bssid, &pHeader->Addr2))))
|
||||
{
|
||||
COLLECT_RX_ANTENNA_AVERAGE_RSSI(pAd, ConvertToRssi(pAd, (UCHAR)pRxWI->RSSI0, RSSI_0), 0); //Note: RSSI2 not used on RT73
|
||||
pAd->StaCfg.NumOfAvgRssiSample ++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
// First check the size, it MUST not exceed the mlme queue size
|
||||
if (pRxWI->MPDUtotalByteCount > MGMT_DMA_BUFFER_SIZE)
|
||||
@ -683,14 +704,14 @@ BOOLEAN STARxDoneInterruptHandle(
|
||||
break;
|
||||
}
|
||||
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if (RxProcessed++ > MAX_RX_PROCESS_CNT)
|
||||
{
|
||||
// need to reschedule rx handle
|
||||
bReschedule = TRUE;
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
RxProcessed ++; // test
|
||||
|
||||
@ -725,6 +746,7 @@ BOOLEAN STARxDoneInterruptHandle(
|
||||
|
||||
// Increase Total receive byte counter after real data received no mater any error or not
|
||||
pAd->RalinkCounters.ReceivedByteCount += pRxWI->MPDUtotalByteCount;
|
||||
pAd->RalinkCounters.OneSecReceivedByteCount += pRxWI->MPDUtotalByteCount;
|
||||
pAd->RalinkCounters.RxCount ++;
|
||||
|
||||
INC_COUNTER64(pAd->WlanCounters.ReceivedFragmentCount);
|
||||
@ -737,7 +759,8 @@ BOOLEAN STARxDoneInterruptHandle(
|
||||
send_monitor_packets(pAd, &RxCell);
|
||||
break;
|
||||
}
|
||||
/* RT2870 invokes STARxDoneInterruptHandle() in rtusb_bulk.c */
|
||||
|
||||
/* STARxDoneInterruptHandle() is called in rtusb_bulk.c */
|
||||
|
||||
// Check for all RxD errors
|
||||
Status = RTMPCheckRxError(pAd, pHeader, pRxWI, pRxD);
|
||||
@ -780,15 +803,6 @@ BOOLEAN STARxDoneInterruptHandle(
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef RT2860
|
||||
// fRTMP_PS_GO_TO_SLEEP_NOW is set if receiving beacon.
|
||||
if (RTMP_TEST_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW) && (INFRA_ON(pAd)))
|
||||
{
|
||||
RTMP_CLEAR_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
|
||||
AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp);
|
||||
bReschedule = FALSE;
|
||||
}
|
||||
#endif
|
||||
return bReschedule;
|
||||
}
|
||||
|
||||
@ -806,12 +820,7 @@ BOOLEAN STARxDoneInterruptHandle(
|
||||
VOID RTMPHandleTwakeupInterrupt(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
#ifdef RT2860
|
||||
AsicForceWakeup(pAd, DOT11POWERSAVE);
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
AsicForceWakeup(pAd, FALSE);
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
@ -914,6 +923,7 @@ NDIS_STATUS STASendPacket(
|
||||
UINT SrcBufLen;
|
||||
UINT AllowFragSize;
|
||||
UCHAR NumberOfFrag;
|
||||
UCHAR RTSRequired;
|
||||
UCHAR QueIdx, UserPriority;
|
||||
MAC_TABLE_ENTRY *pEntry = NULL;
|
||||
unsigned int IrqFlags;
|
||||
@ -1052,7 +1062,14 @@ NDIS_STATUS STASendPacket(
|
||||
// If multiple fragment required, RTS is required only for the first fragment
|
||||
// if the fragment size large than RTS threshold
|
||||
// For RT28xx, Let ASIC send RTS/CTS
|
||||
RTMP_SET_PACKET_RTS(pPacket, 0);
|
||||
// RTMP_SET_PACKET_RTS(pPacket, 0);
|
||||
if (NumberOfFrag > 1)
|
||||
RTSRequired = (pAd->CommonCfg.FragmentThreshold > pAd->CommonCfg.RtsThreshold) ? 1 : 0;
|
||||
else
|
||||
RTSRequired = (PacketInfo.TotalPacketLength > pAd->CommonCfg.RtsThreshold) ? 1 : 0;
|
||||
|
||||
// Save RTS requirement to Ndis packet reserved field
|
||||
RTMP_SET_PACKET_RTS(pPacket, RTSRequired);
|
||||
RTMP_SET_PACKET_TXRATE(pPacket, pAd->CommonCfg.TxRate);
|
||||
|
||||
//
|
||||
@ -1060,13 +1077,8 @@ NDIS_STATUS STASendPacket(
|
||||
//
|
||||
UserPriority = 0;
|
||||
QueIdx = QID_AC_BE;
|
||||
#ifdef RT2860
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED))
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) &&
|
||||
CLIENT_STATUS_TEST_FLAG(pEntry, fCLIENT_STATUS_WMM_CAPABLE))
|
||||
#endif
|
||||
{
|
||||
USHORT Protocol;
|
||||
UCHAR LlcSnapLen = 0, Byte0, Byte1;
|
||||
@ -1102,6 +1114,11 @@ NDIS_STATUS STASendPacket(
|
||||
|
||||
// TODO: have to check ACM bit. apply TSPEC if ACM is ON
|
||||
// TODO: downgrade UP & QueIdx before passing ACM
|
||||
/*
|
||||
Under WMM ACM control, we dont need to check the bit;
|
||||
Or when a TSPEC is built for VO but we will change to issue
|
||||
BA session for BE here, so we will not use BA to send VO packets.
|
||||
*/
|
||||
if (pAd->CommonCfg.APEdcaParm.bACM[QueIdx])
|
||||
{
|
||||
UserPriority = 0;
|
||||
@ -1125,18 +1142,14 @@ NDIS_STATUS STASendPacket(
|
||||
}
|
||||
else
|
||||
{
|
||||
InsertTailQueue(&pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket));
|
||||
InsertTailQueueAc(pAd, pEntry, &pAd->TxSwQueue[QueIdx], PACKET_TO_QUEUE_ENTRY(pPacket));
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags);
|
||||
|
||||
if ((pAd->CommonCfg.BACapability.field.AutoBA == TRUE)&&
|
||||
#ifdef RT2860
|
||||
(pAd->StaActive.SupportedPhyInfo.bHtEnable == TRUE))
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
IS_HT_STA(pEntry))
|
||||
#endif
|
||||
{
|
||||
//PMAC_TABLE_ENTRY pMacEntry = &pAd->MacTab.Content[BSSID_WCID];
|
||||
if (((pEntry->TXBAbitmap & (1<<UserPriority)) == 0) &&
|
||||
((pEntry->BADeclineBitmap & (1<<UserPriority)) == 0) &&
|
||||
(pEntry->PortSecured == WPA_802_1X_PORT_SECURED)
|
||||
@ -1145,10 +1158,10 @@ NDIS_STATUS STASendPacket(
|
||||
// 2. It is OPEN or AES mode,
|
||||
// then BA session can be bulit.
|
||||
&& ((pEntry->ValidAsCLI && pAd->MlmeAux.APRalinkIe != 0x0) ||
|
||||
(pEntry->WepStatus == Ndis802_11WEPDisabled || pEntry->WepStatus == Ndis802_11Encryption3Enabled))
|
||||
(pEntry->WepStatus != Ndis802_11WEPEnabled && pEntry->WepStatus != Ndis802_11Encryption2Enabled))
|
||||
)
|
||||
{
|
||||
BAOriSessionSetUp(pAd, pEntry, 0, 0, 10, FALSE);
|
||||
BAOriSessionSetUp(pAd, pEntry, UserPriority, 0, 10, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1179,27 +1192,15 @@ NDIS_STATUS STASendPacket(
|
||||
|
||||
========================================================================
|
||||
*/
|
||||
|
||||
#ifdef RT2870
|
||||
/*
|
||||
Actually, this function used to check if the TxHardware Queue still has frame need to send.
|
||||
If no frame need to send, go to sleep, else, still wake up.
|
||||
*/
|
||||
#endif
|
||||
#ifdef RTMP_MAC_PCI
|
||||
NDIS_STATUS RTMPFreeTXDRequest(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR QueIdx,
|
||||
IN UCHAR NumberRequired,
|
||||
IN PUCHAR FreeNumberIs)
|
||||
{
|
||||
#ifdef RT2860
|
||||
ULONG FreeNumber = 0;
|
||||
#endif
|
||||
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
|
||||
#ifdef RT2870
|
||||
unsigned long IrqFlags;
|
||||
HT_TX_CONTEXT *pHTTXContext;
|
||||
#endif
|
||||
|
||||
switch (QueIdx)
|
||||
{
|
||||
@ -1208,7 +1209,6 @@ NDIS_STATUS RTMPFreeTXDRequest(
|
||||
case QID_AC_VI:
|
||||
case QID_AC_VO:
|
||||
case QID_HCCA:
|
||||
#ifdef RT2860
|
||||
if (pAd->TxRing[QueIdx].TxSwFreeIdx > pAd->TxRing[QueIdx].TxCpuIdx)
|
||||
FreeNumber = pAd->TxRing[QueIdx].TxSwFreeIdx - pAd->TxRing[QueIdx].TxCpuIdx - 1;
|
||||
else
|
||||
@ -1216,8 +1216,49 @@ NDIS_STATUS RTMPFreeTXDRequest(
|
||||
|
||||
if (FreeNumber >= NumberRequired)
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
break;
|
||||
|
||||
case QID_MGMT:
|
||||
if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx)
|
||||
FreeNumber = pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx - 1;
|
||||
else
|
||||
FreeNumber = pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - pAd->MgmtRing.TxCpuIdx - 1;
|
||||
|
||||
if (FreeNumber >= NumberRequired)
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx));
|
||||
break;
|
||||
}
|
||||
*FreeNumberIs = (UCHAR)FreeNumber;
|
||||
|
||||
return (Status);
|
||||
}
|
||||
#endif // RTMP_MAC_PCI //
|
||||
#ifdef RTMP_MAC_USB
|
||||
/*
|
||||
Actually, this function used to check if the TxHardware Queue still has frame need to send.
|
||||
If no frame need to send, go to sleep, else, still wake up.
|
||||
*/
|
||||
NDIS_STATUS RTMPFreeTXDRequest(
|
||||
IN PRTMP_ADAPTER pAd,
|
||||
IN UCHAR QueIdx,
|
||||
IN UCHAR NumberRequired,
|
||||
IN PUCHAR FreeNumberIs)
|
||||
{
|
||||
//ULONG FreeNumber = 0;
|
||||
NDIS_STATUS Status = NDIS_STATUS_FAILURE;
|
||||
unsigned long IrqFlags;
|
||||
HT_TX_CONTEXT *pHTTXContext;
|
||||
|
||||
switch (QueIdx)
|
||||
{
|
||||
case QID_AC_BK:
|
||||
case QID_AC_BE:
|
||||
case QID_AC_VI:
|
||||
case QID_AC_VO:
|
||||
{
|
||||
pHTTXContext = &pAd->TxContext[QueIdx];
|
||||
RTMP_IRQ_LOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
|
||||
@ -1232,39 +1273,21 @@ NDIS_STATUS RTMPFreeTXDRequest(
|
||||
}
|
||||
RTMP_IRQ_UNLOCK(&pAd->TxContextQueueLock[QueIdx], IrqFlags);
|
||||
}
|
||||
#endif
|
||||
break;
|
||||
|
||||
case QID_MGMT:
|
||||
#ifdef RT2860
|
||||
if (pAd->MgmtRing.TxSwFreeIdx > pAd->MgmtRing.TxCpuIdx)
|
||||
FreeNumber = pAd->MgmtRing.TxSwFreeIdx - pAd->MgmtRing.TxCpuIdx - 1;
|
||||
else
|
||||
FreeNumber = pAd->MgmtRing.TxSwFreeIdx + MGMT_RING_SIZE - pAd->MgmtRing.TxCpuIdx - 1;
|
||||
|
||||
if (FreeNumber >= NumberRequired)
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
if (pAd->MgmtRing.TxSwFreeIdx != MGMT_RING_SIZE)
|
||||
Status = NDIS_STATUS_FAILURE;
|
||||
else
|
||||
Status = NDIS_STATUS_SUCCESS;
|
||||
#endif
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_ERROR,("RTMPFreeTXDRequest::Invalid QueIdx(=%d)\n", QueIdx));
|
||||
break;
|
||||
}
|
||||
#ifdef RT2860
|
||||
*FreeNumberIs = (UCHAR)FreeNumber;
|
||||
#endif
|
||||
|
||||
return (Status);
|
||||
}
|
||||
|
||||
|
||||
#endif // RTMP_MAC_USB //
|
||||
|
||||
VOID RTMPSendDisassociationFrame(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
@ -1527,6 +1550,9 @@ VOID STABuildCache802_11Header(
|
||||
pMacEntry->TxSeq[pTxBlk->UserPriority] = (pMacEntry->TxSeq[pTxBlk->UserPriority]+1) & MAXSEQ;
|
||||
|
||||
{
|
||||
// Check if the frame can be sent through DLS direct link interface
|
||||
// If packet can be sent through DLS, then force aggregation disable. (Hard to determine peer STA's capability)
|
||||
|
||||
// The addr3 of normal packet send from DS is Dest Mac address.
|
||||
if (ADHOC_ON(pAd))
|
||||
COPY_MAC_ADDR(pHeader80211->Addr3, pAd->CommonCfg.Bssid);
|
||||
@ -1580,13 +1606,13 @@ static inline PUCHAR STA_Build_ARalink_Frame_Header(
|
||||
|
||||
// padding at front of LLC header. LLC header should at 4-bytes aligment.
|
||||
pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;
|
||||
pHeaderBufPtr = (PCHAR)ROUND_UP(pHeaderBufPtr, 4);
|
||||
pHeaderBufPtr = (PUCHAR)ROUND_UP(pHeaderBufPtr, 4);
|
||||
pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
|
||||
|
||||
// For RA Aggregation,
|
||||
// put the 2nd MSDU length(extra 2-byte field) after QOS_CONTROL in little endian format
|
||||
pQEntry = pTxBlk->TxPacketList.Head;
|
||||
pNextPacket = QUEUE_ENTRY_TO_PKT(pQEntry);
|
||||
pNextPacket = QUEUE_ENTRY_TO_PACKET(pQEntry);
|
||||
nextBufLen = GET_OS_PKT_LEN(pNextPacket);
|
||||
if (RTMP_GET_PACKET_VLAN(pNextPacket))
|
||||
nextBufLen -= LENGTH_802_1Q;
|
||||
@ -1641,7 +1667,7 @@ static inline PUCHAR STA_Build_AMSDU_Frame_Header(
|
||||
// @@@ MpduHeaderLen excluding padding @@@
|
||||
//
|
||||
pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;
|
||||
pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
|
||||
|
||||
return pHeaderBufPtr;
|
||||
@ -1743,7 +1769,7 @@ VOID STA_AMPDU_Frame_Tx(
|
||||
// @@@ MpduHeaderLen excluding padding @@@
|
||||
//
|
||||
pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;
|
||||
pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
|
||||
|
||||
{
|
||||
@ -1790,9 +1816,7 @@ VOID STA_AMPDU_Frame_Tx(
|
||||
//
|
||||
// Kick out Tx
|
||||
//
|
||||
#ifdef RT2860
|
||||
if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
|
||||
#endif
|
||||
HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
|
||||
|
||||
pAd->RalinkCounters.KickTxCount++;
|
||||
@ -1923,9 +1947,7 @@ VOID STA_AMSDU_Frame_Tx(
|
||||
//
|
||||
// Kick out Tx
|
||||
//
|
||||
#ifdef RT2860
|
||||
if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
|
||||
#endif
|
||||
HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
|
||||
}
|
||||
|
||||
@ -1991,7 +2013,7 @@ VOID STA_Legacy_Frame_Tx(
|
||||
//
|
||||
// build QOS Control bytes
|
||||
//
|
||||
*pHeaderBufPtr = (pTxBlk->UserPriority & 0x0F);
|
||||
*(pHeaderBufPtr) = ((pTxBlk->UserPriority & 0x0F) | (pAd->CommonCfg.AckPolicy[pTxBlk->QueIdx]<<5));
|
||||
*(pHeaderBufPtr+1) = 0;
|
||||
pHeaderBufPtr +=2;
|
||||
pTxBlk->MpduHeaderLen += 2;
|
||||
@ -1999,7 +2021,7 @@ VOID STA_Legacy_Frame_Tx(
|
||||
|
||||
// The remaining content of MPDU header should locate at 4-octets aligment
|
||||
pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;
|
||||
pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
|
||||
|
||||
{
|
||||
@ -2045,9 +2067,7 @@ VOID STA_Legacy_Frame_Tx(
|
||||
//
|
||||
// Kick out Tx
|
||||
//
|
||||
#ifdef RT2860
|
||||
if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
|
||||
#endif
|
||||
HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
|
||||
}
|
||||
|
||||
@ -2158,9 +2178,7 @@ VOID STA_ARalink_Frame_Tx(
|
||||
//
|
||||
// Kick out Tx
|
||||
//
|
||||
#ifdef RT2860
|
||||
if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
|
||||
#endif
|
||||
HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
|
||||
|
||||
}
|
||||
@ -2181,6 +2199,7 @@ VOID STA_Fragment_Frame_Tx(
|
||||
UINT NextMpduSize;
|
||||
BOOLEAN bVLANPkt;
|
||||
PQUEUE_ENTRY pQEntry;
|
||||
HTTRANSMIT_SETTING *pTransmit;
|
||||
|
||||
|
||||
ASSERT(pTxBlk);
|
||||
@ -2243,7 +2262,7 @@ VOID STA_Fragment_Frame_Tx(
|
||||
// LLC header should locate at 4-octets aligment
|
||||
//
|
||||
pTxBlk->HdrPadLen = (ULONG)pHeaderBufPtr;
|
||||
pHeaderBufPtr = (PCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pHeaderBufPtr = (PUCHAR) ROUND_UP(pHeaderBufPtr, 4);
|
||||
pTxBlk->HdrPadLen = (ULONG)(pHeaderBufPtr - pTxBlk->HdrPadLen);
|
||||
|
||||
|
||||
@ -2276,6 +2295,7 @@ VOID STA_Fragment_Frame_Tx(
|
||||
// MAC ASIC will only perform IV/EIV/ICV insertion but no TKIP MIC
|
||||
if (pTxBlk->CipherAlg == CIPHER_TKIP)
|
||||
{
|
||||
RTMPCalculateMICValue(pAd, pTxBlk->pPacket, pTxBlk->pExtraLlcSnapEncap, pTxBlk->pKey, 0);
|
||||
|
||||
// NOTE: DON'T refer the skb->len directly after following copy. Becasue the length is not adjust
|
||||
// to correct lenght, refer to pTxBlk->SrcBufLen for the packet length in following progress.
|
||||
@ -2301,8 +2321,20 @@ VOID STA_Fragment_Frame_Tx(
|
||||
else
|
||||
EncryptionOverhead = 0;
|
||||
|
||||
pTransmit = pTxBlk->pTransmit;
|
||||
// Decide the TX rate
|
||||
if (pTransmit->field.MODE == MODE_CCK)
|
||||
pTxBlk->TxRate = pTransmit->field.MCS;
|
||||
else if (pTransmit->field.MODE == MODE_OFDM)
|
||||
pTxBlk->TxRate = pTransmit->field.MCS + RATE_FIRST_OFDM_RATE;
|
||||
else
|
||||
pTxBlk->TxRate = RATE_6_5;
|
||||
|
||||
// decide how much time an ACK/CTS frame will consume in the air
|
||||
if (pTxBlk->TxRate <= RATE_LAST_OFDM_RATE)
|
||||
AckDuration = RTMPCalcDuration(pAd, pAd->CommonCfg.ExpectedACKRate[pTxBlk->TxRate], 14);
|
||||
else
|
||||
AckDuration = RTMPCalcDuration(pAd, RATE_6_5, 14);
|
||||
|
||||
// Init the total payload length of this frame.
|
||||
SrcRemainingBytes = pTxBlk->SrcBufLen;
|
||||
@ -2365,6 +2397,7 @@ VOID STA_Fragment_Frame_Tx(
|
||||
//
|
||||
// Kick out Tx
|
||||
//
|
||||
if (!RTMP_TEST_PSFLAG(pAd, fRTMP_PS_DISABLE_TX))
|
||||
HAL_KickOutTx(pAd, pTxBlk, pTxBlk->QueIdx);
|
||||
}
|
||||
|
||||
@ -2428,13 +2461,13 @@ NDIS_STATUS STAHardTransmit(
|
||||
// not to change PSM bit, just send this frame out?
|
||||
if ((pAd->StaCfg.Psm == PWR_SAVE) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
|
||||
{
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("AsicForceWakeup At HardTx\n"));
|
||||
#ifdef RT2860
|
||||
AsicForceWakeup(pAd, FROM_TX);
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
DBGPRINT_RAW(RT_DEBUG_INFO, ("AsicForceWakeup At HardTx\n"));
|
||||
#ifdef RTMP_MAC_PCI
|
||||
AsicForceWakeup(pAd, TRUE);
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
#ifdef RTMP_MAC_USB
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_FORCE_WAKE_UP, NULL, 0);
|
||||
#endif // RTMP_MAC_USB //
|
||||
}
|
||||
|
||||
// It should not change PSM bit, when APSD turn on.
|
||||
@ -2444,7 +2477,7 @@ NDIS_STATUS STAHardTransmit(
|
||||
{
|
||||
if ((pAd->StaCfg.Psm == PWR_SAVE) &&
|
||||
(pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeFast_PSP))
|
||||
MlmeSetPsmBit(pAd, PWR_ACTIVE);
|
||||
RTMP_SET_PSM_BIT(pAd, PWR_ACTIVE);
|
||||
}
|
||||
|
||||
switch (pTxBlk->TxFrameType)
|
||||
|
@ -117,7 +117,7 @@ BOOLEAN PeerAssocRspSanity(
|
||||
*pHtCapabilityLen = 0;
|
||||
*pAddHtInfoLen = 0;
|
||||
COPY_MAC_ADDR(pAddr2, pFrame->Hdr.Addr2);
|
||||
Ptr = pFrame->Octet;
|
||||
Ptr = (PCHAR)pFrame->Octet;
|
||||
Length += LENGTH_802_11;
|
||||
|
||||
NdisMoveMemory(pCapabilityInfo, &pFrame->Octet[0], 2);
|
||||
@ -213,28 +213,7 @@ BOOLEAN PeerAssocRspSanity(
|
||||
DBGPRINT(RT_DEBUG_WARN, ("PeerAssocRspSanity - wrong IE_SECONDARY_CH_OFFSET. \n"));
|
||||
}
|
||||
break;
|
||||
case IE_AIRONET_CKIP:
|
||||
// 0. Check Aironet IE length, it must be larger or equal to 28
|
||||
// Cisco's AP VxWork version(will not be supported) used this IE length as 28
|
||||
// Cisco's AP IOS version used this IE length as 30
|
||||
if (pEid->Len < (CKIP_NEGOTIATION_LENGTH - 2))
|
||||
break;
|
||||
|
||||
// 1. Copy CKIP flag byte to buffer for process
|
||||
*pCkipFlag = *(pEid->Octet + 8);
|
||||
break;
|
||||
|
||||
case IE_AIRONET_IPADDRESS:
|
||||
if (pEid->Len != 0x0A)
|
||||
break;
|
||||
|
||||
// Get Cisco Aironet IP information
|
||||
if (NdisEqualMemory(pEid->Octet, CISCO_OUI, 3) == 1)
|
||||
NdisMoveMemory(pAd->StaCfg.AironetIPAddress, pEid->Octet + 4, 4);
|
||||
break;
|
||||
|
||||
// CCX2, WMM use the same IE value
|
||||
// case IE_CCX_V2:
|
||||
case IE_VENDOR_SPECIFIC:
|
||||
// handle WME PARAMTER ELEMENT
|
||||
if (NdisEqualMemory(pEid->Octet, WME_PARM_ELEM, 6) && (pEid->Len == 24))
|
||||
@ -250,7 +229,7 @@ BOOLEAN PeerAssocRspSanity(
|
||||
//pEdcaParm->bMoreDataAck = FALSE; // pEid->Octet[0] & 0x80;
|
||||
pEdcaParm->EdcaUpdateCount = pEid->Octet[6] & 0x0f;
|
||||
pEdcaParm->bAPSDCapable = (pEid->Octet[6] & 0x80) ? 1 : 0;
|
||||
ptr = &pEid->Octet[8];
|
||||
ptr = (PUCHAR)&pEid->Octet[8];
|
||||
for (i=0; i<4; i++)
|
||||
{
|
||||
UCHAR aci = (*ptr & 0x60) >> 5; // b5~6 is AC INDEX
|
||||
@ -262,23 +241,7 @@ BOOLEAN PeerAssocRspSanity(
|
||||
ptr += 4; // point to next AC
|
||||
}
|
||||
}
|
||||
|
||||
// handle CCX IE
|
||||
else
|
||||
{
|
||||
// 0. Check the size and CCX admin control
|
||||
if (pAd->StaCfg.CCXControl.field.Enable == 0)
|
||||
break;
|
||||
if (pEid->Len != 5)
|
||||
break;
|
||||
|
||||
// Turn CCX2 if matched
|
||||
if (NdisEqualMemory(pEid->Octet, Ccx2IeInfo, 5) == 1)
|
||||
pAd->StaCfg.CCXEnable = TRUE;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("PeerAssocRspSanity - ignore unrecognized EID = %d\n", pEid->Eid));
|
||||
break;
|
||||
@ -288,9 +251,6 @@ BOOLEAN PeerAssocRspSanity(
|
||||
pEid = (PEID_STRUCT)((UCHAR*)pEid + 2 + pEid->Len);
|
||||
}
|
||||
|
||||
// Force CCX2 enable to TRUE for those AP didn't replay CCX v2 IE, we still force it to be on
|
||||
if (pAd->StaCfg.CCXControl.field.Enable == 1)
|
||||
pAd->StaCfg.CCXEnable = TRUE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
@ -37,45 +37,8 @@
|
||||
*/
|
||||
#include "../rt_config.h"
|
||||
|
||||
#ifdef RT2860
|
||||
#define AC0_DEF_TXOP 0
|
||||
#define AC1_DEF_TXOP 0
|
||||
#define AC2_DEF_TXOP 94
|
||||
#define AC3_DEF_TXOP 47
|
||||
|
||||
VOID AdhocTurnOnQos(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
// Turn on QOs if use HT rate.
|
||||
if (pAd->CommonCfg.APEdcaParm.bValid == FALSE)
|
||||
{
|
||||
pAd->CommonCfg.APEdcaParm.bValid = TRUE;
|
||||
pAd->CommonCfg.APEdcaParm.Aifsn[0] = 3;
|
||||
pAd->CommonCfg.APEdcaParm.Aifsn[1] = 7;
|
||||
pAd->CommonCfg.APEdcaParm.Aifsn[2] = 1;
|
||||
pAd->CommonCfg.APEdcaParm.Aifsn[3] = 1;
|
||||
|
||||
pAd->CommonCfg.APEdcaParm.Cwmin[0] = 4;
|
||||
pAd->CommonCfg.APEdcaParm.Cwmin[1] = 4;
|
||||
pAd->CommonCfg.APEdcaParm.Cwmin[2] = 3;
|
||||
pAd->CommonCfg.APEdcaParm.Cwmin[3] = 2;
|
||||
|
||||
pAd->CommonCfg.APEdcaParm.Cwmax[0] = 10;
|
||||
pAd->CommonCfg.APEdcaParm.Cwmax[1] = 6;
|
||||
pAd->CommonCfg.APEdcaParm.Cwmax[2] = 4;
|
||||
pAd->CommonCfg.APEdcaParm.Cwmax[3] = 3;
|
||||
|
||||
pAd->CommonCfg.APEdcaParm.Txop[0] = 0;
|
||||
pAd->CommonCfg.APEdcaParm.Txop[1] = 0;
|
||||
pAd->CommonCfg.APEdcaParm.Txop[2] = AC2_DEF_TXOP;
|
||||
pAd->CommonCfg.APEdcaParm.Txop[3] = AC3_DEF_TXOP;
|
||||
}
|
||||
AsicSetEdcaParm(pAd, &pAd->CommonCfg.APEdcaParm);
|
||||
}
|
||||
#endif /* RT2860 */
|
||||
#ifdef RT2870
|
||||
#define ADHOC_ENTRY_BEACON_LOST_TIME (2*OS_HZ) // 2 sec
|
||||
#endif
|
||||
|
||||
/*
|
||||
==========================================================================
|
||||
@ -160,7 +123,7 @@ VOID BeaconTimeout(
|
||||
}
|
||||
|
||||
MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_BEACON_TIMEOUT, 0, NULL);
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -188,8 +151,8 @@ VOID ScanTimeout(
|
||||
|
||||
if (MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_SCAN_TIMEOUT, 0, NULL))
|
||||
{
|
||||
RT28XX_MLME_HANDLER(pAd);
|
||||
}
|
||||
RTMP_MLME_HANDLER(pAd);
|
||||
}
|
||||
else
|
||||
{
|
||||
// To prevent SyncMachine.CurrState is SCAN_LISTEN forever.
|
||||
@ -231,7 +194,7 @@ VOID MlmeScanReqAction(
|
||||
// Increase the scan retry counters.
|
||||
pAd->StaCfg.ScanCnt++;
|
||||
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) &&
|
||||
(IDLE_ON(pAd)) &&
|
||||
(pAd->StaCfg.bRadio == TRUE) &&
|
||||
@ -239,30 +202,22 @@ VOID MlmeScanReqAction(
|
||||
{
|
||||
RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
|
||||
}
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
// first check the parameter sanity
|
||||
if (MlmeScanReqSanity(pAd,
|
||||
Elem->Msg,
|
||||
Elem->MsgLen,
|
||||
&BssType,
|
||||
Ssid,
|
||||
(PCHAR)Ssid,
|
||||
&SsidLen,
|
||||
&ScanType))
|
||||
{
|
||||
|
||||
// Check for channel load and noise hist request
|
||||
// Suspend MSDU only at scan request, not the last two mentioned
|
||||
if ((ScanType == SCAN_CISCO_NOISE) || (ScanType == SCAN_CISCO_CHANNEL_LOAD))
|
||||
{
|
||||
if (pAd->StaCfg.CCXScanChannel != pAd->CommonCfg.Channel)
|
||||
RTMPSuspendMsduTransmission(pAd); // Suspend MSDU transmission here
|
||||
}
|
||||
else
|
||||
{
|
||||
// Suspend MSDU transmission here
|
||||
RTMPSuspendMsduTransmission(pAd);
|
||||
}
|
||||
|
||||
//
|
||||
// To prevent data lost.
|
||||
@ -304,11 +259,6 @@ VOID MlmeScanReqAction(
|
||||
// start from the first channel
|
||||
pAd->MlmeAux.Channel = FirstChannel(pAd);
|
||||
|
||||
// Change the scan channel when dealing with CCX beacon report
|
||||
if ((ScanType == SCAN_CISCO_PASSIVE) || (ScanType == SCAN_CISCO_ACTIVE) ||
|
||||
(ScanType == SCAN_CISCO_CHANNEL_LOAD) || (ScanType == SCAN_CISCO_NOISE))
|
||||
pAd->MlmeAux.Channel = pAd->StaCfg.CCXScanChannel;
|
||||
|
||||
// Let BBP register at 20MHz to do scan
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
|
||||
BBPValue &= (~0x18);
|
||||
@ -352,7 +302,7 @@ VOID MlmeJoinReqAction(
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - MlmeJoinReqAction(BSS #%ld)\n", pInfo->BssIdx));
|
||||
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE)) &&
|
||||
(IDLE_ON(pAd)) &&
|
||||
(pAd->StaCfg.bRadio == TRUE) &&
|
||||
@ -360,7 +310,7 @@ VOID MlmeJoinReqAction(
|
||||
{
|
||||
RT28xxPciAsicRadioOn(pAd, GUI_IDLE_POWER_SAVE);
|
||||
}
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
|
||||
// reset all the timers
|
||||
RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);
|
||||
@ -374,6 +324,7 @@ VOID MlmeJoinReqAction(
|
||||
// If AP's SSID is not hidden, it is OK for updating ssid to MlmeAux again.
|
||||
if (pBss->Hidden == 0)
|
||||
{
|
||||
RTMPZeroMemory(pAd->MlmeAux.Ssid, MAX_LEN_OF_SSID);
|
||||
NdisMoveMemory(pAd->MlmeAux.Ssid, pBss->Ssid, pBss->SsidLen);
|
||||
pAd->MlmeAux.SsidLen = pBss->SsidLen;
|
||||
}
|
||||
@ -382,10 +333,14 @@ VOID MlmeJoinReqAction(
|
||||
pAd->MlmeAux.Channel = pBss->Channel;
|
||||
pAd->MlmeAux.CentralChannel = pBss->CentralChannel;
|
||||
|
||||
|
||||
// Let BBP register at 20MHz to do scan
|
||||
RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue);
|
||||
BBPValue &= (~0x18);
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue);
|
||||
#ifdef RT2860
|
||||
pAd->CommonCfg.BBPCurrentBW = BW_20;
|
||||
#endif // RT2860 //
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - BBP R4 to 20MHz.l\n"));
|
||||
|
||||
// switch channel and waiting for beacon timer
|
||||
@ -494,7 +449,7 @@ VOID MlmeStartReqAction(
|
||||
TimeStamp.u.LowPart = 0;
|
||||
TimeStamp.u.HighPart = 0;
|
||||
|
||||
if (MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, Ssid, &SsidLen))
|
||||
if (MlmeStartReqSanity(pAd, Elem->Msg, Elem->MsgLen, (PCHAR)Ssid, &SsidLen))
|
||||
{
|
||||
// reset all the timers
|
||||
RTMPCancelTimer(&pAd->MlmeAux.ScanTimer, &TimerCancelled);
|
||||
@ -541,6 +496,7 @@ VOID MlmeStartReqAction(
|
||||
{
|
||||
pAd->MlmeAux.HtCapabilityLen = 0;
|
||||
pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
|
||||
NdisZeroMemory(&pAd->StaActive.SupportedPhyInfo.MCSSet[0], 16);
|
||||
}
|
||||
// temporarily not support QOS in IBSS
|
||||
NdisZeroMemory(&pAd->MlmeAux.APEdcaParm, sizeof(EDCA_PARM));
|
||||
@ -601,6 +557,8 @@ VOID PeerBeaconAtScanAction(
|
||||
UCHAR AddHtInfoLen;
|
||||
UCHAR NewExtChannelOffset = 0xff;
|
||||
|
||||
|
||||
// NdisFillMemory(Ssid, MAX_LEN_OF_SSID, 0x00);
|
||||
pFrame = (PFRAME_802_11) Elem->Msg;
|
||||
// Init Variable IE structure
|
||||
pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
|
||||
@ -615,7 +573,7 @@ VOID PeerBeaconAtScanAction(
|
||||
Elem->Channel,
|
||||
Addr2,
|
||||
Bssid,
|
||||
Ssid,
|
||||
(PCHAR)Ssid,
|
||||
&SsidLen,
|
||||
&BssType,
|
||||
&BeaconPeriod,
|
||||
@ -661,24 +619,7 @@ VOID PeerBeaconAtScanAction(
|
||||
if ((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0))
|
||||
HtCapabilityLen = SIZE_HT_CAP_IE;
|
||||
|
||||
if ((pAd->StaCfg.CCXReqType != MSRN_TYPE_UNUSED) && (Channel == pAd->StaCfg.CCXScanChannel))
|
||||
{
|
||||
Idx = BssTableSetEntry(pAd, &pAd->StaCfg.CCXBssTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod,
|
||||
&CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen,ExtRate, ExtRateLen, &HtCapability,
|
||||
&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag,
|
||||
&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
|
||||
if (Idx != BSS_NOT_FOUND)
|
||||
{
|
||||
NdisMoveMemory(pAd->StaCfg.CCXBssTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4);
|
||||
NdisMoveMemory(&pAd->StaCfg.CCXBssTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);
|
||||
NdisMoveMemory(&pAd->StaCfg.CCXBssTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);
|
||||
if (pAd->StaCfg.CCXReqType == MSRN_TYPE_BEACON_REQ)
|
||||
AironetAddBeaconReport(pAd, Idx, Elem);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod,
|
||||
Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (PCHAR)Ssid, SsidLen, BssType, BeaconPeriod,
|
||||
&CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability,
|
||||
&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag,
|
||||
&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
|
||||
@ -689,7 +630,7 @@ VOID PeerBeaconAtScanAction(
|
||||
NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);
|
||||
NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// sanity check fail, ignored
|
||||
}
|
||||
@ -731,6 +672,7 @@ VOID PeerBeaconAtJoinAction(
|
||||
UCHAR AddHtInfoLen;
|
||||
UCHAR NewExtChannelOffset = 0xff;
|
||||
UCHAR CentralChannel;
|
||||
BOOLEAN bAllowNrate = FALSE;
|
||||
|
||||
// Init Variable IE structure
|
||||
pVIE = (PNDIS_802_11_VARIABLE_IEs) VarIE;
|
||||
@ -745,7 +687,7 @@ VOID PeerBeaconAtJoinAction(
|
||||
Elem->Channel,
|
||||
Addr2,
|
||||
Bssid,
|
||||
Ssid,
|
||||
(PCHAR)Ssid,
|
||||
&SsidLen,
|
||||
&BssType,
|
||||
&BeaconPeriod,
|
||||
@ -818,7 +760,23 @@ VOID PeerBeaconAtJoinAction(
|
||||
{
|
||||
Idx = BssSsidTableSearch(&pAd->ScanTab, Bssid, pAd->MlmeAux.Ssid, pAd->MlmeAux.SsidLen, Channel);
|
||||
|
||||
if (Idx == BSS_NOT_FOUND)
|
||||
{
|
||||
CHAR Rssi = 0;
|
||||
Rssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, Elem->Rssi0, RSSI_0), ConvertToRssi(pAd, Elem->Rssi1, RSSI_1), ConvertToRssi(pAd, Elem->Rssi2, RSSI_2));
|
||||
Idx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, (CHAR *) Ssid, SsidLen, BssType, BeaconPeriod,
|
||||
&Cf, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability,
|
||||
&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, Rssi, TimeStamp, CkipFlag,
|
||||
&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
|
||||
if (Idx != BSS_NOT_FOUND)
|
||||
{
|
||||
NdisMoveMemory(pAd->ScanTab.BssEntry[Idx].PTSF, &Elem->Msg[24], 4);
|
||||
NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[0], &Elem->TimeStamp.u.LowPart, 4);
|
||||
NdisMoveMemory(&pAd->ScanTab.BssEntry[Idx].TTSF[4], &Elem->TimeStamp.u.LowPart, 4);
|
||||
CapabilityInfo = pAd->ScanTab.BssEntry[Idx].CapabilityInfo;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
// Multiple SSID case, used correct CapabilityInfo
|
||||
@ -847,13 +805,21 @@ VOID PeerBeaconAtJoinAction(
|
||||
|
||||
NdisZeroMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, 16);
|
||||
|
||||
|
||||
if (((pAd->StaCfg.WepStatus != Ndis802_11WEPEnabled) && (pAd->StaCfg.WepStatus != Ndis802_11Encryption2Enabled))
|
||||
|| (pAd->CommonCfg.HT_DisallowTKIP == FALSE))
|
||||
{
|
||||
bAllowNrate = TRUE;
|
||||
}
|
||||
|
||||
pAd->MlmeAux.NewExtChannelOffset = NewExtChannelOffset;
|
||||
pAd->MlmeAux.HtCapabilityLen = HtCapabilityLen;
|
||||
|
||||
RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);
|
||||
// filter out un-supported ht rates
|
||||
if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) && (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
|
||||
if (((HtCapabilityLen > 0) || (PreNHtCapabilityLen > 0)) &&
|
||||
((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED) && (bAllowNrate)))
|
||||
{
|
||||
RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);
|
||||
RTMPMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, SIZE_ADD_HT_INFO_IE);
|
||||
|
||||
// StaActive.SupportedHtPhy.MCSSet stores Peer AP's 11n Rx capability
|
||||
@ -897,7 +863,9 @@ VOID PeerBeaconAtJoinAction(
|
||||
pAd->MlmeAux.CentralChannel = pAd->MlmeAux.Channel;
|
||||
|
||||
pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
|
||||
pAd->MlmeAux.NewExtChannelOffset = 0xff;
|
||||
RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);
|
||||
pAd->MlmeAux.HtCapabilityLen = 0;
|
||||
RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE);
|
||||
}
|
||||
|
||||
@ -930,6 +898,8 @@ VOID PeerBeaconAtJoinAction(
|
||||
else //Used the default TX Power Percentage.
|
||||
pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
|
||||
|
||||
InitChannelRelatedValue(pAd);
|
||||
|
||||
pAd->Mlme.SyncMachine.CurrState = SYNC_IDLE;
|
||||
Status = MLME_SUCCESS;
|
||||
MlmeEnqueue(pAd, MLME_CNTL_STATE_MACHINE, MT2_JOIN_CONF, 2, &Status);
|
||||
@ -1116,8 +1086,6 @@ VOID PeerBeacon(
|
||||
// Add the safeguard against the mismatch of adhoc wep status
|
||||
if (pAd->StaCfg.WepStatus != pAd->ScanTab.BssEntry[Bssidx].WepStatus)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - Not matched wep status %d %d\n", pAd->StaCfg.WepStatus, pAd->ScanTab.BssEntry[Bssidx].WepStatus));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("bssid=%s\n", pAd->ScanTab.BssEntry[Bssidx].Bssid));
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1181,200 +1149,8 @@ VOID PeerBeacon(
|
||||
pAd->CommonCfg.TxPowerPercentage = pAd->CommonCfg.TxPowerDefault;
|
||||
}
|
||||
|
||||
#ifdef RT2860
|
||||
// at least one 11b peer joined. downgrade the MaxTxRate to 11Mbps
|
||||
// after last 11b peer left for several seconds, we'll auto switch back to 11G rate
|
||||
// in MlmePeriodicExec()
|
||||
#endif
|
||||
if (ADHOC_ON(pAd) && (CAP_IS_IBSS_ON(CapabilityInfo)))
|
||||
{
|
||||
#ifdef RT2860
|
||||
BOOLEAN bRestart;
|
||||
BOOLEAN bnRestart;
|
||||
|
||||
bRestart = FALSE;
|
||||
bnRestart = FALSE;
|
||||
|
||||
do
|
||||
{
|
||||
if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.MaxTxRate > RATE_11))
|
||||
{
|
||||
if (pAd->StaCfg.AdhocBOnlyJoined == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11b peer joined. down-grade to 11b TX rates \n"));
|
||||
bRestart = TRUE;
|
||||
NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);
|
||||
pAd->StaActive.SupRateLen = SupRateLen;
|
||||
NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
|
||||
pAd->StaActive.ExtRateLen = ExtRateLen;
|
||||
pAd->StaCfg.AdhocBOnlyJoined = TRUE;
|
||||
pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
|
||||
AsicSetEdcaParm(pAd, NULL);
|
||||
}
|
||||
|
||||
// this timestamp is for MlmePeriodicExec() to check if all 11B peers have left
|
||||
pAd->StaCfg.Last11bBeaconRxTime = Now;
|
||||
break;
|
||||
}
|
||||
|
||||
// Update Ht Phy.
|
||||
if ((pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED))
|
||||
{
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED) &&
|
||||
!pAd->StaCfg.AdhocBGJoined &&
|
||||
!pAd->StaCfg.AdhocBOnlyJoined)
|
||||
AdhocTurnOnQos(pAd);
|
||||
|
||||
// Handle rate switch issue when Adhoc mode
|
||||
if ((SupRateLen+ExtRateLen >= 8) && (HtCapability.MCSSet[0] == 0) && (HtCapability.MCSSet[1] == 0))
|
||||
{
|
||||
if (pAd->StaCfg.AdhocBGJoined == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("SYNC - 11g peer joined. down-grade to 11g TX rates \n"));
|
||||
bRestart = TRUE;
|
||||
NdisMoveMemory(pAd->StaActive.SupRate, SupRate, MAX_LEN_OF_SUPPORTED_RATES);
|
||||
pAd->StaActive.SupRateLen = SupRateLen;
|
||||
NdisMoveMemory(pAd->StaActive.ExtRate, ExtRate, MAX_LEN_OF_SUPPORTED_RATES);
|
||||
pAd->StaActive.ExtRateLen = ExtRateLen;
|
||||
pAd->StaCfg.AdhocBGJoined = TRUE;
|
||||
pAd->StaActive.SupportedPhyInfo.bHtEnable = FALSE;
|
||||
AsicSetEdcaParm(pAd, NULL);
|
||||
}
|
||||
|
||||
// this timestamp is for MlmePeriodicExec() to check if all 11g peers have left
|
||||
pAd->StaCfg.Last11gBeaconRxTime = Now;
|
||||
break;
|
||||
}
|
||||
else if (!pAd->StaCfg.AdhocBGJoined &&
|
||||
!pAd->StaCfg.AdhocBOnlyJoined &&
|
||||
(pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) &&
|
||||
(HtCapability.HtCapInfo.ChannelWidth == BW_20))
|
||||
{
|
||||
if (pAd->StaCfg.Adhoc20NJoined == FALSE)
|
||||
{
|
||||
pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel;
|
||||
|
||||
pAd->StaCfg.Adhoc20NJoined = TRUE;
|
||||
NdisMoveMemory(&pAd->MlmeAux.HtCapability, &HtCapability, SIZE_HT_CAP_IE);
|
||||
if (AddHtInfoLen != 0)
|
||||
NdisMoveMemory(&pAd->MlmeAux.AddHtInfo, &AddHtInfo, AddHtInfoLen);
|
||||
NdisMoveMemory(pAd->StaActive.SupportedPhyInfo.MCSSet, HtCapability.MCSSet, 16);
|
||||
|
||||
RTMPCheckHt(pAd, Elem->Wcid, &pAd->MlmeAux.HtCapability, &pAd->MlmeAux.AddHtInfo);
|
||||
COPY_HTSETTINGS_FROM_MLME_AUX_TO_ACTIVE_CFG(pAd);
|
||||
pAd->StaActive.SupportedPhyInfo.bHtEnable = TRUE;
|
||||
bRestart = TRUE;
|
||||
bnRestart = TRUE;
|
||||
}
|
||||
// this timestamp is for MlmePeriodicExec() to check if all 20MHz N peers have left
|
||||
pAd->StaCfg.Last20NBeaconRxTime = Now;
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMPZeroMemory(&pAd->MlmeAux.HtCapability, SIZE_HT_CAP_IE);
|
||||
RTMPZeroMemory(&pAd->MlmeAux.AddHtInfo, SIZE_ADD_HT_INFO_IE);
|
||||
}
|
||||
}while (FALSE);
|
||||
|
||||
// If peer Adhoc is legacy mode, I don't need to call MlmeUpdateHtTxRates no matter I support HT or not
|
||||
if ((bRestart == TRUE) && (bnRestart == FALSE))
|
||||
{
|
||||
MlmeUpdateTxRates(pAd, FALSE, 0);
|
||||
MakeIbssBeacon(pAd); // re-build BEACON frame
|
||||
AsicEnableIbssSync(pAd); // copy to on-chip memory
|
||||
}
|
||||
else if ((bRestart == TRUE) && (bnRestart == TRUE))
|
||||
{
|
||||
MlmeUpdateTxRates(pAd, FALSE, BSS0);
|
||||
MlmeUpdateHtTxRates(pAd, BSS0);
|
||||
MakeIbssBeacon(pAd); // re-build BEACON frame
|
||||
AsicEnableIbssSync(pAd); // copy to on-chip memory
|
||||
}
|
||||
|
||||
// At least another peer in this IBSS, declare MediaState as CONNECTED
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED))
|
||||
{
|
||||
OPSTATUS_SET_FLAG(pAd, fOP_STATUS_MEDIA_STATE_CONNECTED);
|
||||
|
||||
pAd->IndicateMediaState = NdisMediaStateConnected;
|
||||
RTMP_IndicateMediaState(pAd);
|
||||
pAd->ExtraInfo = GENERAL_LINK_UP;
|
||||
AsicSetBssid(pAd, pAd->CommonCfg.Bssid);
|
||||
|
||||
// 2003/03/12 - john
|
||||
// Make sure this entry in "ScanTab" table, thus complies to Microsoft's policy that
|
||||
// "site survey" result should always include the current connected network.
|
||||
//
|
||||
Bssidx = BssTableSearch(&pAd->ScanTab, Bssid, Channel);
|
||||
if (Bssidx == BSS_NOT_FOUND)
|
||||
{
|
||||
Bssidx = BssTableSetEntry(pAd, &pAd->ScanTab, Bssid, Ssid, SsidLen, BssType, BeaconPeriod,
|
||||
&CfParm, AtimWin, CapabilityInfo, SupRate, SupRateLen, ExtRate, ExtRateLen, &HtCapability,
|
||||
&AddHtInfo, HtCapabilityLen, AddHtInfoLen, NewExtChannelOffset, Channel, RealRssi, TimeStamp, 0,
|
||||
&EdcaParm, &QosCapability, &QbssLoad, LenVIE, pVIE);
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n"));
|
||||
}
|
||||
|
||||
// Ad-hoc mode is using MAC address as BA session. So we need to continuously find newly joined adhoc station by receiving beacon.
|
||||
// To prevent always check this, we use wcid == RESERVED_WCID to recognize it as newly joined adhoc station.
|
||||
if (ADHOC_ON(pAd) && (Elem->Wcid == RESERVED_WCID))
|
||||
{
|
||||
UCHAR idx;
|
||||
MAC_TABLE_ENTRY *pEntry;
|
||||
|
||||
// look up the existing table
|
||||
pEntry = MacTableLookup(pAd, Addr2);
|
||||
if (pEntry == NULL)
|
||||
{
|
||||
// Another adhoc joining, add to our MAC table.
|
||||
pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE);
|
||||
if (pEntry)
|
||||
{
|
||||
pEntry->Sst = SST_ASSOC;
|
||||
idx = pAd->StaCfg.DefaultKeyId;
|
||||
// After InsertEntry, Write to ASIC on-chip table.
|
||||
RT28XX_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry);
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ADHOC %x:%x:%x:%x:%x:%x join in.Entry=%d\n", Addr2[0],Addr2[1],Addr2[2],Addr2[3],Addr2[4],Addr2[5], pEntry->Aid));
|
||||
|
||||
pEntry->HTPhyMode.word = pAd->StaCfg.HTPhyMode.word;
|
||||
if (HtCapabilityLen <= 0)
|
||||
{
|
||||
pEntry->HTPhyMode.field.STBC = 0;
|
||||
pEntry->HTPhyMode.field.BW = 0;
|
||||
pEntry->HTPhyMode.field.ShortGI = 0;
|
||||
if ((SupRateLen+ExtRateLen <= 4) && (pAd->CommonCfg.Channel <= 14))
|
||||
{
|
||||
pEntry->HTPhyMode.field.MODE = MODE_CCK;
|
||||
}
|
||||
else
|
||||
{
|
||||
pEntry->HTPhyMode.field.MODE = MODE_OFDM;
|
||||
}
|
||||
MlmeUpdateTxRates(pAd, FALSE, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
MlmeUpdateTxRates(pAd, FALSE, 0);
|
||||
MlmeUpdateHtTxRates(pAd, BSS0);
|
||||
}
|
||||
|
||||
{
|
||||
union iwreq_data wrqu;
|
||||
wext_notify_event_assoc(pAd);
|
||||
|
||||
memset(wrqu.ap_addr.sa_data, 0, MAC_ADDR_LEN);
|
||||
memcpy(wrqu.ap_addr.sa_data, pAd->MlmeAux.Bssid, MAC_ADDR_LEN);
|
||||
wireless_send_event(pAd->net_dev, SIOCGIWAP, &wrqu, NULL);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* RT2860 */
|
||||
#ifdef RT2870
|
||||
UCHAR MaxSupportedRateIn500Kbps = 0;
|
||||
UCHAR idx;
|
||||
MAC_TABLE_ENTRY *pEntry;
|
||||
@ -1404,7 +1180,14 @@ VOID PeerBeacon(
|
||||
// Another adhoc joining, add to our MAC table.
|
||||
pEntry = MacTableInsertEntry(pAd, Addr2, BSS0, FALSE);
|
||||
|
||||
if (StaAddMacTableEntry(pAd, pEntry, MaxSupportedRateIn500Kbps, &HtCapability, HtCapabilityLen, CapabilityInfo) == FALSE)
|
||||
if (StaAddMacTableEntry(pAd,
|
||||
pEntry,
|
||||
MaxSupportedRateIn500Kbps,
|
||||
&HtCapability,
|
||||
HtCapabilityLen,
|
||||
&AddHtInfo,
|
||||
AddHtInfoLen,
|
||||
CapabilityInfo) == FALSE)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ADHOC - Add Entry failed.\n"));
|
||||
return;
|
||||
@ -1414,7 +1197,7 @@ VOID PeerBeacon(
|
||||
(Elem->Wcid == RESERVED_WCID))
|
||||
{
|
||||
idx = pAd->StaCfg.DefaultKeyId;
|
||||
RT28XX_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry);
|
||||
RTMP_STA_SECURITY_INFO_ADD(pAd, BSS0, idx, pEntry);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1445,7 +1228,6 @@ VOID PeerBeacon(
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("ADHOC fOP_STATUS_MEDIA_STATE_CONNECTED.\n"));
|
||||
}
|
||||
#endif /* RT2870 */
|
||||
}
|
||||
|
||||
if (INFRA_ON(pAd))
|
||||
@ -1534,28 +1316,32 @@ VOID PeerBeacon(
|
||||
// 5. otherwise, put PHY back to sleep to save battery.
|
||||
if (MessageToMe)
|
||||
{
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
{
|
||||
// Restore to correct BBP R3 value
|
||||
if (pAd->Antenna.field.RxPath > 1)
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
|
||||
// Turn clk to 80Mhz.
|
||||
}
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
if (pAd->CommonCfg.bAPSDCapable && pAd->CommonCfg.APEdcaParm.bAPSDCapable &&
|
||||
pAd->CommonCfg.bAPSDAC_BE && pAd->CommonCfg.bAPSDAC_BK && pAd->CommonCfg.bAPSDAC_VI && pAd->CommonCfg.bAPSDAC_VO)
|
||||
{
|
||||
pAd->CommonCfg.bNeedSendTriggerFrame = TRUE;
|
||||
}
|
||||
else
|
||||
RT28XX_PS_POLL_ENQUEUE(pAd);
|
||||
RTMP_PS_POLL_ENQUEUE(pAd);
|
||||
}
|
||||
else if (BcastFlag && (DtimCount == 0) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_RECEIVE_DTIM))
|
||||
{
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
{
|
||||
if (pAd->Antenna.field.RxPath > 1)
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
|
||||
}
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
}
|
||||
else if ((pAd->TxSwQueue[QID_AC_BK].Number != 0) ||
|
||||
(pAd->TxSwQueue[QID_AC_BE].Number != 0) ||
|
||||
@ -1569,12 +1355,42 @@ VOID PeerBeacon(
|
||||
{
|
||||
// TODO: consider scheduled HCCA. might not be proper to use traditional DTIM-based power-saving scheme
|
||||
// can we cheat here (i.e. just check MGMT & AC_BE) for better performance?
|
||||
#ifdef RT2860
|
||||
#ifdef RTMP_MAC_PCI
|
||||
if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_ADVANCE_POWER_SAVE_PCIE_DEVICE))
|
||||
{
|
||||
if (pAd->Antenna.field.RxPath > 1)
|
||||
RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, pAd->StaCfg.BBPR3);
|
||||
}
|
||||
#endif
|
||||
#endif // RTMP_MAC_PCI //
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((pAd->CommonCfg.bACMAPSDTr[QID_AC_VO]) ||
|
||||
(pAd->CommonCfg.bACMAPSDTr[QID_AC_VI]) ||
|
||||
(pAd->CommonCfg.bACMAPSDTr[QID_AC_BK]) ||
|
||||
(pAd->CommonCfg.bACMAPSDTr[QID_AC_BE]))
|
||||
{
|
||||
/*
|
||||
WMM Spec v1.0 3.6.2.4,
|
||||
The WMM STA shall remain awake until it receives a
|
||||
QoS Data or Null frame addressed to it, with the
|
||||
EOSP subfield in QoS Control field set to 1.
|
||||
|
||||
So we can not sleep here or we will suffer a case:
|
||||
|
||||
PS Management Frame -->
|
||||
Trigger frame -->
|
||||
Beacon (TIM=0) (Beacon is closer to Trig frame) -->
|
||||
Station goes to sleep -->
|
||||
AP delivery queued UAPSD packets -->
|
||||
Station can NOT receive the reply
|
||||
|
||||
Maybe we need a timeout timer to avoid that we do
|
||||
NOT receive the EOSP frame.
|
||||
|
||||
We can not use More Data to check if SP is ended
|
||||
due to MaxSPLength.
|
||||
*/
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -1589,14 +1405,10 @@ VOID PeerBeacon(
|
||||
|
||||
if (!OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_DOZE))
|
||||
{
|
||||
#ifdef RT2860
|
||||
// Set a flag to go to sleep . Then after parse this RxDoneInterrupt, will go to sleep mode.
|
||||
RTMP_SET_PSFLAG(pAd, fRTMP_PS_GO_TO_SLEEP_NOW);
|
||||
pAd->ThisTbttNumToNextWakeUp = TbttNumToNextWakeUp;
|
||||
#endif
|
||||
#ifdef RT2870
|
||||
AsicSleepThenAutoWakeup(pAd, TbttNumToNextWakeUp);
|
||||
#endif
|
||||
AsicSleepThenAutoWakeup(pAd, pAd->ThisTbttNumToNextWakeUp);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1825,6 +1637,8 @@ VOID InvalidStateWhenStart(
|
||||
VOID EnqueuePsPoll(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
|
||||
|
||||
if (pAd->StaCfg.WindowsPowerMode == Ndis802_11PowerModeLegacy_PSP)
|
||||
pAd->PsPollFrame.FC.PwrMgmt = PWR_SAVE;
|
||||
MiniportMMRequest(pAd, 0, (PUCHAR)&pAd->PsPollFrame, sizeof(PSPOLL_FRAME));
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
897
drivers/staging/rt2860/usb_main_dev.c
Normal file
897
drivers/staging/rt2860/usb_main_dev.c
Normal file
@ -0,0 +1,897 @@
|
||||
/*
|
||||
*************************************************************************
|
||||
* Ralink Tech Inc.
|
||||
* 5F., No.36, Taiyuan St., Jhubei City,
|
||||
* Hsinchu County 302,
|
||||
* Taiwan, R.O.C.
|
||||
*
|
||||
* (c) Copyright 2002-2007, Ralink Technology, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
* *
|
||||
*************************************************************************/
|
||||
|
||||
#include "rt_config.h"
|
||||
|
||||
|
||||
// Following information will be show when you run 'modinfo'
|
||||
// *** If you have a solution for the bug in current version of driver, please mail to me.
|
||||
// Otherwise post to forum in ralinktech's web site(www.ralinktech.com) and let all users help you. ***
|
||||
MODULE_AUTHOR("Paul Lin <paul_lin@ralinktech.com>");
|
||||
MODULE_DESCRIPTION("RT2870/RT3070 Wireless Lan Linux Driver");
|
||||
MODULE_LICENSE("GPL");
|
||||
#ifdef MODULE_VERSION
|
||||
MODULE_VERSION(STA_DRIVER_VERSION);
|
||||
#endif
|
||||
|
||||
|
||||
/* module table */
|
||||
struct usb_device_id rtusb_usb_id[] = {
|
||||
#ifdef RT2870
|
||||
{USB_DEVICE(0x148F,0x2770)}, /* Ralink */
|
||||
{USB_DEVICE(0x148F,0x2870)}, /* Ralink */
|
||||
{USB_DEVICE(0x07B8,0x2870)}, /* AboCom */
|
||||
{USB_DEVICE(0x07B8,0x2770)}, /* AboCom */
|
||||
{USB_DEVICE(0x0DF6,0x0039)}, /* Sitecom 2770 */
|
||||
{USB_DEVICE(0x083A,0x7512)}, /* Arcadyan 2770 */
|
||||
{USB_DEVICE(0x0789,0x0162)}, /* Logitec 2870 */
|
||||
{USB_DEVICE(0x0789,0x0163)}, /* Logitec 2870 */
|
||||
{USB_DEVICE(0x0789,0x0164)}, /* Logitec 2870 */
|
||||
{USB_DEVICE(0x177f,0x0302)}, /* lsusb */
|
||||
{USB_DEVICE(0x0B05,0x1731)}, /* Asus */
|
||||
{USB_DEVICE(0x0B05,0x1732)}, /* Asus */
|
||||
{USB_DEVICE(0x0B05,0x1742)}, /* Asus */
|
||||
{USB_DEVICE(0x0DF6,0x0017)}, /* Sitecom */
|
||||
{USB_DEVICE(0x0DF6,0x002B)}, /* Sitecom */
|
||||
{USB_DEVICE(0x0DF6,0x002C)}, /* Sitecom */
|
||||
{USB_DEVICE(0x0DF6,0x002D)}, /* Sitecom */
|
||||
{USB_DEVICE(0x14B2,0x3C06)}, /* Conceptronic */
|
||||
{USB_DEVICE(0x14B2,0x3C28)}, /* Conceptronic */
|
||||
{USB_DEVICE(0x2019,0xED06)}, /* Planex Communications, Inc. */
|
||||
{USB_DEVICE(0x07D1,0x3C09)}, /* D-Link */
|
||||
{USB_DEVICE(0x07D1,0x3C11)}, /* D-Link */
|
||||
{USB_DEVICE(0x14B2,0x3C07)}, /* AL */
|
||||
{USB_DEVICE(0x050D,0x8053)}, /* Belkin */
|
||||
{USB_DEVICE(0x14B2,0x3C23)}, /* Airlink */
|
||||
{USB_DEVICE(0x14B2,0x3C27)}, /* Airlink */
|
||||
{USB_DEVICE(0x07AA,0x002F)}, /* Corega */
|
||||
{USB_DEVICE(0x07AA,0x003C)}, /* Corega */
|
||||
{USB_DEVICE(0x07AA,0x003F)}, /* Corega */
|
||||
{USB_DEVICE(0x1044,0x800B)}, /* Gigabyte */
|
||||
{USB_DEVICE(0x15A9,0x0006)}, /* Sparklan */
|
||||
{USB_DEVICE(0x083A,0xB522)}, /* SMC */
|
||||
{USB_DEVICE(0x083A,0xA618)}, /* SMC */
|
||||
{USB_DEVICE(0x083A,0x8522)}, /* Arcadyan */
|
||||
{USB_DEVICE(0x083A,0x7522)}, /* Arcadyan */
|
||||
{USB_DEVICE(0x0CDE,0x0022)}, /* ZCOM */
|
||||
{USB_DEVICE(0x0586,0x3416)}, /* Zyxel */
|
||||
{USB_DEVICE(0x0CDE,0x0025)}, /* Zyxel */
|
||||
{USB_DEVICE(0x1740,0x9701)}, /* EnGenius */
|
||||
{USB_DEVICE(0x1740,0x9702)}, /* EnGenius */
|
||||
{USB_DEVICE(0x0471,0x200f)}, /* Philips */
|
||||
{USB_DEVICE(0x14B2,0x3C25)}, /* Draytek */
|
||||
{USB_DEVICE(0x13D3,0x3247)}, /* AzureWave */
|
||||
{USB_DEVICE(0x083A,0x6618)}, /* Accton */
|
||||
{USB_DEVICE(0x15c5,0x0008)}, /* Amit */
|
||||
{USB_DEVICE(0x0E66,0x0001)}, /* Hawking */
|
||||
{USB_DEVICE(0x0E66,0x0003)}, /* Hawking */
|
||||
{USB_DEVICE(0x129B,0x1828)}, /* Siemens */
|
||||
{USB_DEVICE(0x157E,0x300E)}, /* U-Media */
|
||||
{USB_DEVICE(0x050d,0x805c)},
|
||||
{USB_DEVICE(0x050d,0x815c)},
|
||||
{USB_DEVICE(0x1482,0x3C09)}, /* Abocom*/
|
||||
{USB_DEVICE(0x14B2,0x3C09)}, /* Alpha */
|
||||
{USB_DEVICE(0x04E8,0x2018)}, /* samsung */
|
||||
{USB_DEVICE(0x5A57,0x0280)}, /* Zinwell */
|
||||
{USB_DEVICE(0x5A57,0x0282)}, /* Zinwell */
|
||||
{USB_DEVICE(0x7392,0x7718)},
|
||||
{USB_DEVICE(0x7392,0x7717)},
|
||||
{USB_DEVICE(0x1737,0x0070)}, /* Linksys WUSB100 */
|
||||
{USB_DEVICE(0x1737,0x0071)}, /* Linksys WUSB600N */
|
||||
{USB_DEVICE(0x0411,0x00e8)}, /* Buffalo WLI-UC-G300N*/
|
||||
{USB_DEVICE(0x050d,0x815c)}, /* Belkin F5D8053 */
|
||||
#endif // RT2870 //
|
||||
#ifdef RT3070
|
||||
{USB_DEVICE(0x148F,0x3070)}, /* Ralink 3070 */
|
||||
{USB_DEVICE(0x148F,0x3071)}, /* Ralink 3071 */
|
||||
{USB_DEVICE(0x148F,0x3072)}, /* Ralink 3072 */
|
||||
{USB_DEVICE(0x0DB0,0x3820)}, /* Ralink 3070 */
|
||||
{USB_DEVICE(0x0DF6,0x003E)}, /* Sitecom 3070 */
|
||||
{USB_DEVICE(0x0DF6,0x0042)}, /* Sitecom 3072 */
|
||||
{USB_DEVICE(0x14B2,0x3C12)}, /* AL 3070 */
|
||||
{USB_DEVICE(0x18C5,0x0012)}, /* Corega 3070 */
|
||||
{USB_DEVICE(0x083A,0x7511)}, /* Arcadyan 3070 */
|
||||
{USB_DEVICE(0x1740,0x9703)}, /* EnGenius 3070 */
|
||||
{USB_DEVICE(0x1740,0x9705)}, /* EnGenius 3071 */
|
||||
{USB_DEVICE(0x1740,0x9706)}, /* EnGenius 3072 */
|
||||
{USB_DEVICE(0x13D3,0x3273)}, /* AzureWave 3070*/
|
||||
{USB_DEVICE(0x1044,0x800D)}, /* Gigabyte GN-WB32L 3070 */
|
||||
{USB_DEVICE(0x2019,0xAB25)}, /* Planex Communications, Inc. RT3070 */
|
||||
{USB_DEVICE(0x07B8,0x3070)}, /* AboCom 3070 */
|
||||
{USB_DEVICE(0x07B8,0x3071)}, /* AboCom 3071 */
|
||||
{USB_DEVICE(0x07B8,0x3072)}, /* Abocom 3072 */
|
||||
{USB_DEVICE(0x7392,0x7711)}, /* Edimax 3070 */
|
||||
{USB_DEVICE(0x1A32,0x0304)}, /* Quanta 3070 */
|
||||
{USB_DEVICE(0x1EDA,0x2310)}, /* AirTies 3070 */
|
||||
{USB_DEVICE(0x07D1,0x3C0A)}, /* D-Link 3072 */
|
||||
{USB_DEVICE(0x07D1,0x3C0D)}, /* D-Link 3070 */
|
||||
{USB_DEVICE(0x07D1,0x3C0E)}, /* D-Link 3070 */
|
||||
{USB_DEVICE(0x07D1,0x3C0F)}, /* D-Link 3070 */
|
||||
{USB_DEVICE(0x1D4D,0x000C)}, /* Pegatron Corporation 3070 */
|
||||
{USB_DEVICE(0x1D4D,0x000E)}, /* Pegatron Corporation 3070 */
|
||||
{USB_DEVICE(0x5A57,0x5257)}, /* Zinwell 3070 */
|
||||
{USB_DEVICE(0x5A57,0x0283)}, /* Zinwell 3072 */
|
||||
{USB_DEVICE(0x04BB,0x0945)}, /* I-O DATA 3072 */
|
||||
{USB_DEVICE(0x203D,0x1480)}, /* Encore 3070 */
|
||||
#endif // RT3070 //
|
||||
{ USB_DEVICE(0x0DF6, 0x003F) }, /* Sitecom WL-608 */
|
||||
{ USB_DEVICE(0x1737, 0x0077) }, /* Linksys WUSB54GC-EU v3 */
|
||||
{ USB_DEVICE(0x2001, 0x3C09) }, /* D-Link */
|
||||
{ USB_DEVICE(0x2001, 0x3C0A) }, /* D-Link 3072*/
|
||||
{ USB_DEVICE(0x2019, 0xED14) }, /* Planex Communications, Inc. */
|
||||
{ }/* Terminating entry */
|
||||
};
|
||||
|
||||
INT const rtusb_usb_id_len = sizeof(rtusb_usb_id) / sizeof(struct usb_device_id);
|
||||
|
||||
MODULE_DEVICE_TABLE(usb, rtusb_usb_id);
|
||||
|
||||
static void rt2870_disconnect(
|
||||
IN struct usb_device *dev,
|
||||
IN PRTMP_ADAPTER pAd);
|
||||
|
||||
static int __devinit rt2870_probe(
|
||||
IN struct usb_interface *intf,
|
||||
IN struct usb_device *usb_dev,
|
||||
IN const struct usb_device_id *dev_id,
|
||||
IN RTMP_ADAPTER **ppAd);
|
||||
|
||||
#ifndef PF_NOFREEZE
|
||||
#define PF_NOFREEZE 0
|
||||
#endif
|
||||
|
||||
|
||||
extern int rt28xx_close(IN struct net_device *net_dev);
|
||||
extern int rt28xx_open(struct net_device *net_dev);
|
||||
|
||||
static BOOLEAN USBDevConfigInit(
|
||||
IN struct usb_device *dev,
|
||||
IN struct usb_interface *intf,
|
||||
IN RTMP_ADAPTER *pAd);
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Check the chipset vendor/product ID.
|
||||
|
||||
Arguments:
|
||||
_dev_p Point to the PCI or USB device
|
||||
|
||||
Return Value:
|
||||
TRUE Check ok
|
||||
FALSE Check fail
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
BOOLEAN RT28XXChipsetCheck(
|
||||
IN void *_dev_p)
|
||||
{
|
||||
struct usb_interface *intf = (struct usb_interface *)_dev_p;
|
||||
struct usb_device *dev_p = interface_to_usbdev(intf);
|
||||
UINT32 i;
|
||||
|
||||
|
||||
for(i=0; i<rtusb_usb_id_len; i++)
|
||||
{
|
||||
if (dev_p->descriptor.idVendor == rtusb_usb_id[i].idVendor &&
|
||||
dev_p->descriptor.idProduct == rtusb_usb_id[i].idProduct)
|
||||
{
|
||||
printk("rt2870: idVendor = 0x%x, idProduct = 0x%x\n",
|
||||
dev_p->descriptor.idVendor, dev_p->descriptor.idProduct);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (i == rtusb_usb_id_len)
|
||||
{
|
||||
printk("rt2870: Error! Device Descriptor not matching!\n");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
//tested for kernel 2.6series
|
||||
/**************************************************************************/
|
||||
/**************************************************************************/
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int rt2870_suspend(struct usb_interface *intf, pm_message_t state);
|
||||
static int rt2870_resume(struct usb_interface *intf);
|
||||
#endif // CONFIG_PM //
|
||||
|
||||
static int rtusb_probe (struct usb_interface *intf,
|
||||
const struct usb_device_id *id);
|
||||
static void rtusb_disconnect(struct usb_interface *intf);
|
||||
|
||||
static BOOLEAN USBDevConfigInit(
|
||||
IN struct usb_device *dev,
|
||||
IN struct usb_interface *intf,
|
||||
IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
struct usb_host_interface *iface_desc;
|
||||
ULONG BulkOutIdx;
|
||||
UINT32 i;
|
||||
|
||||
|
||||
/* get the active interface descriptor */
|
||||
iface_desc = intf->cur_altsetting;
|
||||
|
||||
/* get # of enpoints */
|
||||
pAd->NumberOfPipes = iface_desc->desc.bNumEndpoints;
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("NumEndpoints=%d\n", iface_desc->desc.bNumEndpoints));
|
||||
|
||||
/* Configure Pipes */
|
||||
BulkOutIdx = 0;
|
||||
|
||||
for(i=0; i<pAd->NumberOfPipes; i++)
|
||||
{
|
||||
if ((iface_desc->endpoint[i].desc.bmAttributes ==
|
||||
USB_ENDPOINT_XFER_BULK) &&
|
||||
((iface_desc->endpoint[i].desc.bEndpointAddress &
|
||||
USB_ENDPOINT_DIR_MASK) == USB_DIR_IN))
|
||||
{
|
||||
pAd->BulkInEpAddr = iface_desc->endpoint[i].desc.bEndpointAddress;
|
||||
pAd->BulkInMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize);
|
||||
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK IN MaxPacketSize = %d\n", pAd->BulkInMaxPacketSize));
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x\n", iface_desc->endpoint[i].desc.bEndpointAddress));
|
||||
}
|
||||
else if ((iface_desc->endpoint[i].desc.bmAttributes ==
|
||||
USB_ENDPOINT_XFER_BULK) &&
|
||||
((iface_desc->endpoint[i].desc.bEndpointAddress &
|
||||
USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT))
|
||||
{
|
||||
// there are 6 bulk out EP. EP6 highest priority.
|
||||
// EP1-4 is EDCA. EP5 is HCCA.
|
||||
pAd->BulkOutEpAddr[BulkOutIdx++] = iface_desc->endpoint[i].desc.bEndpointAddress;
|
||||
pAd->BulkOutMaxPacketSize = le2cpu16(iface_desc->endpoint[i].desc.wMaxPacketSize);
|
||||
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("BULK OUT MaxPacketSize = %d\n", pAd->BulkOutMaxPacketSize));
|
||||
DBGPRINT_RAW(RT_DEBUG_TRACE, ("EP address = 0x%2x \n", iface_desc->endpoint[i].desc.bEndpointAddress));
|
||||
}
|
||||
}
|
||||
|
||||
if (!(pAd->BulkInEpAddr && pAd->BulkOutEpAddr[0]))
|
||||
{
|
||||
printk("%s: Could not find both bulk-in and bulk-out endpoints\n", __FUNCTION__);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pAd->config = &dev->config->desc;
|
||||
usb_set_intfdata(intf, pAd);
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int rtusb_probe (struct usb_interface *intf,
|
||||
const struct usb_device_id *id)
|
||||
{
|
||||
RTMP_ADAPTER *pAd;
|
||||
struct usb_device *dev;
|
||||
int rv;
|
||||
|
||||
dev = interface_to_usbdev(intf);
|
||||
dev = usb_get_dev(dev);
|
||||
|
||||
rv = rt2870_probe(intf, dev, id, &pAd);
|
||||
if (rv != 0)
|
||||
usb_put_dev(dev);
|
||||
|
||||
return rv;
|
||||
}
|
||||
|
||||
|
||||
static void rtusb_disconnect(struct usb_interface *intf)
|
||||
{
|
||||
struct usb_device *dev = interface_to_usbdev(intf);
|
||||
PRTMP_ADAPTER pAd;
|
||||
|
||||
|
||||
pAd = usb_get_intfdata(intf);
|
||||
usb_set_intfdata(intf, NULL);
|
||||
|
||||
rt2870_disconnect(dev, pAd);
|
||||
}
|
||||
|
||||
|
||||
struct usb_driver rtusb_driver = {
|
||||
.name="rt2870",
|
||||
.probe=rtusb_probe,
|
||||
.disconnect=rtusb_disconnect,
|
||||
.id_table=rtusb_usb_id,
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
suspend: rt2870_suspend,
|
||||
resume: rt2870_resume,
|
||||
#endif
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
VOID RT2870RejectPendingPackets(
|
||||
IN PRTMP_ADAPTER pAd)
|
||||
{
|
||||
// clear PS packets
|
||||
// clear TxSw packets
|
||||
}
|
||||
|
||||
static int rt2870_suspend(
|
||||
struct usb_interface *intf,
|
||||
pm_message_t state)
|
||||
{
|
||||
struct net_device *net_dev;
|
||||
PRTMP_ADAPTER pAd = usb_get_intfdata(intf);
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_suspend()\n"));
|
||||
net_dev = pAd->net_dev;
|
||||
netif_device_detach(net_dev);
|
||||
|
||||
pAd->PM_FlgSuspend = 1;
|
||||
if (netif_running(net_dev)) {
|
||||
RTUSBCancelPendingBulkInIRP(pAd);
|
||||
RTUSBCancelPendingBulkOutIRP(pAd);
|
||||
}
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2870_suspend()\n"));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int rt2870_resume(
|
||||
struct usb_interface *intf)
|
||||
{
|
||||
struct net_device *net_dev;
|
||||
PRTMP_ADAPTER pAd = usb_get_intfdata(intf);
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===> rt2870_resume()\n"));
|
||||
|
||||
pAd->PM_FlgSuspend = 0;
|
||||
net_dev = pAd->net_dev;
|
||||
netif_device_attach(net_dev);
|
||||
netif_start_queue(net_dev);
|
||||
netif_carrier_on(net_dev);
|
||||
netif_wake_queue(net_dev);
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<=== rt2870_resume()\n"));
|
||||
return 0;
|
||||
}
|
||||
#endif // CONFIG_PM //
|
||||
|
||||
// Init driver module
|
||||
INT __init rtusb_init(void)
|
||||
{
|
||||
printk("rtusb init --->\n");
|
||||
return usb_register(&rtusb_driver);
|
||||
}
|
||||
|
||||
// Deinit driver module
|
||||
VOID __exit rtusb_exit(void)
|
||||
{
|
||||
usb_deregister(&rtusb_driver);
|
||||
printk("<--- rtusb exit\n");
|
||||
}
|
||||
|
||||
module_init(rtusb_init);
|
||||
module_exit(rtusb_exit);
|
||||
|
||||
|
||||
|
||||
|
||||
/*--------------------------------------------------------------------- */
|
||||
/* function declarations */
|
||||
/*--------------------------------------------------------------------- */
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
MLME kernel thread.
|
||||
|
||||
Arguments:
|
||||
*Context the pAd, driver control block pointer
|
||||
|
||||
Return Value:
|
||||
0 close the thread
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT MlmeThread(
|
||||
IN void *Context)
|
||||
{
|
||||
RTMP_ADAPTER *pAd;
|
||||
RTMP_OS_TASK *pTask;
|
||||
int status;
|
||||
status = 0;
|
||||
|
||||
pTask = (RTMP_OS_TASK *)Context;
|
||||
pAd = (PRTMP_ADAPTER)pTask->priv;
|
||||
|
||||
RtmpOSTaskCustomize(pTask);
|
||||
|
||||
while(!pTask->task_killed)
|
||||
{
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
|
||||
#else
|
||||
RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
|
||||
|
||||
/* unlock the device pointers */
|
||||
if (status != 0)
|
||||
{
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* lock the device pointers , need to check if required*/
|
||||
//down(&(pAd->usbdev_semaphore));
|
||||
|
||||
if (!pAd->PM_FlgSuspend)
|
||||
MlmeHandler(pAd);
|
||||
}
|
||||
|
||||
/* notify the exit routine that we're actually exiting now
|
||||
*
|
||||
* complete()/wait_for_completion() is similar to up()/down(),
|
||||
* except that complete() is safe in the case where the structure
|
||||
* is getting deleted in a parallel mode of execution (i.e. just
|
||||
* after the down() -- that's necessary for the thread-shutdown
|
||||
* case.
|
||||
*
|
||||
* complete_and_exit() goes even further than this -- it is safe in
|
||||
* the case that the thread of the caller is going away (not just
|
||||
* the structure) -- this is necessary for the module-remove case.
|
||||
* This is important in preemption kernels, which transfer the flow
|
||||
* of execution immediately upon a complete().
|
||||
*/
|
||||
DBGPRINT(RT_DEBUG_TRACE,( "<---%s\n",__FUNCTION__));
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
pTask->taskPID = THREAD_PID_INIT_VALUE;
|
||||
complete_and_exit (&pTask->taskComplete, 0);
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
USB command kernel thread.
|
||||
|
||||
Arguments:
|
||||
*Context the pAd, driver control block pointer
|
||||
|
||||
Return Value:
|
||||
0 close the thread
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
INT RTUSBCmdThread(
|
||||
IN void * Context)
|
||||
{
|
||||
RTMP_ADAPTER *pAd;
|
||||
RTMP_OS_TASK *pTask;
|
||||
int status;
|
||||
status = 0;
|
||||
|
||||
pTask = (RTMP_OS_TASK *)Context;
|
||||
pAd = (PRTMP_ADAPTER)pTask->priv;
|
||||
|
||||
RtmpOSTaskCustomize(pTask);
|
||||
|
||||
NdisAcquireSpinLock(&pAd->CmdQLock);
|
||||
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_RUNNING;
|
||||
NdisReleaseSpinLock(&pAd->CmdQLock);
|
||||
|
||||
while (pAd && pAd->CmdQ.CmdQState == RTMP_TASK_STAT_RUNNING)
|
||||
{
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
RTMP_WAIT_EVENT_INTERRUPTIBLE(pAd, pTask);
|
||||
#else
|
||||
/* lock the device pointers */
|
||||
RTMP_SEM_EVENT_WAIT(&(pTask->taskSema), status);
|
||||
|
||||
if (status != 0)
|
||||
{
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_HALT_IN_PROGRESS);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (pAd->CmdQ.CmdQState == RTMP_TASK_STAT_STOPED)
|
||||
break;
|
||||
|
||||
if (!pAd->PM_FlgSuspend)
|
||||
CMDHandler(pAd);
|
||||
}
|
||||
|
||||
if (pAd && !pAd->PM_FlgSuspend)
|
||||
{ // Clear the CmdQElements.
|
||||
CmdQElmt *pCmdQElmt = NULL;
|
||||
|
||||
NdisAcquireSpinLock(&pAd->CmdQLock);
|
||||
pAd->CmdQ.CmdQState = RTMP_TASK_STAT_STOPED;
|
||||
while(pAd->CmdQ.size)
|
||||
{
|
||||
RTUSBDequeueCmd(&pAd->CmdQ, &pCmdQElmt);
|
||||
if (pCmdQElmt)
|
||||
{
|
||||
if (pCmdQElmt->CmdFromNdis == TRUE)
|
||||
{
|
||||
if (pCmdQElmt->buffer != NULL)
|
||||
os_free_mem(pAd, pCmdQElmt->buffer);
|
||||
os_free_mem(pAd, (PUCHAR)pCmdQElmt);
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((pCmdQElmt->buffer != NULL) && (pCmdQElmt->bufferlength != 0))
|
||||
os_free_mem(pAd, pCmdQElmt->buffer);
|
||||
os_free_mem(pAd, (PUCHAR)pCmdQElmt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
NdisReleaseSpinLock(&pAd->CmdQLock);
|
||||
}
|
||||
/* notify the exit routine that we're actually exiting now
|
||||
*
|
||||
* complete()/wait_for_completion() is similar to up()/down(),
|
||||
* except that complete() is safe in the case where the structure
|
||||
* is getting deleted in a parallel mode of execution (i.e. just
|
||||
* after the down() -- that's necessary for the thread-shutdown
|
||||
* case.
|
||||
*
|
||||
* complete_and_exit() goes even further than this -- it is safe in
|
||||
* the case that the thread of the caller is going away (not just
|
||||
* the structure) -- this is necessary for the module-remove case.
|
||||
* This is important in preemption kernels, which transfer the flow
|
||||
* of execution immediately upon a complete().
|
||||
*/
|
||||
DBGPRINT(RT_DEBUG_TRACE,( "<---RTUSBCmdThread\n"));
|
||||
|
||||
#ifndef KTHREAD_SUPPORT
|
||||
pTask->taskPID = THREAD_PID_INIT_VALUE;
|
||||
complete_and_exit (&pTask->taskComplete, 0);
|
||||
#endif
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
VOID RTUSBWatchDog(IN RTMP_ADAPTER *pAd)
|
||||
{
|
||||
PHT_TX_CONTEXT pHTTXContext;
|
||||
int idx;
|
||||
ULONG irqFlags;
|
||||
PURB pUrb;
|
||||
BOOLEAN needDumpSeq = FALSE;
|
||||
UINT32 MACValue;
|
||||
UINT32 TxRxQ_Pcnt;
|
||||
|
||||
idx = 0;
|
||||
RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);
|
||||
if ((MACValue & 0xff) !=0 )
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("TX QUEUE 0 Not EMPTY(Value=0x%0x). !!!!!!!!!!!!!!!\n", MACValue));
|
||||
RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40012);
|
||||
while((MACValue &0xff) != 0 && (idx++ < 10))
|
||||
{
|
||||
RTMP_IO_READ32(pAd, TXRXQ_PCNT, &MACValue);
|
||||
RTMPusecDelay(1);
|
||||
}
|
||||
RTMP_IO_WRITE32(pAd, PBF_CFG, 0xf40006);
|
||||
}
|
||||
|
||||
if (pAd->watchDogRxOverFlowCnt >= 2)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Rx Bulk-In hanged! Cancel the pending Rx bulks request!\n"));
|
||||
if ((!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_BULKIN_RESET |
|
||||
fRTMP_ADAPTER_HALT_IN_PROGRESS |
|
||||
fRTMP_ADAPTER_NIC_NOT_EXIST))))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Call CMDTHREAD_RESET_BULK_IN to cancel the pending Rx Bulk!\n"));
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BULKIN_RESET);
|
||||
RTUSBEnqueueInternalCmd(pAd, CMDTHREAD_RESET_BULK_IN, NULL, 0);
|
||||
needDumpSeq = TRUE;
|
||||
}
|
||||
pAd->watchDogRxOverFlowCnt = 0;
|
||||
}
|
||||
|
||||
RTUSBReadMACRegister(pAd, 0x438, &TxRxQ_Pcnt);
|
||||
|
||||
for (idx = 0; idx < NUM_OF_TX_RING; idx++)
|
||||
{
|
||||
pUrb = NULL;
|
||||
|
||||
RTMP_IRQ_LOCK(&pAd->BulkOutLock[idx], irqFlags);
|
||||
if ((pAd->BulkOutPending[idx] == TRUE) && pAd->watchDogTxPendingCnt)
|
||||
{
|
||||
INT actual_length=0,transfer_buffer_length=0;
|
||||
BOOLEAN isDataPacket=FALSE;
|
||||
pAd->watchDogTxPendingCnt[idx]++;
|
||||
|
||||
if ((pAd->watchDogTxPendingCnt[idx] > 2) &&
|
||||
(!RTMP_TEST_FLAG(pAd, (fRTMP_ADAPTER_RESET_IN_PROGRESS | fRTMP_ADAPTER_HALT_IN_PROGRESS | fRTMP_ADAPTER_NIC_NOT_EXIST | fRTMP_ADAPTER_BULKOUT_RESET)))
|
||||
)
|
||||
{
|
||||
// FIXME: Following code just support single bulk out. If you wanna support multiple bulk out. Modify it!
|
||||
pHTTXContext = (PHT_TX_CONTEXT)(&pAd->TxContext[idx]);
|
||||
if (pHTTXContext->IRPPending)
|
||||
{ // Check TxContext.
|
||||
pUrb = pHTTXContext->pUrb;
|
||||
|
||||
actual_length=pUrb->actual_length;
|
||||
transfer_buffer_length=pUrb->transfer_buffer_length;
|
||||
isDataPacket=TRUE;
|
||||
}
|
||||
else if (idx == MGMTPIPEIDX)
|
||||
{
|
||||
PTX_CONTEXT pMLMEContext, pNULLContext, pPsPollContext;
|
||||
|
||||
//Check MgmtContext.
|
||||
pMLMEContext = (PTX_CONTEXT)(pAd->MgmtRing.Cell[pAd->MgmtRing.TxDmaIdx].AllocVa);
|
||||
pPsPollContext = (PTX_CONTEXT)(&pAd->PsPollContext);
|
||||
pNULLContext = (PTX_CONTEXT)(&pAd->NullContext);
|
||||
|
||||
if (pMLMEContext->IRPPending)
|
||||
{
|
||||
ASSERT(pMLMEContext->IRPPending);
|
||||
pUrb = pMLMEContext->pUrb;
|
||||
}
|
||||
else if (pNULLContext->IRPPending)
|
||||
{
|
||||
ASSERT(pNULLContext->IRPPending);
|
||||
pUrb = pNULLContext->pUrb;
|
||||
}
|
||||
else if (pPsPollContext->IRPPending)
|
||||
{
|
||||
ASSERT(pPsPollContext->IRPPending);
|
||||
pUrb = pPsPollContext->pUrb;
|
||||
}
|
||||
}
|
||||
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
|
||||
|
||||
|
||||
printk("%d:%d LTL=%d , TL=%d L:%d\n",idx,pAd->watchDogTxPendingCnt[idx],pAd->TransferedLength[idx]
|
||||
,actual_length,transfer_buffer_length);
|
||||
|
||||
if (pUrb)
|
||||
{
|
||||
if ((isDataPacket
|
||||
&& pAd->TransferedLength[idx]==actual_length
|
||||
&& pAd->TransferedLength[idx]<transfer_buffer_length
|
||||
&& actual_length!=0
|
||||
// && TxRxQ_Pcnt==0
|
||||
&& pAd->watchDogTxPendingCnt[idx]>3)
|
||||
|| isDataPacket==FALSE || pAd->watchDogTxPendingCnt[idx]>6)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Maybe the Tx Bulk-Out hanged! Cancel the pending Tx bulks request of idx(%d)!\n", idx));
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("Unlink the pending URB!\n"));
|
||||
// unlink it now
|
||||
RTUSB_UNLINK_URB(pUrb);
|
||||
// Sleep 200 microseconds to give cancellation time to work
|
||||
//RTMPusecDelay(200);
|
||||
needDumpSeq = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("Unkonw bulkOut URB maybe hanged!!!!!!!!!!!!\n"));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
|
||||
}
|
||||
|
||||
if (isDataPacket==TRUE)
|
||||
pAd->TransferedLength[idx]=actual_length;
|
||||
}
|
||||
else
|
||||
{
|
||||
RTMP_IRQ_UNLOCK(&pAd->BulkOutLock[idx], irqFlags);
|
||||
}
|
||||
}
|
||||
|
||||
// For Sigma debug, dump the ba_reordering sequence.
|
||||
if((needDumpSeq == TRUE) && (pAd->CommonCfg.bDisableReordering == 0))
|
||||
{
|
||||
USHORT Idx;
|
||||
PBA_REC_ENTRY pBAEntry = NULL;
|
||||
UCHAR count = 0;
|
||||
struct reordering_mpdu *mpdu_blk;
|
||||
|
||||
Idx = pAd->MacTab.Content[BSSID_WCID].BARecWcidArray[0];
|
||||
|
||||
pBAEntry = &pAd->BATable.BARecEntry[Idx];
|
||||
if((pBAEntry->list.qlen > 0) && (pBAEntry->list.next != NULL))
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("NICUpdateRawCounters():The Queueing pkt in reordering buffer:\n"));
|
||||
NdisAcquireSpinLock(&pBAEntry->RxReRingLock);
|
||||
mpdu_blk = pBAEntry->list.next;
|
||||
while (mpdu_blk)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("\t%d:Seq-%d, bAMSDU-%d!\n", count, mpdu_blk->Sequence, mpdu_blk->bAMSDU));
|
||||
mpdu_blk = mpdu_blk->next;
|
||||
count++;
|
||||
}
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("\npBAEntry->LastIndSeq=%d!\n", pBAEntry->LastIndSeq));
|
||||
NdisReleaseSpinLock(&pBAEntry->RxReRingLock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
========================================================================
|
||||
Routine Description:
|
||||
Release allocated resources.
|
||||
|
||||
Arguments:
|
||||
*dev Point to the PCI or USB device
|
||||
pAd driver control block pointer
|
||||
|
||||
Return Value:
|
||||
None
|
||||
|
||||
Note:
|
||||
========================================================================
|
||||
*/
|
||||
static void rt2870_disconnect(struct usb_device *dev, PRTMP_ADAPTER pAd)
|
||||
{
|
||||
DBGPRINT(RT_DEBUG_ERROR, ("rtusb_disconnect: unregister usbnet usb-%s-%s\n",
|
||||
dev->bus->bus_name, dev->devpath));
|
||||
if (!pAd)
|
||||
{
|
||||
usb_put_dev(dev);
|
||||
printk("rtusb_disconnect: pAd == NULL!\n");
|
||||
return;
|
||||
}
|
||||
RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_NIC_NOT_EXIST);
|
||||
|
||||
// for debug, wait to show some messages to /proc system
|
||||
udelay(1);
|
||||
|
||||
|
||||
RtmpPhyNetDevExit(pAd, pAd->net_dev);
|
||||
|
||||
// FIXME: Shall we need following delay and flush the schedule??
|
||||
udelay(1);
|
||||
flush_scheduled_work();
|
||||
udelay(1);
|
||||
|
||||
// free the root net_device
|
||||
RtmpOSNetDevFree(pAd->net_dev);
|
||||
|
||||
RtmpRaDevCtrlExit(pAd);
|
||||
|
||||
// release a use of the usb device structure
|
||||
usb_put_dev(dev);
|
||||
udelay(1);
|
||||
|
||||
DBGPRINT(RT_DEBUG_ERROR, (" RTUSB disconnect successfully\n"));
|
||||
}
|
||||
|
||||
|
||||
static int __devinit rt2870_probe(
|
||||
IN struct usb_interface *intf,
|
||||
IN struct usb_device *usb_dev,
|
||||
IN const struct usb_device_id *dev_id,
|
||||
IN RTMP_ADAPTER **ppAd)
|
||||
{
|
||||
struct net_device *net_dev = NULL;
|
||||
RTMP_ADAPTER *pAd = (RTMP_ADAPTER *) NULL;
|
||||
INT status, rv;
|
||||
PVOID handle;
|
||||
RTMP_OS_NETDEV_OP_HOOK netDevHook;
|
||||
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("===>rt2870_probe()!\n"));
|
||||
|
||||
// Check chipset vendor/product ID
|
||||
//if (RT28XXChipsetCheck(_dev_p) == FALSE)
|
||||
// goto err_out;
|
||||
|
||||
//RtmpDevInit=============================================
|
||||
// Allocate RTMP_ADAPTER adapter structure
|
||||
handle = kmalloc(sizeof(struct os_cookie), GFP_KERNEL);
|
||||
if (handle == NULL)
|
||||
{
|
||||
printk("rt2870_probe(): Allocate memory for os handle failed!\n");
|
||||
return -ENOMEM;
|
||||
}
|
||||
((POS_COOKIE)handle)->pUsb_Dev = usb_dev;
|
||||
|
||||
rv = RTMPAllocAdapterBlock(handle, &pAd);
|
||||
if (rv != NDIS_STATUS_SUCCESS)
|
||||
{
|
||||
kfree(handle);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
//USBDevInit==============================================
|
||||
if (USBDevConfigInit(usb_dev, intf, pAd) == FALSE)
|
||||
goto err_out_free_radev;
|
||||
|
||||
RtmpRaDevCtrlInit(pAd, RTMP_DEV_INF_USB);
|
||||
|
||||
//NetDevInit==============================================
|
||||
net_dev = RtmpPhyNetDevInit(pAd, &netDevHook);
|
||||
if (net_dev == NULL)
|
||||
goto err_out_free_radev;
|
||||
|
||||
// Here are the net_device structure with usb specific parameters.
|
||||
/* for supporting Network Manager.
|
||||
* Set the sysfs physical device reference for the network logical device if set prior to registration will
|
||||
* cause a symlink during initialization.
|
||||
*/
|
||||
SET_NETDEV_DEV(net_dev, &(usb_dev->dev));
|
||||
|
||||
pAd->StaCfg.OriDevType = net_dev->type;
|
||||
|
||||
//All done, it's time to register the net device to linux kernel.
|
||||
// Register this device
|
||||
status = RtmpOSNetDevAttach(net_dev, &netDevHook);
|
||||
if (status != 0)
|
||||
goto err_out_free_netdev;
|
||||
|
||||
#ifdef KTHREAD_SUPPORT
|
||||
init_waitqueue_head(&pAd->mlmeTask.kthread_q);
|
||||
init_waitqueue_head(&pAd->timerTask.kthread_q);
|
||||
init_waitqueue_head(&pAd->cmdQTask.kthread_q);
|
||||
#endif
|
||||
|
||||
*ppAd = pAd;
|
||||
|
||||
DBGPRINT(RT_DEBUG_TRACE, ("<===rt2870_probe()!\n"));
|
||||
|
||||
return 0;
|
||||
|
||||
/* --------------------------- ERROR HANDLE --------------------------- */
|
||||
err_out_free_netdev:
|
||||
RtmpOSNetDevFree(net_dev);
|
||||
|
||||
err_out_free_radev:
|
||||
RTMPFreeAdapter(pAd);
|
||||
|
||||
err_out:
|
||||
*ppAd = NULL;
|
||||
|
||||
return -1;
|
||||
|
||||
}
|
@ -67,7 +67,6 @@
|
||||
// Key Descriptor Version of Key Information
|
||||
#define DESC_TYPE_TKIP 1
|
||||
#define DESC_TYPE_AES 2
|
||||
#define DESC_TYPE_MESH 3
|
||||
|
||||
#define LEN_MSG1_2WAY 0x7f
|
||||
#define MAX_LEN_OF_EAP_HS 256
|
||||
@ -90,11 +89,17 @@
|
||||
#define TKIP_AP_RXMICK_OFFSET (TKIP_AP_TXMICK_OFFSET+LEN_TKIP_TXMICK)
|
||||
#define TKIP_GTK_LENGTH ((LEN_TKIP_EK)+(LEN_TKIP_RXMICK)+(LEN_TKIP_TXMICK))
|
||||
#define LEN_PTK ((LEN_EAP_KEY)+(LEN_TKIP_KEY))
|
||||
#define MIN_LEN_OF_GTK 5
|
||||
#define LEN_PMK 32
|
||||
#define LEN_PMK_NAME 16
|
||||
#define LEN_NONCE 32
|
||||
|
||||
// RSN IE Length definition
|
||||
#define MAX_LEN_OF_RSNIE 90
|
||||
#define MAX_LEN_OF_RSNIE 255
|
||||
#define MIN_LEN_OF_RSNIE 8
|
||||
|
||||
#define KEY_LIFETIME 3600
|
||||
|
||||
//EAP Packet Type
|
||||
#define EAPPacket 0
|
||||
#define EAPOLStart 1
|
||||
@ -119,6 +124,29 @@
|
||||
#define PEER_MSG3_RETRY_TIMER_CTR 10
|
||||
#define GROUP_MSG1_RETRY_TIMER_CTR 20
|
||||
|
||||
//#ifdef CONFIG_AP_SUPPORT
|
||||
// WPA mechanism retry timer interval
|
||||
#define PEER_MSG1_RETRY_EXEC_INTV 1000 // 1 sec
|
||||
#define PEER_MSG3_RETRY_EXEC_INTV 3000 // 3 sec
|
||||
#define GROUP_KEY_UPDATE_EXEC_INTV 1000 // 1 sec
|
||||
#define PEER_GROUP_KEY_UPDATE_INIV 2000 // 2 sec
|
||||
|
||||
#define ENQUEUE_EAPOL_START_TIMER 200 // 200 ms
|
||||
|
||||
// group rekey interval
|
||||
#define TIME_REKEY 0
|
||||
#define PKT_REKEY 1
|
||||
#define DISABLE_REKEY 2
|
||||
#define MAX_REKEY 2
|
||||
|
||||
#define MAX_REKEY_INTER 0x3ffffff
|
||||
//#endif // CONFIG_AP_SUPPORT //
|
||||
|
||||
#define GROUP_SUITE 0
|
||||
#define PAIRWISE_SUITE 1
|
||||
#define AKM_SUITE 2
|
||||
#define PMKID_LIST 3
|
||||
|
||||
|
||||
#define EAPOL_START_DISABLE 0
|
||||
#define EAPOL_START_PSK 1
|
||||
@ -129,8 +157,30 @@
|
||||
#define MIX_CIPHER_WPA2_TKIP_ON(x) (((x) & 0x02) != 0)
|
||||
#define MIX_CIPHER_WPA2_AES_ON(x) (((x) & 0x01) != 0)
|
||||
|
||||
#ifndef ROUND_UP
|
||||
#define ROUND_UP(__x, __y) \
|
||||
(((ULONG)((__x)+((__y)-1))) & ((ULONG)~((__y)-1)))
|
||||
#endif
|
||||
|
||||
#define SET_UINT16_TO_ARRARY(_V, _LEN) \
|
||||
{ \
|
||||
_V[0] = (_LEN & 0xFF00) >> 8; \
|
||||
_V[1] = (_LEN & 0xFF); \
|
||||
}
|
||||
|
||||
#define INC_UINT16_TO_ARRARY(_V, _LEN) \
|
||||
{ \
|
||||
UINT16 var_len; \
|
||||
\
|
||||
var_len = (_V[0]<<8) | (_V[1]); \
|
||||
var_len += _LEN; \
|
||||
\
|
||||
_V[0] = (var_len & 0xFF00) >> 8; \
|
||||
_V[1] = (var_len & 0xFF); \
|
||||
}
|
||||
|
||||
#define CONV_ARRARY_TO_UINT16(_V) ((_V[0]<<8) | (_V[1]))
|
||||
|
||||
|
||||
#define ADD_ONE_To_64BIT_VAR(_V) \
|
||||
{ \
|
||||
@ -297,6 +347,13 @@ typedef enum _WpaMixPairCipher
|
||||
WPA_TKIPAES_WPA2_TKIPAES = 0x0F,
|
||||
} WPA_MIX_PAIR_CIPHER;
|
||||
|
||||
// 802.1x authentication format
|
||||
typedef struct _IEEE8021X_FRAME {
|
||||
UCHAR Version; // 1.0
|
||||
UCHAR Type; // 0 = EAP Packet
|
||||
USHORT Length;
|
||||
} IEEE8021X_FRAME, *PIEEE8021X_FRAME;
|
||||
|
||||
typedef struct PACKED _RSN_IE_HEADER_STRUCT {
|
||||
UCHAR Eid;
|
||||
UCHAR Length;
|
||||
@ -324,4 +381,47 @@ typedef struct PACKED _RSN_CAPABILITY {
|
||||
USHORT PreAuth:1;
|
||||
} RSN_CAPABILITY, *PRSN_CAPABILITY;
|
||||
|
||||
|
||||
/*========================================
|
||||
The prototype is defined in cmm_wpa.c
|
||||
========================================*/
|
||||
BOOLEAN WpaMsgTypeSubst(
|
||||
IN UCHAR EAPType,
|
||||
OUT INT *MsgType);
|
||||
|
||||
VOID PRF(
|
||||
IN UCHAR *key,
|
||||
IN INT key_len,
|
||||
IN UCHAR *prefix,
|
||||
IN INT prefix_len,
|
||||
IN UCHAR *data,
|
||||
IN INT data_len,
|
||||
OUT UCHAR *output,
|
||||
IN INT len);
|
||||
|
||||
int PasswordHash(
|
||||
char *password,
|
||||
unsigned char *ssid,
|
||||
int ssidlength,
|
||||
unsigned char *output);
|
||||
|
||||
PUINT8 GetSuiteFromRSNIE(
|
||||
IN PUINT8 rsnie,
|
||||
IN UINT rsnie_len,
|
||||
IN UINT8 type,
|
||||
OUT UINT8 *count);
|
||||
|
||||
VOID WpaShowAllsuite(
|
||||
IN PUINT8 rsnie,
|
||||
IN UINT rsnie_len);
|
||||
|
||||
VOID RTMPInsertRSNIE(
|
||||
IN PUCHAR pFrameBuf,
|
||||
OUT PULONG pFrameLen,
|
||||
IN PUINT8 rsnie_ptr,
|
||||
IN UINT8 rsnie_len,
|
||||
IN PUINT8 pmkid_ptr,
|
||||
IN UINT8 pmkid_len);
|
||||
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,27 +1,36 @@
|
||||
#
|
||||
obj-$(CONFIG_RT2870) += rt2870sta.o
|
||||
|
||||
# TODO: all of these should be removed
|
||||
EXTRA_CFLAGS += -DLINUX -DAGGREGATION_SUPPORT -DPIGGYBACK_SUPPORT -DWMM_SUPPORT
|
||||
EXTRA_CFLAGS += -DRT2870 -DRT3070
|
||||
EXTRA_CFLAGS += -DRTMP_MAC_USB -DRTMP_USB_SUPPORT -DRT2870 -DRTMP_TIMER_TASK_SUPPORT
|
||||
EXTRA_CFLAGS += -DRTMP_RF_RW_SUPPORT -DRTMP_EFUSE_SUPPORT -DRT30xx -DRT3070
|
||||
EXTRA_CFLAGS += -DDBG
|
||||
|
||||
rt2870sta-objs := \
|
||||
common/md5.o \
|
||||
common/crypt_md5.o \
|
||||
common/crypt_sha2.o \
|
||||
common/crypt_hmac.o \
|
||||
common/mlme.o \
|
||||
common/rtmp_wep.o \
|
||||
common/cmm_wep.o \
|
||||
common/action.o \
|
||||
common/cmm_data.o \
|
||||
common/rtmp_init.o \
|
||||
common/rtmp_tkip.o \
|
||||
common/cmm_tkip.o \
|
||||
common/cmm_aes.o \
|
||||
common/cmm_sync.o \
|
||||
common/eeprom.o \
|
||||
common/cmm_sanity.o \
|
||||
common/cmm_info.o \
|
||||
common/cmm_cfg.o \
|
||||
common/cmm_wpa.o \
|
||||
common/dfs.o \
|
||||
common/spectrum.o \
|
||||
common/rtmp_timer.o \
|
||||
common/rt_channel.o \
|
||||
common/cmm_profile.o \
|
||||
common/cmm_asic.o \
|
||||
sta/assoc.o \
|
||||
sta/aironet.o \
|
||||
sta/auth.o \
|
||||
sta/auth_rsp.o \
|
||||
sta/sync.o \
|
||||
@ -34,10 +43,15 @@ rt2870sta-objs := \
|
||||
rt_main_dev.o \
|
||||
sta_ioctl.o \
|
||||
common/ba_action.o \
|
||||
2870_main_dev.o \
|
||||
common/2870_rtmp_init.o \
|
||||
usb_main_dev.o \
|
||||
rt_usb.o \
|
||||
common/cmm_mac_usb.o \
|
||||
common/rtusb_io.o \
|
||||
common/rtusb_bulk.o \
|
||||
common/rtusb_data.o \
|
||||
common/cmm_data_2870.o
|
||||
|
||||
common/cmm_data_usb.o \
|
||||
common/rtmp_mcu.o \
|
||||
common/ee_efuse.o \
|
||||
chips/rt30xx.o \
|
||||
common/rt_rf.o \
|
||||
chips/rt3070.o
|
||||
|
1
drivers/staging/rt2870/chips/rt3070.c
Normal file
1
drivers/staging/rt2870/chips/rt3070.c
Normal file
@ -0,0 +1 @@
|
||||
#include "../../rt2860/chips/rt3070.c"
|
1
drivers/staging/rt2870/chips/rt30xx.c
Normal file
1
drivers/staging/rt2870/chips/rt30xx.c
Normal file
@ -0,0 +1 @@
|
||||
#include "../../rt2860/chips/rt30xx.c"
|
File diff suppressed because it is too large
Load Diff
1
drivers/staging/rt2870/common/acction.c
Normal file
1
drivers/staging/rt2870/common/acction.c
Normal file
@ -0,0 +1 @@
|
||||
#include "../../rt2860/common/action.c"
|
1
drivers/staging/rt2870/common/cmm_aes.c
Normal file
1
drivers/staging/rt2870/common/cmm_aes.c
Normal file
@ -0,0 +1 @@
|
||||
#include "../../rt2860/common/cmm_aes.c"
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user