From: wlanfae <wlanfae@realtek.com>
authorLarry Finger <Larry.Finger@lwfinger.net>
Wed, 24 Aug 2011 00:00:42 +0000 (19:00 -0500)
committerLarry Finger <Larry.Finger@lwfinger.net>
Wed, 24 Aug 2011 00:00:42 +0000 (19:00 -0500)
[PATCH 1/8] rtl8192e: Import new version of driver from realtek

Signed-off-by: wlanfae <wlanfae@realtek.com>
Signed-off-by: Mike McCormack <mikem@ring3k.org>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
---

88 files changed:
drivers/staging/rtl8192e/Makefile
drivers/staging/rtl8192e/dot11d.c [new file with mode: 0644]
drivers/staging/rtl8192e/dot11d.h
drivers/staging/rtl8192e/ieee80211/dot11d.c [deleted file]
drivers/staging/rtl8192e/ieee80211/dot11d.h [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211.h [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.h [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_ccmp.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_tkip.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_wep.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_module.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_tx.c [deleted file]
drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_BA.h [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_BAProc.c [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_HT.h [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_HTProc.c [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_Qos.h [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_TS.h [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl819x_TSProc.c [deleted file]
drivers/staging/rtl8192e/ieee80211/rtl_crypto.h [deleted file]
drivers/staging/rtl8192e/internal.h [new file with mode: 0644]
drivers/staging/rtl8192e/kmap_types.h [new file with mode: 0644]
drivers/staging/rtl8192e/license [new file with mode: 0644]
drivers/staging/rtl8192e/r8190P_def.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8190P_hwimg.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8190P_hwimg.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8190P_rtl8256.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8190P_rtl8256.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_cmdpkt.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_cmdpkt.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_core.c.porig [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_core.c.rej [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_dev.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_dev.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_firmware.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_firmware.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_hw.h
drivers/staging/rtl8192e/r8192E_hwimg.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_hwimg.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_phy.c [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_phy.h [new file with mode: 0644]
drivers/staging/rtl8192e/r8192E_phyreg.h [new file with mode: 0644]
drivers/staging/rtl8192e/readme [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_BA.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_BAProc.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_HT.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_HTProc.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_Qos.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_TS.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl819x_TSProc.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_cam.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_cam.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_core.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_core.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_crypto.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_debug.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_debug.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_dm.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_dm.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_eeprom.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_eeprom.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_ethtool.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_pci.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_pci.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_pm.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_pm.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_ps.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_ps.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_wx.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtl_wx.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_crypt.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_crypt.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_crypt_ccmp.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_crypt_tkip.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_crypt_wep.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_endianfree.h [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_module.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_rx.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_softmac.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_softmac_wx.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_tx.c [new file with mode: 0644]
drivers/staging/rtl8192e/rtllib_wx.c [new file with mode: 0644]

index 6e410674359cc77ece47996f4433e59aa030eef4..7cf7a52875eaeee4fc199ec4ff731806f690bb82 100644 (file)
@@ -1,38 +1,46 @@
 NIC_SELECT = RTL8192E
 
-ccflags-y := -DRTL8192E
-ccflags-y += -std=gnu89
-ccflags-y += -O2
-ccflags-y += -DTHOMAS_TURBO
+ccflags-y += -DRTL8192E
+ccflags-y += -DEEPROM_OLD_FORMAT_SUPPORT=1
+ccflags-y += -DUSE_FW_SOURCE_IMG_FILE
+ccflags-y += -DENABLE_GPIO_RADIO_CTL
+ccflags-y += -DCONFIG_PM_RTL
+ccflags-y += -DCONFIG_PM
+ccflags-y += -DENABLE_DOT11D
+ccflags-y += -DHAVE_NET_DEVICE_OPS
 ccflags-y += -DENABLE_DOT11D
-
-ccflags-y += -DENABLE_IPS
-ccflags-y += -DENABLE_LPS
 
 r8192e_pci-objs :=             \
-       r8192E_core.o           \
-       r8180_93cx6.o           \
-       r8192E_wx.o             \
-       r8190_rtl8256.o         \
-       r819xE_phy.o            \
-       r819xE_firmware.o       \
-       r819xE_cmdpkt.o         \
-       r8192E_dm.o             \
-       r8192_pm.o              \
-       ieee80211/ieee80211_rx.o                \
-       ieee80211/ieee80211_softmac.o           \
-       ieee80211/ieee80211_tx.o                \
-       ieee80211/ieee80211_wx.o                \
-       ieee80211/ieee80211_module.o            \
-       ieee80211/ieee80211_softmac_wx.o        \
-       ieee80211/rtl819x_HTProc.o              \
-       ieee80211/rtl819x_TSProc.o              \
-       ieee80211/rtl819x_BAProc.o              \
-       ieee80211/dot11d.o                      \
-       ieee80211/ieee80211_crypt.o             \
-       ieee80211/ieee80211_crypt_tkip.o        \
-       ieee80211/ieee80211_crypt_ccmp.o        \
-       ieee80211/ieee80211_crypt_wep.o
+       rtl_core.o              \
+       rtl_eeprom.o            \
+       rtl_ps.o                \
+       rtl_wx.o                \
+       rtl_cam.o               \
+       rtl_dm.o                \
+       rtl_pm.o                \
+       rtl_pci.o               \
+       rtl_debug.o             \
+       rtl_ethtool.o           \
+       r8192E_dev.o            \
+       r8192E_phy.o            \
+       r8192E_firmware.o       \
+       r8192E_cmdpkt.o         \
+       r8192E_hwimg.o          \
+       r8190P_rtl8256.o        \
+       rtllib_rx.o             \
+       rtllib_softmac.o        \
+       rtllib_tx.o             \
+       rtllib_wx.o             \
+       rtllib_module.o         \
+       rtllib_softmac_wx.o     \
+       rtl819x_HTProc.o        \
+       rtl819x_TSProc.o        \
+       rtl819x_BAProc.o        \
+       dot11d.o                \
+       rtllib_crypt.o          \
+       rtllib_crypt_tkip.o     \
+       rtllib_crypt_ccmp.o     \
+       rtllib_crypt_wep.o
 
 obj-$(CONFIG_RTL8192E) += r8192e_pci.o
 
diff --git a/drivers/staging/rtl8192e/dot11d.c b/drivers/staging/rtl8192e/dot11d.c
new file mode 100644 (file)
index 0000000..ee0381e
--- /dev/null
@@ -0,0 +1,216 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "dot11d.h"
+
+struct channel_list {
+       u8      Channel[32];
+       u8      Len;
+};
+
+static struct channel_list ChannelPlan[] = {
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 36, 40, 44, 48, 52, 56, 60, 64,
+         149, 153, 157, 161, 165}, 24},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}, 11},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52, 56,
+         60, 64}, 21},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
+         56, 60, 64}, 22},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
+         56, 60, 64}, 22},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
+         56, 60, 64}, 22},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 36, 40, 44, 48, 52,
+        56, 60, 64}, 22},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14}, 14},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13}, 13},
+       {{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 52,
+         56, 60, 64}, 21}
+};
+
+void Dot11d_Init(struct rtllib_device *ieee)
+{
+       struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(ieee);
+       pDot11dInfo->bEnabled = false;
+
+       pDot11dInfo->State = DOT11D_STATE_NONE;
+       pDot11dInfo->CountryIeLen = 0;
+       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
+       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
+       RESET_CIE_WATCHDOG(ieee);
+
+}
+
+void Dot11d_Channelmap(u8 channel_plan, struct rtllib_device *ieee)
+{
+       int i, max_chan = 14, min_chan = 1;
+
+       ieee->bGlobalDomain = false;
+
+       if (ChannelPlan[channel_plan].Len != 0) {
+               memset(GET_DOT11D_INFO(ieee)->channel_map, 0,
+                      sizeof(GET_DOT11D_INFO(ieee)->channel_map));
+               for (i = 0; i < ChannelPlan[channel_plan].Len; i++) {
+                       if (ChannelPlan[channel_plan].Channel[i] < min_chan ||
+                           ChannelPlan[channel_plan].Channel[i] > max_chan)
+                               break;
+                       GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan
+                                       [channel_plan].Channel[i]] = 1;
+               }
+       }
+
+       switch (channel_plan) {
+       case COUNTRY_CODE_GLOBAL_DOMAIN:
+               ieee->bGlobalDomain = true;
+               for (i = 12; i <= 14; i++)
+                       GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
+               ieee->IbssStartChnl = 10;
+               ieee->ibss_maxjoin_chal = 11;
+               break;
+
+       case COUNTRY_CODE_WORLD_WIDE_13:
+               for (i = 12; i <= 13; i++)
+                       GET_DOT11D_INFO(ieee)->channel_map[i] = 2;
+               ieee->IbssStartChnl = 10;
+               ieee->ibss_maxjoin_chal = 11;
+               break;
+
+       default:
+               ieee->IbssStartChnl = 1;
+               ieee->ibss_maxjoin_chal = 14;
+               break;
+       }
+}
+
+
+void Dot11d_Reset(struct rtllib_device *ieee)
+{
+       struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(ieee);
+       u32 i;
+
+       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
+       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
+       for (i = 1; i <= 11; i++)
+               (pDot11dInfo->channel_map)[i] = 1;
+       for (i = 12; i <= 14; i++)
+               (pDot11dInfo->channel_map)[i] = 2;
+       pDot11dInfo->State = DOT11D_STATE_NONE;
+       pDot11dInfo->CountryIeLen = 0;
+       RESET_CIE_WATCHDOG(ieee);
+}
+
+void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr,
+                           u16 CoutryIeLen, u8 *pCoutryIe)
+{
+       struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
+       u8 i, j, NumTriples, MaxChnlNum;
+       struct chnl_txpow_triple *pTriple;
+
+       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
+       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
+       MaxChnlNum = 0;
+       NumTriples = (CoutryIeLen - 3) / 3;
+       pTriple = (struct chnl_txpow_triple *)(pCoutryIe + 3);
+       for (i = 0; i < NumTriples; i++) {
+               if (MaxChnlNum >= pTriple->FirstChnl) {
+                       printk(KERN_INFO "Dot11d_UpdateCountryIe(): Invalid"
+                              " country IE, skip it........1\n");
+                       return;
+               }
+               if (MAX_CHANNEL_NUMBER < (pTriple->FirstChnl +
+                   pTriple->NumChnls)) {
+                       printk(KERN_INFO "Dot11d_UpdateCountryIe(): Invalid "
+                              "country IE, skip it........2\n");
+                       return;
+               }
+
+               for (j = 0 ; j < pTriple->NumChnls; j++) {
+                       pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
+                       pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] =
+                                                pTriple->MaxTxPowerInDbm;
+                       MaxChnlNum = pTriple->FirstChnl + j;
+               }
+
+               pTriple = (struct chnl_txpow_triple *)((u8*)pTriple + 3);
+       }
+
+       UPDATE_CIE_SRC(dev, pTaddr);
+
+       pDot11dInfo->CountryIeLen = CoutryIeLen;
+       memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe, CoutryIeLen);
+       pDot11dInfo->State = DOT11D_STATE_LEARNED;
+}
+
+u8 DOT11D_GetMaxTxPwrInDbm(struct rtllib_device *dev, u8 Channel)
+{
+       struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
+       u8 MaxTxPwrInDbm = 255;
+
+       if (MAX_CHANNEL_NUMBER < Channel) {
+               printk(KERN_INFO "DOT11D_GetMaxTxPwrInDbm(): Invalid "
+                      "Channel\n");
+               return MaxTxPwrInDbm;
+       }
+       if (pDot11dInfo->channel_map[Channel])
+               MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];
+
+       return MaxTxPwrInDbm;
+}
+
+void DOT11D_ScanComplete(struct rtllib_device *dev)
+{
+       struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
+
+       switch (pDot11dInfo->State) {
+       case DOT11D_STATE_LEARNED:
+               pDot11dInfo->State = DOT11D_STATE_DONE;
+               break;
+       case DOT11D_STATE_DONE:
+               Dot11d_Reset(dev);
+               break;
+       case DOT11D_STATE_NONE:
+               break;
+       }
+}
+
+int ToLegalChannel(struct rtllib_device *dev, u8 channel)
+{
+       struct rt_dot11d_info *pDot11dInfo = GET_DOT11D_INFO(dev);
+       u8 default_chn = 0;
+       u32 i;
+
+       for (i = 1; i <= MAX_CHANNEL_NUMBER; i++) {
+               if (pDot11dInfo->channel_map[i] > 0) {
+                       default_chn = i;
+                       break;
+               }
+       }
+
+       if (MAX_CHANNEL_NUMBER < channel) {
+               printk(KERN_ERR "%s(): Invalid Channel\n", __func__);
+               return default_chn;
+       }
+
+       if (pDot11dInfo->channel_map[channel] > 0)
+               return channel;
+
+       return default_chn;
+}
index 8e644614f21d86320424be2deef112e5b0e00849..032f7004a7f07e57f88faee554718a4275fb21fb 100644 (file)
@@ -1,24 +1,42 @@
-#ifndef INC_DOT11D_H
-#define INC_DOT11D_H
-
-#ifdef ENABLE_DOT11D
-#include "ieee80211.h"
-
-struct _CHNL_TXPOWER_TRIPLE {
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef __INC_DOT11D_H
+#define __INC_DOT11D_H
+
+#include "rtllib.h"
+
+
+
+struct chnl_txpow_triple {
        u8 FirstChnl;
        u8  NumChnls;
        u8  MaxTxPowerInDbm;
 };
 
-enum _DOT11D_STATE {
+enum dot11d_state {
        DOT11D_STATE_NONE = 0,
        DOT11D_STATE_LEARNED,
        DOT11D_STATE_DONE,
 };
 
 /**
- * struct _RT_DOT11D_INFO
- * @CountryIeLen: value greater than 0 if @CountryIeBuf contains
+ * struct rt_dot11d_info * @CountryIeLen: value greater than 0 if @CountryIeBuf contains
  *               valid country information element.
  * @chanell_map: holds channel values
  *             0 - invalid,
@@ -27,18 +45,19 @@ enum _DOT11D_STATE {
  * @CountryIeSrcAddr - Source AP of the country IE
  */
 
-struct _RT_DOT11D_INFO {
+struct rt_dot11d_info {
+
        bool bEnabled;
 
        u16 CountryIeLen;
-       u8 CountryIeBuf[MAX_IE_LEN];
-       u8 CountryIeSrcAddr[6];
-       u8 CountryIeWatchdog;
+       u8  CountryIeBuf[MAX_IE_LEN];
+       u8  CountryIeSrcAddr[6];
+       u8  CountryIeWatchdog;
 
-       u8 channel_map[MAX_CHANNEL_NUMBER+1];
-       u8 MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
+       u8  channel_map[MAX_CHANNEL_NUMBER+1];
+       u8  MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
 
-       DOT11D_STATE State;
+       enum dot11d_state State;
 };
 
 static inline void cpMacAddr(unsigned char *des, unsigned char *src)
@@ -46,49 +65,41 @@ static inline void cpMacAddr(unsigned char *des, unsigned char *src)
        memcpy(des, src, 6);
 }
 
-#define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO) \
-                       ((__pIeeeDev)->pDot11dInfo))
+#define GET_DOT11D_INFO(__pIeeeDev)                    \
+        ((struct rt_dot11d_info *)((__pIeeeDev)->pDot11dInfo))
 
-#define IS_DOT11D_ENABLE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->bEnabled)
-#define IS_COUNTRY_IE_VALID(__pIeeeDev) \
-                       (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
+#define IS_DOT11D_ENABLE(__pIeeeDev)                   \
+        (GET_DOT11D_INFO(__pIeeeDev)->bEnabled)
+#define IS_COUNTRY_IE_VALID(__pIeeeDev)                        \
+       (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
 
-#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) \
-               eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-
-#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) \
-               cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
+#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa)            \
+        eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
+#define UPDATE_CIE_SRC(__pIeeeDev, __pTa)              \
+       cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
 
 #define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
-       (((__Ie).Length == 0 || (__Ie).Length != \
-       GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? FALSE : \
-       (!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, \
+       (((__Ie).Length == 0 || (__Ie).Length !=        \
+       GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ?    \
+       false : (!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf,     \
        (__Ie).Octet, (__Ie).Length)))
 
 #define CIE_WATCHDOG_TH 1
-#define GET_CIE_WATCHDOG(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)-> \
-                                                       CountryIeWatchdog)
+#define GET_CIE_WATCHDOG(__pIeeeDev)                           \
+        (GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog)
 #define RESET_CIE_WATCHDOG(__pIeeeDev) GET_CIE_WATCHDOG(__pIeeeDev) = 0
 #define UPDATE_CIE_WATCHDOG(__pIeeeDev) (++GET_CIE_WATCHDOG(__pIeeeDev))
 
-#define IS_DOT11D_STATE_DONE(__pIeeeDev) \
-               (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
-
-
-void Dot11d_Init(struct ieee80211_device *dev);
-
-void Dot11d_Reset(struct ieee80211_device *dev);
-
-void Dot11d_UpdateCountryIe(struct ieee80211_device *dev, u8 *pTaddr,
-               u16 CoutryIeLen, u8 *pCoutryIe);
-
-u8 DOT11D_GetMaxTxPwrInDbm(struct ieee80211_device *dev, u8 channel);
-
-void DOT11D_ScanComplete(struct ieee80211_device *dev);
-
-int IsLegalChannel(struct ieee80211_device *dev, u8 channel);
+#define IS_DOT11D_STATE_DONE(__pIeeeDev)                       \
+       (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
 
-int ToLegalChannel(struct ieee80211_device *dev, u8 channel);
+void Dot11d_Init(struct rtllib_device *dev);
+void Dot11d_Channelmap(u8 channel_plan, struct rtllib_device *ieee);
+void Dot11d_Reset(struct rtllib_device *dev);
+void Dot11d_UpdateCountryIe(struct rtllib_device *dev, u8 *pTaddr,
+                           u16 CoutryIeLen, u8 *pCoutryIe);
+u8 DOT11D_GetMaxTxPwrInDbm(struct rtllib_device *dev, u8 Channel);
+void DOT11D_ScanComplete(struct rtllib_device *dev);
+int ToLegalChannel(struct rtllib_device *dev, u8 channel);
 
-#endif /* ENABLE_DOT11D */
-#endif /* INC_DOT11D_H */
+#endif
diff --git a/drivers/staging/rtl8192e/ieee80211/dot11d.c b/drivers/staging/rtl8192e/ieee80211/dot11d.c
deleted file mode 100644 (file)
index 98e4648..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-#ifdef ENABLE_DOT11D
-//-----------------------------------------------------------------------------
-//     File:
-//             Dot11d.c
-//
-//     Description:
-//             Implement 802.11d.
-//
-//-----------------------------------------------------------------------------
-
-#include "dot11d.h"
-
-void
-Dot11d_Init(struct ieee80211_device *ieee)
-{
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
-
-       pDot11dInfo->bEnabled = 0;
-
-       pDot11dInfo->State = DOT11D_STATE_NONE;
-       pDot11dInfo->CountryIeLen = 0;
-       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
-       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
-       RESET_CIE_WATCHDOG(ieee);
-
-       printk("Dot11d_Init()\n");
-}
-
-//
-//     Description:
-//             Reset to the state as we are just entering a regulatory domain.
-//
-void
-Dot11d_Reset(struct ieee80211_device *ieee)
-{
-       u32 i;
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
-#if 0
-       if(!pDot11dInfo->bEnabled)
-               return;
-#endif
-       // Clear old channel map
-       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
-       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
-       // Set new channel map
-       for (i=1; i<=11; i++) {
-               (pDot11dInfo->channel_map)[i] = 1;
-       }
-       for (i=12; i<=14; i++) {
-               (pDot11dInfo->channel_map)[i] = 2;
-       }
-
-       pDot11dInfo->State = DOT11D_STATE_NONE;
-       pDot11dInfo->CountryIeLen = 0;
-       RESET_CIE_WATCHDOG(ieee);
-}
-
-//
-//     Description:
-//             Update country IE from Beacon or Probe Resopnse
-//             and configure PHY for operation in the regulatory domain.
-//
-//     TODO:
-//             Configure Tx power.
-//
-//     Assumption:
-//             1. IS_DOT11D_ENABLE() is TRUE.
-//             2. Input IE is an valid one.
-//
-void
-Dot11d_UpdateCountryIe(
-       struct ieee80211_device *dev,
-       u8 *            pTaddr,
-       u16     CoutryIeLen,
-       u8 * pCoutryIe
-       )
-{
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-       u8 i, j, NumTriples, MaxChnlNum;
-       PCHNL_TXPOWER_TRIPLE pTriple;
-
-       memset(pDot11dInfo->channel_map, 0, MAX_CHANNEL_NUMBER+1);
-       memset(pDot11dInfo->MaxTxPwrDbmList, 0xFF, MAX_CHANNEL_NUMBER+1);
-       MaxChnlNum = 0;
-       NumTriples = (CoutryIeLen - 3) / 3; // skip 3-byte country string.
-       pTriple = (PCHNL_TXPOWER_TRIPLE)(pCoutryIe + 3);
-       for(i = 0; i < NumTriples; i++)
-       {
-               if(MaxChnlNum >= pTriple->FirstChnl)
-               { // It is not in a monotonically increasing order, so stop processing.
-                       printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........1\n");
-                       return;
-               }
-               if(MAX_CHANNEL_NUMBER < (pTriple->FirstChnl + pTriple->NumChnls))
-               { // It is not a valid set of channel id, so stop processing.
-                       printk("Dot11d_UpdateCountryIe(): Invalid country IE, skip it........2\n");
-                       return;
-               }
-
-               for(j = 0 ; j < pTriple->NumChnls; j++)
-               {
-                       pDot11dInfo->channel_map[pTriple->FirstChnl + j] = 1;
-                       pDot11dInfo->MaxTxPwrDbmList[pTriple->FirstChnl + j] = pTriple->MaxTxPowerInDbm;
-                       MaxChnlNum = pTriple->FirstChnl + j;
-               }
-
-               pTriple = (PCHNL_TXPOWER_TRIPLE)((u8*)pTriple + 3);
-       }
-#if 1
-       printk("Channel List:");
-       for(i=1; i<= MAX_CHANNEL_NUMBER; i++)
-               if(pDot11dInfo->channel_map[i] > 0)
-                       printk(" %d", i);
-       printk("\n");
-#endif
-
-       UPDATE_CIE_SRC(dev, pTaddr);
-
-       pDot11dInfo->CountryIeLen = CoutryIeLen;
-       memcpy(pDot11dInfo->CountryIeBuf, pCoutryIe,CoutryIeLen);
-       pDot11dInfo->State = DOT11D_STATE_LEARNED;
-}
-
-
-u8
-DOT11D_GetMaxTxPwrInDbm(
-       struct ieee80211_device *dev,
-       u8 Channel
-       )
-{
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-       u8 MaxTxPwrInDbm = 255;
-
-       if(MAX_CHANNEL_NUMBER < Channel)
-       {
-               printk("DOT11D_GetMaxTxPwrInDbm(): Invalid Channel\n");
-               return MaxTxPwrInDbm;
-       }
-       if(pDot11dInfo->channel_map[Channel])
-       {
-               MaxTxPwrInDbm = pDot11dInfo->MaxTxPwrDbmList[Channel];
-       }
-
-       return MaxTxPwrInDbm;
-}
-
-
-void
-DOT11D_ScanComplete(
-       struct ieee80211_device * dev
-       )
-{
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-
-       switch(pDot11dInfo->State)
-       {
-       case DOT11D_STATE_LEARNED:
-               pDot11dInfo->State = DOT11D_STATE_DONE;
-               break;
-
-       case DOT11D_STATE_DONE:
-               if( GET_CIE_WATCHDOG(dev) == 0 )
-               { // Reset country IE if previous one is gone.
-                       Dot11d_Reset(dev);
-               }
-               break;
-       case DOT11D_STATE_NONE:
-               break;
-       }
-}
-
-int IsLegalChannel(
-       struct ieee80211_device * dev,
-       u8 channel
-)
-{
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-
-       if(MAX_CHANNEL_NUMBER < channel)
-       {
-               printk("IsLegalChannel(): Invalid Channel\n");
-               return 0;
-       }
-       if(pDot11dInfo->channel_map[channel] > 0)
-               return 1;
-       return 0;
-}
-
-int ToLegalChannel(
-       struct ieee80211_device * dev,
-       u8 channel
-)
-{
-       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(dev);
-       u8 default_chn = 0;
-       u32 i = 0;
-
-       for (i=1; i<= MAX_CHANNEL_NUMBER; i++)
-       {
-               if(pDot11dInfo->channel_map[i] > 0)
-               {
-                       default_chn = i;
-                       break;
-               }
-       }
-
-       if(MAX_CHANNEL_NUMBER < channel)
-       {
-               printk("IsLegalChannel(): Invalid Channel\n");
-               return default_chn;
-       }
-
-       if(pDot11dInfo->channel_map[channel] > 0)
-               return channel;
-
-       return default_chn;
-}
-#endif
diff --git a/drivers/staging/rtl8192e/ieee80211/dot11d.h b/drivers/staging/rtl8192e/ieee80211/dot11d.h
deleted file mode 100644 (file)
index 15b7a4b..0000000
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef __INC_DOT11D_H
-#define __INC_DOT11D_H
-
-#ifdef ENABLE_DOT11D
-#include "ieee80211.h"
-
-//#define ENABLE_DOT11D
-
-//#define DOT11D_MAX_CHNL_NUM 83
-
-typedef struct _CHNL_TXPOWER_TRIPLE {
-       u8 FirstChnl;
-       u8  NumChnls;
-       u8  MaxTxPowerInDbm;
-}CHNL_TXPOWER_TRIPLE, *PCHNL_TXPOWER_TRIPLE;
-
-typedef enum _DOT11D_STATE {
-       DOT11D_STATE_NONE = 0,
-       DOT11D_STATE_LEARNED,
-       DOT11D_STATE_DONE,
-}DOT11D_STATE;
-
-typedef struct _RT_DOT11D_INFO {
-       //DECLARE_RT_OBJECT(RT_DOT11D_INFO);
-
-       bool bEnabled; // dot11MultiDomainCapabilityEnabled
-
-       u16 CountryIeLen; // > 0 if CountryIeBuf[] contains valid country information element.
-       u8  CountryIeBuf[MAX_IE_LEN];
-       u8  CountryIeSrcAddr[6]; // Source AP of the country IE.
-       u8  CountryIeWatchdog;
-
-       u8  channel_map[MAX_CHANNEL_NUMBER+1];  //!!!Value 0: Invalid, 1: Valid (active scan), 2: Valid (passive scan)
-       //u8  ChnlListLen; // #Bytes valid in ChnlList[].
-       //u8  ChnlList[DOT11D_MAX_CHNL_NUM];
-       u8  MaxTxPwrDbmList[MAX_CHANNEL_NUMBER+1];
-
-       DOT11D_STATE State;
-}RT_DOT11D_INFO, *PRT_DOT11D_INFO;
-#define eqMacAddr(a,b)         ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
-#define cpMacAddr(des,src)           ((des)[0]=(src)[0],(des)[1]=(src)[1],(des)[2]=(src)[2],(des)[3]=(src)[3],(des)[4]=(src)[4],(des)[5]=(src)[5])
-#define GET_DOT11D_INFO(__pIeeeDev) ((PRT_DOT11D_INFO)((__pIeeeDev)->pDot11dInfo))
-
-#define IS_DOT11D_ENABLE(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->bEnabled
-#define IS_COUNTRY_IE_VALID(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen > 0)
-
-#define IS_EQUAL_CIE_SRC(__pIeeeDev, __pTa) eqMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-#define UPDATE_CIE_SRC(__pIeeeDev, __pTa) cpMacAddr(GET_DOT11D_INFO(__pIeeeDev)->CountryIeSrcAddr, __pTa)
-
-#define IS_COUNTRY_IE_CHANGED(__pIeeeDev, __Ie) \
-       (((__Ie).Length == 0 || (__Ie).Length != GET_DOT11D_INFO(__pIeeeDev)->CountryIeLen) ? \
-       FALSE : \
-       (!memcmp(GET_DOT11D_INFO(__pIeeeDev)->CountryIeBuf, (__Ie).Octet, (__Ie).Length)))
-
-#define CIE_WATCHDOG_TH 1
-#define GET_CIE_WATCHDOG(__pIeeeDev) GET_DOT11D_INFO(__pIeeeDev)->CountryIeWatchdog
-#define RESET_CIE_WATCHDOG(__pIeeeDev) GET_CIE_WATCHDOG(__pIeeeDev) = 0
-#define UPDATE_CIE_WATCHDOG(__pIeeeDev) ++GET_CIE_WATCHDOG(__pIeeeDev)
-
-#define IS_DOT11D_STATE_DONE(__pIeeeDev) (GET_DOT11D_INFO(__pIeeeDev)->State == DOT11D_STATE_DONE)
-
-
-void
-Dot11d_Init(
-       struct ieee80211_device *dev
-       );
-
-void
-Dot11d_Reset(
-       struct ieee80211_device *dev
-       );
-
-void
-Dot11d_UpdateCountryIe(
-       struct ieee80211_device *dev,
-       u8 *            pTaddr,
-       u16     CoutryIeLen,
-       u8 * pCoutryIe
-       );
-
-u8
-DOT11D_GetMaxTxPwrInDbm(
-       struct ieee80211_device *dev,
-       u8 Channel
-       );
-
-void
-DOT11D_ScanComplete(
-       struct ieee80211_device * dev
-       );
-
-int IsLegalChannel(
-       struct ieee80211_device * dev,
-       u8 channel
-);
-
-int ToLegalChannel(
-       struct ieee80211_device * dev,
-       u8 channel
-);
-#endif //ENABLE_DOT11D
-#endif // #ifndef __INC_DOT11D_H
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211.h b/drivers/staging/rtl8192e/ieee80211/ieee80211.h
deleted file mode 100644 (file)
index 6d7963e..0000000
+++ /dev/null
@@ -1,2636 +0,0 @@
-/*
- * Merged with mainline ieee80211.h in Aug 2004.  Original ieee802_11
- * remains copyright by the original authors
- *
- * Portions of the merged code are based on Host AP (software wireless
- * LAN access point) driver for Intersil Prism2/2.5/3.
- *
- * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
- * <jkmaline@cc.hut.fi>
- * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
- *
- * Adaption to a generic IEEE 802.11 stack by James Ketrenos
- * <jketreno@linux.intel.com>
- * Copyright (c) 2004, Intel Corporation
- *
- * Modified for Realtek's wi-fi cards by Andrea Merello
- * <andreamrl@tiscali.it>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- */
-#ifndef IEEE80211_H
-#define IEEE80211_H
-#include <linux/if_ether.h> /* ETH_ALEN */
-#include <linux/kernel.h>   /* ARRAY_SIZE */
-#include <linux/module.h>
-#include <linux/jiffies.h>
-#include <linux/timer.h>
-#include <linux/sched.h>
-#include <linux/semaphore.h>
-#include <linux/interrupt.h>
-
-#include <linux/delay.h>
-#include <linux/wireless.h>
-
-#include "rtl819x_HT.h"
-#include "rtl819x_BA.h"
-#include "rtl819x_TS.h"
-
-#ifndef IW_MODE_MONITOR
-#define IW_MODE_MONITOR 6
-#endif
-
-#ifndef IWEVCUSTOM
-#define IWEVCUSTOM 0x8c02
-#endif
-
-#ifndef container_of
-/**
- * container_of - cast a member of a structure out to the containing structure
- *
- * @ptr:        the pointer to the member.
- * @type:       the type of the container struct this is embedded in.
- * @member:     the name of the member within the struct.
- *
- */
-#define container_of(ptr, type, member) ({                      \
-        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
-        (type *)( (char *)__mptr - offsetof(type,member) );})
-#endif
-
-#define KEY_TYPE_NA            0x0
-#define KEY_TYPE_WEP40                 0x1
-#define KEY_TYPE_TKIP          0x2
-#define KEY_TYPE_CCMP          0x4
-#define KEY_TYPE_WEP104                0x5
-
-/* added for rtl819x tx procedure */
-#define MAX_QUEUE_SIZE         0x10
-
-//
-// 8190 queue mapping
-//
-#define BK_QUEUE                               0
-#define BE_QUEUE                               1
-#define VI_QUEUE                               2
-#define VO_QUEUE                               3
-#define HCCA_QUEUE                             4
-#define TXCMD_QUEUE                            5
-#define MGNT_QUEUE                             6
-#define HIGH_QUEUE                             7
-#define BEACON_QUEUE                           8
-
-#define LOW_QUEUE                              BE_QUEUE
-#define NORMAL_QUEUE                           MGNT_QUEUE
-
-//added by amy for ps
-#define SWRF_TIMEOUT                           50
-
-//added by amy for LEAP related
-#define IE_CISCO_FLAG_POSITION         0x08    // Flag byte: byte 8, numbered from 0.
-#define SUPPORT_CKIP_MIC                       0x08    // bit3
-#define SUPPORT_CKIP_PK                        0x10    // bit4
-/* defined for skb cb field */
-/* At most 28 byte */
-typedef struct cb_desc {
-        /* Tx Desc Related flags (8-9) */
-       u8 bLastIniPkt:1;
-       u8 bCmdOrInit:1;
-        u8 bFirstSeg:1;
-        u8 bLastSeg:1;
-        u8 bEncrypt:1;
-        u8 bTxDisableRateFallBack:1;
-        u8 bTxUseDriverAssingedRate:1;
-        u8 bHwSec:1; //indicate whether use Hw security. WB
-
-        u8 reserved1;
-
-        /* Tx Firmware Relaged flags (10-11)*/
-        u8 bCTSEnable:1;
-        u8 bRTSEnable:1;
-        u8 bUseShortGI:1;
-        u8 bUseShortPreamble:1;
-        u8 bTxEnableFwCalcDur:1;
-        u8 bAMPDUEnable:1;
-        u8 bRTSSTBC:1;
-        u8 RTSSC:1;
-
-        u8 bRTSBW:1;
-        u8 bPacketBW:1;
-       u8 bRTSUseShortPreamble:1;
-       u8 bRTSUseShortGI:1;
-       u8 bMulticast:1;
-       u8 bBroadcast:1;
-        //u8 reserved2:2;
-        u8 drv_agg_enable:1;
-        u8 reserved2:1;
-
-        /* Tx Desc related element(12-19) */
-        u8 rata_index;
-        u8 queue_index;
-        //u8 reserved3;
-        //u8 reserved4;
-        u16 txbuf_size;
-        //u8 reserved5;
-       u8 RATRIndex;
-        u8 reserved6;
-        u8 reserved7;
-        u8 reserved8;
-
-        /* Tx firmware related element(20-27) */
-        u8 data_rate;
-        u8 rts_rate;
-        u8 ampdu_factor;
-        u8 ampdu_density;
-        //u8 reserved9;
-        //u8 reserved10;
-        //u8 reserved11;
-        u8 DrvAggrNum;
-       u16 pkt_size;
-        u8 reserved12;
-
-       u8 bdhcp;
-}cb_desc, *pcb_desc;
-
-/*--------------------------Define -------------------------------------------*/
-#define MGN_1M                  0x02
-#define MGN_2M                  0x04
-#define MGN_5_5M                0x0b
-#define MGN_11M                 0x16
-
-#define MGN_6M                  0x0c
-#define MGN_9M                  0x12
-#define MGN_12M                 0x18
-#define MGN_18M                 0x24
-#define MGN_24M                 0x30
-#define MGN_36M                 0x48
-#define MGN_48M                 0x60
-#define MGN_54M                 0x6c
-
-#define MGN_MCS0                0x80
-#define MGN_MCS1                0x81
-#define MGN_MCS2                0x82
-#define MGN_MCS3                0x83
-#define MGN_MCS4                0x84
-#define MGN_MCS5                0x85
-#define MGN_MCS6                0x86
-#define MGN_MCS7                0x87
-#define MGN_MCS8                0x88
-#define MGN_MCS9                0x89
-#define MGN_MCS10               0x8a
-#define MGN_MCS11               0x8b
-#define MGN_MCS12               0x8c
-#define MGN_MCS13               0x8d
-#define MGN_MCS14               0x8e
-#define MGN_MCS15               0x8f
-
-//----------------------------------------------------------------------------
-//             802.11 Management frame Reason Code field
-//----------------------------------------------------------------------------
-enum   _ReasonCode{
-       unspec_reason   = 0x1,
-       auth_not_valid  = 0x2,
-       deauth_lv_ss    = 0x3,
-       inactivity              = 0x4,
-       ap_overload     = 0x5,
-       class2_err              = 0x6,
-       class3_err              = 0x7,
-       disas_lv_ss     = 0x8,
-       asoc_not_auth   = 0x9,
-
-       //----MIC_CHECK
-       mic_failure     = 0xe,
-       //----END MIC_CHECK
-
-       // Reason code defined in 802.11i D10.0 p.28.
-       invalid_IE              = 0x0d,
-       four_way_tmout  = 0x0f,
-       two_way_tmout   = 0x10,
-       IE_dismatch     = 0x11,
-       invalid_Gcipher = 0x12,
-       invalid_Pcipher = 0x13,
-       invalid_AKMP    = 0x14,
-       unsup_RSNIEver = 0x15,
-       invalid_RSNIE   = 0x16,
-       auth_802_1x_fail= 0x17,
-       ciper_reject            = 0x18,
-
-       // Reason code defined in 7.3.1.7, 802.1e D13.0, p.42. Added by Annie, 2005-11-15.
-       QoS_unspec              = 0x20, // 32
-       QAP_bandwidth   = 0x21, // 33
-       poor_condition  = 0x22, // 34
-       no_facility     = 0x23, // 35
-                                                       // Where is 36???
-       req_declined    = 0x25, // 37
-       invalid_param   = 0x26, // 38
-       req_not_honored= 0x27,  // 39
-       TS_not_created  = 0x2F, // 47
-       DL_not_allowed  = 0x30, // 48
-       dest_not_exist  = 0x31, // 49
-       dest_not_QSTA   = 0x32, // 50
-};
-
-
-
-#define aSifsTime       (((priv->ieee80211->current_network.mode == IEEE_A)||(priv->ieee80211->current_network.mode == IEEE_N_24G)||(priv->ieee80211->current_network.mode == IEEE_N_5G))? 16 : 10)
-
-#define MGMT_QUEUE_NUM 5
-
-#define IEEE_CMD_SET_WPA_PARAM                 1
-#define        IEEE_CMD_SET_WPA_IE                     2
-#define IEEE_CMD_SET_ENCRYPTION                        3
-#define IEEE_CMD_MLME                          4
-
-#define IEEE_PARAM_WPA_ENABLED                 1
-#define IEEE_PARAM_TKIP_COUNTERMEASURES                2
-#define IEEE_PARAM_DROP_UNENCRYPTED            3
-#define IEEE_PARAM_PRIVACY_INVOKED             4
-#define IEEE_PARAM_AUTH_ALGS                   5
-#define IEEE_PARAM_IEEE_802_1X                 6
-//It should consistent with the driver_XXX.c
-//   David, 2006.9.26
-#define IEEE_PARAM_WPAX_SELECT                 7
-//Added for notify the encryption type selection
-//   David, 2006.9.26
-#define IEEE_PROTO_WPA                         1
-#define IEEE_PROTO_RSN                         2
-//Added for notify the encryption type selection
-//   David, 2006.9.26
-#define IEEE_WPAX_USEGROUP                     0
-#define IEEE_WPAX_WEP40                                1
-#define IEEE_WPAX_TKIP                         2
-#define IEEE_WPAX_WRAP                         3
-#define IEEE_WPAX_CCMP                         4
-#define IEEE_WPAX_WEP104                       5
-
-#define IEEE_KEY_MGMT_IEEE8021X                        1
-#define IEEE_KEY_MGMT_PSK                      2
-
-#define IEEE_MLME_STA_DEAUTH                   1
-#define IEEE_MLME_STA_DISASSOC                 2
-
-
-#define IEEE_CRYPT_ERR_UNKNOWN_ALG             2
-#define IEEE_CRYPT_ERR_UNKNOWN_ADDR            3
-#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED       4
-#define IEEE_CRYPT_ERR_KEY_SET_FAILED          5
-#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED       6
-#define IEEE_CRYPT_ERR_CARD_CONF_FAILED                7
-
-
-#define        IEEE_CRYPT_ALG_NAME_LEN                 16
-
-#define MAX_IE_LEN  0xff
-
-// added for kernel conflict
-#define ieee80211_crypt_deinit_entries         ieee80211_crypt_deinit_entries_rsl
-#define ieee80211_crypt_deinit_handler         ieee80211_crypt_deinit_handler_rsl
-#define ieee80211_crypt_delayed_deinit         ieee80211_crypt_delayed_deinit_rsl
-#define ieee80211_register_crypto_ops          ieee80211_register_crypto_ops_rsl
-#define ieee80211_unregister_crypto_ops ieee80211_unregister_crypto_ops_rsl
-#define ieee80211_get_crypto_ops       ieee80211_get_crypto_ops_rsl
-
-#define ieee80211_ccmp_null            ieee80211_ccmp_null_rsl
-
-#define ieee80211_tkip_null            ieee80211_tkip_null_rsl
-
-#define ieee80211_wep_null             ieee80211_wep_null_rsl
-
-#define free_ieee80211                 free_ieee80211_rsl
-#define alloc_ieee80211                        alloc_ieee80211_rsl
-
-#define ieee80211_rx                   ieee80211_rx_rsl
-#define ieee80211_rx_mgt               ieee80211_rx_mgt_rsl
-
-#define ieee80211_get_beacon           ieee80211_get_beacon_rsl
-#define ieee80211_rtl_wake_queue               ieee80211_rtl_wake_queue_rsl
-#define ieee80211_rtl_stop_queue               ieee80211_rtl_stop_queue_rsl
-#define ieee80211_reset_queue          ieee80211_reset_queue_rsl
-#define ieee80211_softmac_stop_protocol        ieee80211_softmac_stop_protocol_rsl
-#define ieee80211_softmac_start_protocol ieee80211_softmac_start_protocol_rsl
-#define ieee80211_is_shortslot         ieee80211_is_shortslot_rsl
-#define ieee80211_is_54g               ieee80211_is_54g_rsl
-#define ieee80211_wpa_supplicant_ioctl ieee80211_wpa_supplicant_ioctl_rsl
-#define ieee80211_ps_tx_ack            ieee80211_ps_tx_ack_rsl
-#define ieee80211_softmac_xmit         ieee80211_softmac_xmit_rsl
-#define ieee80211_stop_send_beacons    ieee80211_stop_send_beacons_rsl
-#define notify_wx_assoc_event          notify_wx_assoc_event_rsl
-#define SendDisassociation             SendDisassociation_rsl
-#define ieee80211_disassociate         ieee80211_disassociate_rsl
-#define ieee80211_start_send_beacons   ieee80211_start_send_beacons_rsl
-#define ieee80211_stop_scan            ieee80211_stop_scan_rsl
-#define ieee80211_send_probe_requests  ieee80211_send_probe_requests_rsl
-#define ieee80211_softmac_scan_syncro  ieee80211_softmac_scan_syncro_rsl
-#define ieee80211_start_scan_syncro    ieee80211_start_scan_syncro_rsl
-
-#define ieee80211_wx_get_essid         ieee80211_wx_get_essid_rsl
-#define ieee80211_wx_set_essid         ieee80211_wx_set_essid_rsl
-#define ieee80211_wx_set_rate          ieee80211_wx_set_rate_rsl
-#define ieee80211_wx_get_rate          ieee80211_wx_get_rate_rsl
-#define ieee80211_wx_set_wap           ieee80211_wx_set_wap_rsl
-#define ieee80211_wx_get_wap           ieee80211_wx_get_wap_rsl
-#define ieee80211_wx_set_mode          ieee80211_wx_set_mode_rsl
-#define ieee80211_wx_get_mode          ieee80211_wx_get_mode_rsl
-#define ieee80211_wx_set_scan          ieee80211_wx_set_scan_rsl
-#define ieee80211_wx_get_freq          ieee80211_wx_get_freq_rsl
-#define ieee80211_wx_set_freq          ieee80211_wx_set_freq_rsl
-#define ieee80211_wx_set_rawtx         ieee80211_wx_set_rawtx_rsl
-#define ieee80211_wx_get_name          ieee80211_wx_get_name_rsl
-#define ieee80211_wx_set_power         ieee80211_wx_set_power_rsl
-#define ieee80211_wx_get_power         ieee80211_wx_get_power_rsl
-#define ieee80211_wlan_frequencies     ieee80211_wlan_frequencies_rsl
-#define ieee80211_wx_set_rts           ieee80211_wx_set_rts_rsl
-#define ieee80211_wx_get_rts           ieee80211_wx_get_rts_rsl
-
-#define ieee80211_txb_free             ieee80211_txb_free_rsl
-
-#define ieee80211_wx_set_gen_ie                ieee80211_wx_set_gen_ie_rsl
-#define ieee80211_wx_get_scan          ieee80211_wx_get_scan_rsl
-#define ieee80211_wx_set_encode                ieee80211_wx_set_encode_rsl
-#define ieee80211_wx_get_encode                ieee80211_wx_get_encode_rsl
-#define ieee80211_wx_set_mlme          ieee80211_wx_set_mlme_rsl
-#define ieee80211_wx_set_auth          ieee80211_wx_set_auth_rsl
-#define ieee80211_wx_set_encode_ext    ieee80211_wx_set_encode_ext_rsl
-#define ieee80211_wx_get_encode_ext    ieee80211_wx_get_encode_ext_rsl
-
-
-typedef struct ieee_param {
-       u32 cmd;
-       u8 sta_addr[ETH_ALEN];
-        union {
-               struct {
-                       u8 name;
-                       u32 value;
-               } wpa_param;
-               struct {
-                       u32 len;
-                       u8 reserved[32];
-                       u8 data[0];
-               } wpa_ie;
-               struct{
-                       int command;
-                       int reason_code;
-               } mlme;
-               struct {
-                       u8 alg[IEEE_CRYPT_ALG_NAME_LEN];
-                       u8 set_tx;
-                       u32 err;
-                       u8 idx;
-                       u8 seq[8]; /* sequence counter (set: RX, get: TX) */
-                       u16 key_len;
-                       u8 key[0];
-               } crypt;
-       } u;
-}ieee_param;
-
-
-// linux under 2.6.9 release may not support it, so modify it for common use
-#define MSECS(t) msecs_to_jiffies(t)
-#define msleep_interruptible_rsl  msleep_interruptible
-
-#define IEEE80211_DATA_LEN             2304
-/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
-   6.2.1.1.2.
-
-   The figure in section 7.1.2 suggests a body size of up to 2312
-   bytes is allowed, which is a bit confusing, I suspect this
-   represents the 2304 bytes of real data, plus a possible 8 bytes of
-   WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
-#define IEEE80211_1ADDR_LEN 10
-#define IEEE80211_2ADDR_LEN 16
-#define IEEE80211_3ADDR_LEN 24
-#define IEEE80211_4ADDR_LEN 30
-#define IEEE80211_FCS_LEN    4
-#define IEEE80211_HLEN                  (IEEE80211_4ADDR_LEN)
-#define IEEE80211_FRAME_LEN             (IEEE80211_DATA_LEN + IEEE80211_HLEN)
-#define IEEE80211_MGMT_HDR_LEN 24
-#define IEEE80211_DATA_HDR3_LEN 24
-#define IEEE80211_DATA_HDR4_LEN 30
-
-#define MIN_FRAG_THRESHOLD     256U
-#define MAX_FRAG_THRESHOLD     2346U
-
-
-/* Frame control field constants */
-#define IEEE80211_FCTL_VERS            0x0003
-#define IEEE80211_FCTL_FTYPE           0x000c
-#define IEEE80211_FCTL_STYPE           0x00f0
-#define IEEE80211_FCTL_FRAMETYPE       0x00fc
-#define IEEE80211_FCTL_TODS            0x0100
-#define IEEE80211_FCTL_FROMDS          0x0200
-#define IEEE80211_FCTL_DSTODS          0x0300 //added by david
-#define IEEE80211_FCTL_MOREFRAGS       0x0400
-#define IEEE80211_FCTL_RETRY           0x0800
-#define IEEE80211_FCTL_PM              0x1000
-#define IEEE80211_FCTL_MOREDATA                0x2000
-#define IEEE80211_FCTL_WEP             0x4000
-#define IEEE80211_FCTL_ORDER           0x8000
-
-#define IEEE80211_FTYPE_MGMT           0x0000
-#define IEEE80211_FTYPE_CTL            0x0004
-#define IEEE80211_FTYPE_DATA           0x0008
-
-/* management */
-#define IEEE80211_STYPE_ASSOC_REQ      0x0000
-#define IEEE80211_STYPE_ASSOC_RESP     0x0010
-#define IEEE80211_STYPE_REASSOC_REQ    0x0020
-#define IEEE80211_STYPE_REASSOC_RESP   0x0030
-#define IEEE80211_STYPE_PROBE_REQ      0x0040
-#define IEEE80211_STYPE_PROBE_RESP     0x0050
-#define IEEE80211_STYPE_BEACON         0x0080
-#define IEEE80211_STYPE_ATIM           0x0090
-#define IEEE80211_STYPE_DISASSOC       0x00A0
-#define IEEE80211_STYPE_AUTH           0x00B0
-#define IEEE80211_STYPE_DEAUTH         0x00C0
-#define IEEE80211_STYPE_MANAGE_ACT     0x00D0
-
-/* control */
-#define IEEE80211_STYPE_PSPOLL         0x00A0
-#define IEEE80211_STYPE_RTS            0x00B0
-#define IEEE80211_STYPE_CTS            0x00C0
-#define IEEE80211_STYPE_ACK            0x00D0
-#define IEEE80211_STYPE_CFEND          0x00E0
-#define IEEE80211_STYPE_CFENDACK       0x00F0
-#define IEEE80211_STYPE_BLOCKACK   0x0094
-
-/* data */
-#define IEEE80211_STYPE_DATA           0x0000
-#define IEEE80211_STYPE_DATA_CFACK     0x0010
-#define IEEE80211_STYPE_DATA_CFPOLL    0x0020
-#define IEEE80211_STYPE_DATA_CFACKPOLL 0x0030
-#define IEEE80211_STYPE_NULLFUNC       0x0040
-#define IEEE80211_STYPE_CFACK          0x0050
-#define IEEE80211_STYPE_CFPOLL         0x0060
-#define IEEE80211_STYPE_CFACKPOLL      0x0070
-#define IEEE80211_STYPE_QOS_DATA       0x0080 //added for WMM 2006/8/2
-#define IEEE80211_STYPE_QOS_NULL       0x00C0
-
-#define IEEE80211_SCTL_FRAG            0x000F
-#define IEEE80211_SCTL_SEQ             0xFFF0
-
-/* QOS control */
-#define IEEE80211_QCTL_TID              0x000F
-
-#define        FC_QOS_BIT                                      BIT7
-#define IsDataFrame(pdu)                       ( ((pdu[0] & 0x0C)==0x08) ? true : false )
-#define        IsLegacyDataFrame(pdu)  (IsDataFrame(pdu) && (!(pdu[0]&FC_QOS_BIT)) )
-//added by wb. Is this right?
-#define IsQoSDataFrame(pframe)  ((*(u16*)pframe&(IEEE80211_STYPE_QOS_DATA|IEEE80211_FTYPE_DATA)) == (IEEE80211_STYPE_QOS_DATA|IEEE80211_FTYPE_DATA))
-#define Frame_Order(pframe)     (*(u16*)pframe&IEEE80211_FCTL_ORDER)
-#define SN_LESS(a, b)          (((a-b)&0x800)!=0)
-#define SN_EQUAL(a, b) (a == b)
-#define MAX_DEV_ADDR_SIZE 8
-typedef enum _ACT_CATEGORY{
-        ACT_CAT_QOS = 1,
-        ACT_CAT_DLS = 2,
-        ACT_CAT_BA  = 3,
-        ACT_CAT_HT  = 7,
-        ACT_CAT_WMM = 17,
-} ACT_CATEGORY, *PACT_CATEGORY;
-
-typedef enum _TS_ACTION{
-        ACT_ADDTSREQ = 0,
-        ACT_ADDTSRSP = 1,
-        ACT_DELTS    = 2,
-        ACT_SCHEDULE = 3,
-} TS_ACTION, *PTS_ACTION;
-
-typedef enum _BA_ACTION{
-        ACT_ADDBAREQ = 0,
-        ACT_ADDBARSP = 1,
-        ACT_DELBA    = 2,
-} BA_ACTION, *PBA_ACTION;
-
-typedef enum _InitialGainOpType{
-       IG_Backup=0,
-       IG_Restore,
-       IG_Max
-}InitialGainOpType;
-
-/* debug macros */
-#define CONFIG_IEEE80211_DEBUG
-#ifdef CONFIG_IEEE80211_DEBUG
-extern u32 ieee80211_debug_level;
-#define IEEE80211_DEBUG(level, fmt, args...) \
-do { if (ieee80211_debug_level & (level)) \
-  printk(KERN_DEBUG "ieee80211: " fmt, ## args); } while (0)
-//wb added to debug out data buf
-//if you want print DATA buffer related BA, please set ieee80211_debug_level to DATA|BA
-#define IEEE80211_DEBUG_DATA(level, data, datalen)     \
-       do{ if ((ieee80211_debug_level & (level)) == (level))   \
-               {       \
-                       int i;                                  \
-                       u8* pdata = (u8*) data;                 \
-                       printk(KERN_DEBUG "ieee80211: %s()\n", __FUNCTION__);   \
-                       for(i=0; i<(int)(datalen); i++)                 \
-                       {                                               \
-                               printk("%2x ", pdata[i]);               \
-                               if ((i+1)%16 == 0) printk("\n");        \
-                       }                               \
-                       printk("\n");                   \
-               }                                       \
-       } while (0)
-#else
-#define IEEE80211_DEBUG(level, fmt, args...) do {} while (0)
-#define IEEE80211_DEBUG_DATA(level, data, datalen) do {} while(0)
-#endif /* CONFIG_IEEE80211_DEBUG */
-
-/* debug macros not dependent on CONFIG_IEEE80211_DEBUG */
-
-/*
- * To use the debug system;
- *
- * If you are defining a new debug classification, simply add it to the #define
- * list here in the form of:
- *
- * #define IEEE80211_DL_xxxx VALUE
- *
- * shifting value to the left one bit from the previous entry.  xxxx should be
- * the name of the classification (for example, WEP)
- *
- * You then need to either add a IEEE80211_xxxx_DEBUG() macro definition for your
- * classification, or use IEEE80211_DEBUG(IEEE80211_DL_xxxx, ...) whenever you want
- * to send output to that classification.
- *
- * To add your debug level to the list of levels seen when you perform
- *
- * % cat /proc/net/ipw/debug_level
- *
- * you simply need to add your entry to the ipw_debug_levels array.
- *
- * If you do not see debug_level in /proc/net/ipw then you do not have
- * CONFIG_IEEE80211_DEBUG defined in your kernel configuration
- *
- */
-
-#define IEEE80211_DL_INFO          (1<<0)
-#define IEEE80211_DL_WX            (1<<1)
-#define IEEE80211_DL_SCAN          (1<<2)
-#define IEEE80211_DL_STATE         (1<<3)
-#define IEEE80211_DL_MGMT          (1<<4)
-#define IEEE80211_DL_FRAG          (1<<5)
-#define IEEE80211_DL_EAP           (1<<6)
-#define IEEE80211_DL_DROP          (1<<7)
-
-#define IEEE80211_DL_TX            (1<<8)
-#define IEEE80211_DL_RX            (1<<9)
-
-#define IEEE80211_DL_HT                   (1<<10)  //HT
-#define IEEE80211_DL_BA                   (1<<11)  //ba
-#define IEEE80211_DL_TS                   (1<<12)  //TS
-#define IEEE80211_DL_QOS           (1<<13)
-#define IEEE80211_DL_REORDER      (1<<14)
-#define IEEE80211_DL_IOT          (1<<15)
-#define IEEE80211_DL_IPS          (1<<16)
-#define IEEE80211_DL_TRACE        (1<<29)  //trace function, need to user net_ratelimit() together in order not to print too much to the screen
-#define IEEE80211_DL_DATA         (1<<30)   //use this flag to control whether print data buf out.
-#define IEEE80211_DL_ERR          (1<<31)   //always open
-#define IEEE80211_ERROR(f, a...) printk(KERN_ERR "ieee80211: " f, ## a)
-#define IEEE80211_WARNING(f, a...) printk(KERN_WARNING "ieee80211: " f, ## a)
-#define IEEE80211_DEBUG_INFO(f, a...)   IEEE80211_DEBUG(IEEE80211_DL_INFO, f, ## a)
-
-#define IEEE80211_DEBUG_WX(f, a...)     IEEE80211_DEBUG(IEEE80211_DL_WX, f, ## a)
-#define IEEE80211_DEBUG_SCAN(f, a...)   IEEE80211_DEBUG(IEEE80211_DL_SCAN, f, ## a)
-#define IEEE80211_DEBUG_STATE(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_STATE, f, ## a)
-#define IEEE80211_DEBUG_MGMT(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_MGMT, f, ## a)
-#define IEEE80211_DEBUG_FRAG(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_FRAG, f, ## a)
-#define IEEE80211_DEBUG_EAP(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_EAP, f, ## a)
-#define IEEE80211_DEBUG_DROP(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_DROP, f, ## a)
-#define IEEE80211_DEBUG_TX(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_TX, f, ## a)
-#define IEEE80211_DEBUG_RX(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_RX, f, ## a)
-#define IEEE80211_DEBUG_QOS(f, a...)  IEEE80211_DEBUG(IEEE80211_DL_QOS, f, ## a)
-
-#ifdef CONFIG_IEEE80211_DEBUG
-/* Added by Annie, 2005-11-22. */
-#define MAX_STR_LEN     64
-/* I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22.*/
-#define PRINTABLE(_ch)  (_ch>'!' && _ch<'~')
-#define IEEE80211_PRINT_STR(_Comp, _TitleString, _Ptr, _Len)                                   \
-                        if((_Comp) & level)                                                    \
-                        {                                                                       \
-                                int             __i;                                            \
-                                u8  buffer[MAX_STR_LEN];                                       \
-                                int length = (_Len<MAX_STR_LEN)? _Len : (MAX_STR_LEN-1) ;      \
-                                memset(buffer, 0, MAX_STR_LEN);                                \
-                                memcpy(buffer, (u8 *)_Ptr, length );                           \
-                                for( __i=0; __i<MAX_STR_LEN; __i++ )                            \
-                                {                                                               \
-                                     if( !PRINTABLE(buffer[__i]) )   buffer[__i] = '?';        \
-                                }                                                               \
-                                buffer[length] = '\0';                                          \
-                                printk("Rtl819x: ");                                           \
-                                printk(_TitleString);                                         \
-                                printk(": %d, <%s>\n", _Len, buffer);                         \
-                        }
-#else
-#define IEEE80211_PRINT_STR(_Comp, _TitleString, _Ptr, _Len)  do {} while (0)
-#endif
-
-#include <linux/netdevice.h>
-#include <linux/if_arp.h> /* ARPHRD_ETHER */
-
-#ifndef WIRELESS_SPY
-#define WIRELESS_SPY           // enable iwspy support
-#endif
-#include <net/iw_handler.h>    // new driver API
-
-#ifndef ETH_P_PAE
-#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
-#endif /* ETH_P_PAE */
-
-#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
-
-#ifndef ETH_P_80211_RAW
-#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
-#endif
-
-/* IEEE 802.11 defines */
-
-#define P80211_OUI_LEN 3
-
-struct ieee80211_snap_hdr {
-
-        u8    dsap;   /* always 0xAA */
-        u8    ssap;   /* always 0xAA */
-        u8    ctrl;   /* always 0x03 */
-        u8    oui[P80211_OUI_LEN];    /* organizational universal id */
-
-} __attribute__ ((packed));
-
-#define SNAP_SIZE sizeof(struct ieee80211_snap_hdr)
-
-#define WLAN_FC_GET_VERS(fc) ((fc) & IEEE80211_FCTL_VERS)
-#define WLAN_FC_GET_TYPE(fc) ((fc) & IEEE80211_FCTL_FTYPE)
-#define WLAN_FC_GET_STYPE(fc) ((fc) & IEEE80211_FCTL_STYPE)
-#define WLAN_FC_MORE_DATA(fc) ((fc) & IEEE80211_FCTL_MOREDATA)
-
-
-#define WLAN_FC_GET_FRAMETYPE(fc) ((fc) & IEEE80211_FCTL_FRAMETYPE)
-#define WLAN_GET_SEQ_FRAG(seq) ((seq) & IEEE80211_SCTL_FRAG)
-#define WLAN_GET_SEQ_SEQ(seq)  (((seq) & IEEE80211_SCTL_SEQ) >> 4)
-
-/* Authentication algorithms */
-#define WLAN_AUTH_OPEN 0
-#define WLAN_AUTH_SHARED_KEY 1
-#define WLAN_AUTH_LEAP 2
-
-#define WLAN_AUTH_CHALLENGE_LEN 128
-
-#define WLAN_CAPABILITY_BSS (1<<0)
-#define WLAN_CAPABILITY_IBSS (1<<1)
-#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
-#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
-#define WLAN_CAPABILITY_PRIVACY (1<<4)
-#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
-#define WLAN_CAPABILITY_PBCC (1<<6)
-#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
-#define WLAN_CAPABILITY_SPECTRUM_MGMT (1<<8)
-#define WLAN_CAPABILITY_QOS (1<<9)
-#define WLAN_CAPABILITY_SHORT_SLOT (1<<10)
-#define WLAN_CAPABILITY_DSSS_OFDM (1<<13)
-
-/* 802.11g ERP information element */
-#define WLAN_ERP_NON_ERP_PRESENT (1<<0)
-#define WLAN_ERP_USE_PROTECTION (1<<1)
-#define WLAN_ERP_BARKER_PREAMBLE (1<<2)
-
-/* Status codes */
-enum ieee80211_statuscode {
-        WLAN_STATUS_SUCCESS = 0,
-        WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
-        WLAN_STATUS_CAPS_UNSUPPORTED = 10,
-        WLAN_STATUS_REASSOC_NO_ASSOC = 11,
-        WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
-        WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
-        WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
-        WLAN_STATUS_CHALLENGE_FAIL = 15,
-        WLAN_STATUS_AUTH_TIMEOUT = 16,
-        WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
-        WLAN_STATUS_ASSOC_DENIED_RATES = 18,
-        /* 802.11b */
-        WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
-        WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
-        WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
-        /* 802.11h */
-        WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
-        WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
-        WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
-        /* 802.11g */
-        WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
-        WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
-        /* 802.11i */
-        WLAN_STATUS_INVALID_IE = 40,
-        WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
-        WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
-        WLAN_STATUS_INVALID_AKMP = 43,
-        WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
-        WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
-        WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
-};
-
-/* Reason codes */
-enum ieee80211_reasoncode {
-        WLAN_REASON_UNSPECIFIED = 1,
-        WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
-        WLAN_REASON_DEAUTH_LEAVING = 3,
-        WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
-        WLAN_REASON_DISASSOC_AP_BUSY = 5,
-        WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
-        WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
-        WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
-        WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
-        /* 802.11h */
-        WLAN_REASON_DISASSOC_BAD_POWER = 10,
-        WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
-        /* 802.11i */
-        WLAN_REASON_INVALID_IE = 13,
-        WLAN_REASON_MIC_FAILURE = 14,
-        WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
-        WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
-        WLAN_REASON_IE_DIFFERENT = 17,
-        WLAN_REASON_INVALID_GROUP_CIPHER = 18,
-        WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
-        WLAN_REASON_INVALID_AKMP = 20,
-        WLAN_REASON_UNSUPP_RSN_VERSION = 21,
-        WLAN_REASON_INVALID_RSN_IE_CAP = 22,
-        WLAN_REASON_IEEE8021X_FAILED = 23,
-        WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
-};
-
-#define IEEE80211_STATMASK_SIGNAL (1<<0)
-#define IEEE80211_STATMASK_RSSI (1<<1)
-#define IEEE80211_STATMASK_NOISE (1<<2)
-#define IEEE80211_STATMASK_RATE (1<<3)
-#define IEEE80211_STATMASK_WEMASK 0x7
-
-#define IEEE80211_CCK_MODULATION    (1<<0)
-#define IEEE80211_OFDM_MODULATION   (1<<1)
-
-#define IEEE80211_24GHZ_BAND     (1<<0)
-#define IEEE80211_52GHZ_BAND     (1<<1)
-
-#define IEEE80211_CCK_RATE_LEN                 4
-#define IEEE80211_CCK_RATE_1MB                 0x02
-#define IEEE80211_CCK_RATE_2MB                 0x04
-#define IEEE80211_CCK_RATE_5MB                 0x0B
-#define IEEE80211_CCK_RATE_11MB                        0x16
-#define IEEE80211_OFDM_RATE_LEN                8
-#define IEEE80211_OFDM_RATE_6MB                        0x0C
-#define IEEE80211_OFDM_RATE_9MB                        0x12
-#define IEEE80211_OFDM_RATE_12MB               0x18
-#define IEEE80211_OFDM_RATE_18MB               0x24
-#define IEEE80211_OFDM_RATE_24MB               0x30
-#define IEEE80211_OFDM_RATE_36MB               0x48
-#define IEEE80211_OFDM_RATE_48MB               0x60
-#define IEEE80211_OFDM_RATE_54MB               0x6C
-#define IEEE80211_BASIC_RATE_MASK              0x80
-
-#define IEEE80211_CCK_RATE_1MB_MASK            (1<<0)
-#define IEEE80211_CCK_RATE_2MB_MASK            (1<<1)
-#define IEEE80211_CCK_RATE_5MB_MASK            (1<<2)
-#define IEEE80211_CCK_RATE_11MB_MASK           (1<<3)
-#define IEEE80211_OFDM_RATE_6MB_MASK           (1<<4)
-#define IEEE80211_OFDM_RATE_9MB_MASK           (1<<5)
-#define IEEE80211_OFDM_RATE_12MB_MASK          (1<<6)
-#define IEEE80211_OFDM_RATE_18MB_MASK          (1<<7)
-#define IEEE80211_OFDM_RATE_24MB_MASK          (1<<8)
-#define IEEE80211_OFDM_RATE_36MB_MASK          (1<<9)
-#define IEEE80211_OFDM_RATE_48MB_MASK          (1<<10)
-#define IEEE80211_OFDM_RATE_54MB_MASK          (1<<11)
-
-#define IEEE80211_CCK_RATES_MASK               0x0000000F
-#define IEEE80211_CCK_BASIC_RATES_MASK (IEEE80211_CCK_RATE_1MB_MASK | \
-       IEEE80211_CCK_RATE_2MB_MASK)
-#define IEEE80211_CCK_DEFAULT_RATES_MASK       (IEEE80211_CCK_BASIC_RATES_MASK | \
-        IEEE80211_CCK_RATE_5MB_MASK | \
-        IEEE80211_CCK_RATE_11MB_MASK)
-
-#define IEEE80211_OFDM_RATES_MASK              0x00000FF0
-#define IEEE80211_OFDM_BASIC_RATES_MASK        (IEEE80211_OFDM_RATE_6MB_MASK | \
-       IEEE80211_OFDM_RATE_12MB_MASK | \
-       IEEE80211_OFDM_RATE_24MB_MASK)
-#define IEEE80211_OFDM_DEFAULT_RATES_MASK      (IEEE80211_OFDM_BASIC_RATES_MASK | \
-       IEEE80211_OFDM_RATE_9MB_MASK  | \
-       IEEE80211_OFDM_RATE_18MB_MASK | \
-       IEEE80211_OFDM_RATE_36MB_MASK | \
-       IEEE80211_OFDM_RATE_48MB_MASK | \
-       IEEE80211_OFDM_RATE_54MB_MASK)
-#define IEEE80211_DEFAULT_RATES_MASK (IEEE80211_OFDM_DEFAULT_RATES_MASK | \
-                                IEEE80211_CCK_DEFAULT_RATES_MASK)
-
-#define IEEE80211_NUM_OFDM_RATES           8
-#define IEEE80211_NUM_CCK_RATES                    4
-#define IEEE80211_OFDM_SHIFT_MASK_A         4
-
-
-/* this is stolen and modified from the madwifi driver*/
-#define IEEE80211_FC0_TYPE_MASK                0x0c
-#define IEEE80211_FC0_TYPE_DATA                0x08
-#define IEEE80211_FC0_SUBTYPE_MASK     0xB0
-#define IEEE80211_FC0_SUBTYPE_QOS      0x80
-
-#define IEEE80211_QOS_HAS_SEQ(fc) \
-       (((fc) & (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) == \
-        (IEEE80211_FC0_TYPE_DATA | IEEE80211_FC0_SUBTYPE_QOS))
-
-/* this is stolen from ipw2200 driver */
-#define IEEE_IBSS_MAC_HASH_SIZE 31
-struct ieee_ibss_seq {
-       u8 mac[ETH_ALEN];
-       u16 seq_num[17];
-       u16 frag_num[17];
-       unsigned long packet_time[17];
-       struct list_head list;
-};
-
-/* NOTE: This data is for statistical purposes; not all hardware provides this
- *       information for frames received.  Not setting these will not cause
- *       any adverse affects. */
-struct ieee80211_rx_stats {
-       u32 mac_time[2];
-       s8 rssi;
-       u8 signal;
-       u8 noise;
-       u16 rate; /* in 100 kbps */
-       u8 received_channel;
-       u8 control;
-       u8 mask;
-       u8 freq;
-       u16 len;
-       u64 tsf;
-       u32 beacon_time;
-       u8 nic_type;
-       u16       Length;
-       u8        SignalQuality; // in 0-100 index.
-       s32       RecvSignalPower; // Real power in dBm for this packet, no beautification and aggregation.
-       s8        RxPower; // in dBm Translate from PWdB
-       u8        SignalStrength; // in 0-100 index.
-       u16       bHwError:1;
-       u16       bCRC:1;
-       u16       bICV:1;
-       u16       bShortPreamble:1;
-       u16       Antenna:1;      //for rtl8185
-       u16       Decrypted:1;    //for rtl8185, rtl8187
-       u16       Wakeup:1;       //for rtl8185
-       u16       Reserved0:1;    //for rtl8185
-       u8        AGC;
-       u32       TimeStampLow;
-       u32       TimeStampHigh;
-       bool      bShift;
-       bool      bIsQosData;             // Added by Annie, 2005-12-22.
-       u8        UserPriority;
-
-       //1!!!!!!!!!!!!!!!!!!!!!!!!!!!
-       //1Attention Please!!!<11n or 8190 specific code should be put below this line>
-       //1!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-       u8        RxDrvInfoSize;
-       u8        RxBufShift;
-       bool      bIsAMPDU;
-       bool      bFirstMPDU;
-       bool      bContainHTC;
-       u32       RxPWDBAll;
-       u8        RxMIMOSignalStrength[4];        // in 0~100 index
-       s8        RxMIMOSignalQuality[2];
-       bool      bPacketMatchBSSID;
-       bool      bIsCCK;
-       bool      bPacketToSelf;
-       u8*       virtual_address;
-       bool              bPacketBeacon;        //cosa add for rssi
-       bool              bToSelfBA;            //cosa add for rssi
-       char      cck_adc_pwdb[4];      //cosa add for rx path selection
-};
-
-/* IEEE 802.11 requires that STA supports concurrent reception of at least
- * three fragmented frames. This define can be increased to support more
- * concurrent frames, but it should be noted that each entry can consume about
- * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
-#define IEEE80211_FRAG_CACHE_LEN 4
-
-struct ieee80211_frag_entry {
-       unsigned long first_frag_time;
-       unsigned int seq;
-       unsigned int last_frag;
-       struct sk_buff *skb;
-       u8 src_addr[ETH_ALEN];
-       u8 dst_addr[ETH_ALEN];
-};
-
-struct ieee80211_stats {
-       unsigned int tx_unicast_frames;
-       unsigned int tx_multicast_frames;
-       unsigned int tx_fragments;
-       unsigned int tx_unicast_octets;
-       unsigned int tx_multicast_octets;
-       unsigned int tx_deferred_transmissions;
-       unsigned int tx_single_retry_frames;
-       unsigned int tx_multiple_retry_frames;
-       unsigned int tx_retry_limit_exceeded;
-       unsigned int tx_discards;
-       unsigned int rx_unicast_frames;
-       unsigned int rx_multicast_frames;
-       unsigned int rx_fragments;
-       unsigned int rx_unicast_octets;
-       unsigned int rx_multicast_octets;
-       unsigned int rx_fcs_errors;
-       unsigned int rx_discards_no_buffer;
-       unsigned int tx_discards_wrong_sa;
-       unsigned int rx_discards_undecryptable;
-       unsigned int rx_message_in_msg_fragments;
-       unsigned int rx_message_in_bad_msg_fragments;
-};
-
-struct ieee80211_device;
-
-#include "ieee80211_crypt.h"
-
-#define SEC_KEY_1         (1<<0)
-#define SEC_KEY_2         (1<<1)
-#define SEC_KEY_3         (1<<2)
-#define SEC_KEY_4         (1<<3)
-#define SEC_ACTIVE_KEY    (1<<4)
-#define SEC_AUTH_MODE     (1<<5)
-#define SEC_UNICAST_GROUP (1<<6)
-#define SEC_LEVEL         (1<<7)
-#define SEC_ENABLED       (1<<8)
-#define SEC_ENCRYPT       (1<<9)
-
-#define SEC_LEVEL_0      0 /* None */
-#define SEC_LEVEL_1      1 /* WEP 40 and 104 bit */
-#define SEC_LEVEL_2      2 /* Level 1 + TKIP */
-#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */
-#define SEC_LEVEL_3      4 /* Level 2 + CCMP */
-
-#define SEC_ALG_NONE            0
-#define SEC_ALG_WEP             1
-#define SEC_ALG_TKIP            2
-#define SEC_ALG_CCMP            4
-
-#define WEP_KEYS               4
-#define WEP_KEY_LEN            13
-#define SCM_KEY_LEN             32
-#define SCM_TEMPORAL_KEY_LENGTH 16
-
-struct ieee80211_security {
-       u16 active_key:2,
-            enabled:1,
-           auth_mode:2,
-            auth_algo:4,
-            unicast_uses_group:1,
-           encrypt:1;
-       u8 key_sizes[WEP_KEYS];
-       u8 keys[WEP_KEYS][SCM_KEY_LEN];
-       u8 level;
-       u16 flags;
-} __attribute__ ((packed));
-
-
-/*
- 802.11 data frame from AP
-      ,-------------------------------------------------------------------.
-Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
-      |------|------|---------|---------|---------|------|---------|------|
-Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  frame  |  fcs |
-      |      | tion | (BSSID) |         |         | ence |  data   |      |
-      `-------------------------------------------------------------------'
-Total: 28-2340 bytes
-*/
-
-/* Management Frame Information Element Types */
-enum ieee80211_mfie {
-        MFIE_TYPE_SSID = 0,
-        MFIE_TYPE_RATES = 1,
-        MFIE_TYPE_FH_SET = 2,
-        MFIE_TYPE_DS_SET = 3,
-        MFIE_TYPE_CF_SET = 4,
-        MFIE_TYPE_TIM = 5,
-        MFIE_TYPE_IBSS_SET = 6,
-        MFIE_TYPE_COUNTRY = 7,
-        MFIE_TYPE_HOP_PARAMS = 8,
-        MFIE_TYPE_HOP_TABLE = 9,
-        MFIE_TYPE_REQUEST = 10,
-        MFIE_TYPE_CHALLENGE = 16,
-        MFIE_TYPE_POWER_CONSTRAINT = 32,
-        MFIE_TYPE_POWER_CAPABILITY = 33,
-        MFIE_TYPE_TPC_REQUEST = 34,
-        MFIE_TYPE_TPC_REPORT = 35,
-        MFIE_TYPE_SUPP_CHANNELS = 36,
-        MFIE_TYPE_CSA = 37,
-        MFIE_TYPE_MEASURE_REQUEST = 38,
-        MFIE_TYPE_MEASURE_REPORT = 39,
-        MFIE_TYPE_QUIET = 40,
-        MFIE_TYPE_IBSS_DFS = 41,
-        MFIE_TYPE_ERP = 42,
-        MFIE_TYPE_RSN = 48,
-        MFIE_TYPE_RATES_EX = 50,
-        MFIE_TYPE_HT_CAP= 45,
-        MFIE_TYPE_HT_INFO= 61,
-        MFIE_TYPE_AIRONET=133,
-        MFIE_TYPE_GENERIC = 221,
-        MFIE_TYPE_QOS_PARAMETER = 222,
-};
-
-/* Minimal header; can be used for passing 802.11 frames with sufficient
- * information to determine what type of underlying data type is actually
- * stored in the data. */
- struct ieee80211_pspoll_hdr {
-        __le16 frame_ctl;
-        __le16 aid;
-       u8 bssid[ETH_ALEN];
-        u8 ta[ETH_ALEN];
-        //u8 payload[0];
-} __attribute__ ((packed));
-
-struct ieee80211_hdr {
-        __le16 frame_ctl;
-        __le16 duration_id;
-        u8 payload[0];
-} __attribute__ ((packed));
-
-struct ieee80211_hdr_1addr {
-        __le16 frame_ctl;
-        __le16 duration_id;
-        u8 addr1[ETH_ALEN];
-        u8 payload[0];
-} __attribute__ ((packed));
-
-struct ieee80211_hdr_2addr {
-        __le16 frame_ctl;
-        __le16 duration_id;
-        u8 addr1[ETH_ALEN];
-        u8 addr2[ETH_ALEN];
-        u8 payload[0];
-} __attribute__ ((packed));
-
-struct ieee80211_hdr_3addr {
-       __le16 frame_ctl;
-       __le16 duration_id;
-       u8 addr1[ETH_ALEN];
-       u8 addr2[ETH_ALEN];
-       u8 addr3[ETH_ALEN];
-       __le16 seq_ctl;
-        u8 payload[0];
-} __attribute__ ((packed));
-
-struct ieee80211_hdr_4addr {
-       __le16 frame_ctl;
-       __le16 duration_id;
-       u8 addr1[ETH_ALEN];
-       u8 addr2[ETH_ALEN];
-       u8 addr3[ETH_ALEN];
-       __le16 seq_ctl;
-       u8 addr4[ETH_ALEN];
-        u8 payload[0];
-} __attribute__ ((packed));
-
-struct ieee80211_hdr_3addrqos {
-       __le16 frame_ctl;
-       __le16 duration_id;
-       u8 addr1[ETH_ALEN];
-       u8 addr2[ETH_ALEN];
-       u8 addr3[ETH_ALEN];
-       __le16 seq_ctl;
-        u8 payload[0];
-       __le16 qos_ctl;
-} __attribute__ ((packed));
-
-struct ieee80211_hdr_4addrqos {
-       __le16 frame_ctl;
-       __le16 duration_id;
-       u8 addr1[ETH_ALEN];
-       u8 addr2[ETH_ALEN];
-       u8 addr3[ETH_ALEN];
-       __le16 seq_ctl;
-       u8 addr4[ETH_ALEN];
-        u8 payload[0];
-       __le16 qos_ctl;
-} __attribute__ ((packed));
-
-struct ieee80211_info_element {
-       u8 id;
-       u8 len;
-       u8 data[0];
-} __attribute__ ((packed));
-
-struct ieee80211_authentication {
-       struct ieee80211_hdr_3addr header;
-       __le16 algorithm;
-       __le16 transaction;
-       __le16 status;
-       /*challenge*/
-       struct ieee80211_info_element info_element[0];
-} __attribute__ ((packed));
-
-struct ieee80211_disassoc {
-        struct ieee80211_hdr_3addr header;
-        __le16 reason;
-} __attribute__ ((packed));
-
-struct ieee80211_probe_request {
-       struct ieee80211_hdr_3addr header;
-       /* SSID, supported rates */
-        struct ieee80211_info_element info_element[0];
-} __attribute__ ((packed));
-
-struct ieee80211_probe_response {
-       struct ieee80211_hdr_3addr header;
-       u32 time_stamp[2];
-       __le16 beacon_interval;
-       __le16 capability;
-        /* SSID, supported rates, FH params, DS params,
-         * CF params, IBSS params, TIM (if beacon), RSN */
-        struct ieee80211_info_element info_element[0];
-} __attribute__ ((packed));
-
-/* Alias beacon for probe_response */
-#define ieee80211_beacon ieee80211_probe_response
-
-struct ieee80211_assoc_request_frame {
-       struct ieee80211_hdr_3addr header;
-       __le16 capability;
-       __le16 listen_interval;
-       /* SSID, supported rates, RSN */
-        struct ieee80211_info_element info_element[0];
-} __attribute__ ((packed));
-
-struct ieee80211_reassoc_request_frame {
-       struct ieee80211_hdr_3addr header;
-       __le16 capability;
-       __le16 listen_interval;
-       u8 current_ap[ETH_ALEN];
-       /* SSID, supported rates, RSN */
-        struct ieee80211_info_element info_element[0];
-} __attribute__ ((packed));
-
-struct ieee80211_assoc_response_frame {
-       struct ieee80211_hdr_3addr header;
-       __le16 capability;
-       __le16 status;
-       __le16 aid;
-       struct ieee80211_info_element info_element[0]; /* supported rates */
-} __attribute__ ((packed));
-
-struct ieee80211_txb {
-       u8 nr_frags;
-       u8 encrypted;
-       u8 queue_index;
-       u8 rts_included;
-       u16 reserved;
-       __le16 frag_size;
-       __le16 payload_size;
-       struct sk_buff *fragments[0];
-};
-
-#define MAX_TX_AGG_COUNT                 16
-struct ieee80211_drv_agg_txb {
-       u8 nr_drv_agg_frames;
-       struct sk_buff *tx_agg_frames[MAX_TX_AGG_COUNT];
-}__attribute__((packed));
-
-#define MAX_SUBFRAME_COUNT               64
-struct ieee80211_rxb {
-       u8 nr_subframes;
-       struct sk_buff *subframes[MAX_SUBFRAME_COUNT];
-       u8 dst[ETH_ALEN];
-       u8 src[ETH_ALEN];
-}__attribute__((packed));
-
-typedef union _frameqos {
-       u16 shortdata;
-       u8  chardata[2];
-       struct {
-               u16 tid:4;
-               u16 eosp:1;
-               u16 ack_policy:2;
-               u16 reserved:1;
-               u16 txop:8;
-       }field;
-}frameqos,*pframeqos;
-
-/* SWEEP TABLE ENTRIES NUMBER*/
-#define MAX_SWEEP_TAB_ENTRIES            42
-#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET  7
-/* MAX_RATES_LENGTH needs to be 12.  The spec says 8, and many APs
- * only use 8, and then use extended rates for the remaining supported
- * rates.  Other APs, however, stick all of their supported rates on the
- * main rates information element... */
-#define MAX_RATES_LENGTH                  ((u8)12)
-#define MAX_RATES_EX_LENGTH               ((u8)16)
-#define MAX_NETWORK_COUNT                  128
-
-#define MAX_CHANNEL_NUMBER                 161
-#define IEEE80211_SOFTMAC_SCAN_TIME       100
-//(HZ / 2)
-#define IEEE80211_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)
-
-#define CRC_LENGTH                 4U
-
-#define MAX_WPA_IE_LEN 64
-
-#define NETWORK_EMPTY_ESSID (1<<0)
-#define NETWORK_HAS_OFDM    (1<<1)
-#define NETWORK_HAS_CCK     (1<<2)
-
-/* QoS structure */
-#define NETWORK_HAS_QOS_PARAMETERS      (1<<3)
-#define NETWORK_HAS_QOS_INFORMATION     (1<<4)
-#define NETWORK_HAS_QOS_MASK            (NETWORK_HAS_QOS_PARAMETERS | \
-                                         NETWORK_HAS_QOS_INFORMATION)
-/* 802.11h */
-#define NETWORK_HAS_POWER_CONSTRAINT    (1<<5)
-#define NETWORK_HAS_CSA                 (1<<6)
-#define NETWORK_HAS_QUIET               (1<<7)
-#define NETWORK_HAS_IBSS_DFS            (1<<8)
-#define NETWORK_HAS_TPC_REPORT          (1<<9)
-
-#define NETWORK_HAS_ERP_VALUE           (1<<10)
-
-#define QOS_QUEUE_NUM                   4
-#define QOS_OUI_LEN                     3
-#define QOS_OUI_TYPE                    2
-#define QOS_ELEMENT_ID                  221
-#define QOS_OUI_INFO_SUB_TYPE           0
-#define QOS_OUI_PARAM_SUB_TYPE          1
-#define QOS_VERSION_1                   1
-#define QOS_AIFSN_MIN_VALUE             2
-
-struct ieee80211_qos_information_element {
-        u8 elementID;
-        u8 length;
-        u8 qui[QOS_OUI_LEN];
-        u8 qui_type;
-        u8 qui_subtype;
-        u8 version;
-        u8 ac_info;
-} __attribute__ ((packed));
-
-struct ieee80211_qos_ac_parameter {
-        u8 aci_aifsn;
-        u8 ecw_min_max;
-        __le16 tx_op_limit;
-} __attribute__ ((packed));
-
-struct ieee80211_qos_parameter_info {
-        struct ieee80211_qos_information_element info_element;
-        u8 reserved;
-        struct ieee80211_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM];
-} __attribute__ ((packed));
-
-struct ieee80211_qos_parameters {
-        __le16 cw_min[QOS_QUEUE_NUM];
-        __le16 cw_max[QOS_QUEUE_NUM];
-        u8 aifs[QOS_QUEUE_NUM];
-        u8 flag[QOS_QUEUE_NUM];
-        __le16 tx_op_limit[QOS_QUEUE_NUM];
-} __attribute__ ((packed));
-
-struct ieee80211_qos_data {
-        struct ieee80211_qos_parameters parameters;
-        int active;
-        int supported;
-        u8 param_count;
-        u8 old_param_count;
-};
-
-struct ieee80211_tim_parameters {
-        u8 tim_count;
-        u8 tim_period;
-} __attribute__ ((packed));
-
-//#else
-struct ieee80211_wmm_ac_param {
-       u8 ac_aci_acm_aifsn;
-       u8 ac_ecwmin_ecwmax;
-       u16 ac_txop_limit;
-};
-
-struct ieee80211_wmm_ts_info {
-       u8 ac_dir_tid;
-       u8 ac_up_psb;
-       u8 reserved;
-} __attribute__ ((packed));
-
-struct ieee80211_wmm_tspec_elem {
-       struct ieee80211_wmm_ts_info ts_info;
-       u16 norm_msdu_size;
-       u16 max_msdu_size;
-       u32 min_serv_inter;
-       u32 max_serv_inter;
-       u32 inact_inter;
-       u32 suspen_inter;
-       u32 serv_start_time;
-       u32 min_data_rate;
-       u32 mean_data_rate;
-       u32 peak_data_rate;
-       u32 max_burst_size;
-       u32 delay_bound;
-       u32 min_phy_rate;
-       u16 surp_band_allow;
-       u16 medium_time;
-}__attribute__((packed));
-
-enum eap_type {
-       EAP_PACKET = 0,
-       EAPOL_START,
-       EAPOL_LOGOFF,
-       EAPOL_KEY,
-       EAPOL_ENCAP_ASF_ALERT
-};
-
-static const char *eap_types[] = {
-       [EAP_PACKET]            = "EAP-Packet",
-       [EAPOL_START]           = "EAPOL-Start",
-       [EAPOL_LOGOFF]          = "EAPOL-Logoff",
-       [EAPOL_KEY]             = "EAPOL-Key",
-       [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert"
-};
-
-static inline const char *eap_get_type(int type)
-{
-       return ((u32)type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type];
-}
-//added by amy for reorder
-static inline u8 Frame_QoSTID(u8* buf)
-{
-       struct ieee80211_hdr_3addr *hdr;
-       u16 fc;
-       hdr = (struct ieee80211_hdr_3addr *)buf;
-       fc = le16_to_cpu(hdr->frame_ctl);
-       return (u8)((frameqos*)(buf + (((fc & IEEE80211_FCTL_TODS)&&(fc & IEEE80211_FCTL_FROMDS))? 30 : 24)))->field.tid;
-}
-
-//added by amy for reorder
-
-struct eapol {
-       u8 snap[6];
-       u16 ethertype;
-       u8 version;
-       u8 type;
-       u16 length;
-} __attribute__ ((packed));
-
-struct ieee80211_softmac_stats{
-       unsigned int rx_ass_ok;
-       unsigned int rx_ass_err;
-       unsigned int rx_probe_rq;
-       unsigned int tx_probe_rs;
-       unsigned int tx_beacons;
-       unsigned int rx_auth_rq;
-       unsigned int rx_auth_rs_ok;
-       unsigned int rx_auth_rs_err;
-       unsigned int tx_auth_rq;
-       unsigned int no_auth_rs;
-       unsigned int no_ass_rs;
-       unsigned int tx_ass_rq;
-       unsigned int rx_ass_rq;
-       unsigned int tx_probe_rq;
-       unsigned int reassoc;
-       unsigned int swtxstop;
-       unsigned int swtxawake;
-       unsigned char CurrentShowTxate;
-       unsigned char last_packet_rate;
-       unsigned int txretrycount;
-};
-
-#define BEACON_PROBE_SSID_ID_POSITION 12
-
-struct ieee80211_info_element_hdr {
-       u8 id;
-       u8 len;
-} __attribute__ ((packed));
-
-/*
- * These are the data types that can make up management packets
- *
-       u16 auth_algorithm;
-       u16 auth_sequence;
-       u16 beacon_interval;
-       u16 capability;
-       u8 current_ap[ETH_ALEN];
-       u16 listen_interval;
-       struct {
-               u16 association_id:14, reserved:2;
-       } __attribute__ ((packed));
-       u32 time_stamp[2];
-       u16 reason;
-       u16 status;
-*/
-
-#define IEEE80211_DEFAULT_TX_ESSID "Penguin"
-#define IEEE80211_DEFAULT_BASIC_RATE 2 //1Mbps
-
-enum {WMM_all_frame, WMM_two_frame, WMM_four_frame, WMM_six_frame};
-#define MAX_SP_Len  (WMM_all_frame << 4)
-#define IEEE80211_QOS_TID 0x0f
-#define QOS_CTL_NOTCONTAIN_ACK (0x01 << 5)
-
-#define IEEE80211_DTIM_MBCAST 4
-#define IEEE80211_DTIM_UCAST 2
-#define IEEE80211_DTIM_VALID 1
-#define IEEE80211_DTIM_INVALID 0
-
-#define IEEE80211_PS_DISABLED 0
-#define IEEE80211_PS_UNICAST IEEE80211_DTIM_UCAST
-#define IEEE80211_PS_MBCAST IEEE80211_DTIM_MBCAST
-
-//added by David for QoS 2006/6/30
-//#define WMM_Hang_8187
-#ifdef WMM_Hang_8187
-#undef WMM_Hang_8187
-#endif
-
-#define WME_AC_BK   0x00
-#define WME_AC_BE   0x01
-#define WME_AC_VI   0x02
-#define WME_AC_VO   0x03
-#define WME_ACI_MASK 0x03
-#define WME_AIFSN_MASK 0x03
-#define WME_AC_PRAM_LEN 16
-
-#define MAX_RECEIVE_BUFFER_SIZE 9100
-
-//UP Mapping to AC, using in MgntQuery_SequenceNumber() and maybe for DSCP
-#define UP2AC(up) (               \
-       ((up) < 1) ? WME_AC_BE : \
-       ((up) < 3) ? WME_AC_BK : \
-       ((up) < 4) ? WME_AC_BE : \
-       ((up) < 6) ? WME_AC_VI : \
-       WME_AC_VO)
-
-//AC Mapping to UP, using in Tx part for selecting the corresponding TX queue
-#define AC2UP(_ac)     (       \
-       ((_ac) == WME_AC_VO) ? 6 : \
-       ((_ac) == WME_AC_VI) ? 5 : \
-       ((_ac) == WME_AC_BK) ? 1 : \
-       0)
-
-#define        ETHER_ADDR_LEN          6       /* length of an Ethernet address */
-#define ETHERNET_HEADER_SIZE    14      /* length of two Ethernet address plus ether type*/
-
-struct ether_header {
-       u8 ether_dhost[ETHER_ADDR_LEN];
-       u8 ether_shost[ETHER_ADDR_LEN];
-       u16 ether_type;
-} __attribute__((packed));
-
-#ifndef ETHERTYPE_PAE
-#define        ETHERTYPE_PAE   0x888e          /* EAPOL PAE/802.1x */
-#endif
-#ifndef ETHERTYPE_IP
-#define        ETHERTYPE_IP    0x0800          /* IP protocol */
-#endif
-
-typedef struct _bss_ht{
-
-       bool                            support_ht;
-
-       // HT related elements
-       u8                                      ht_cap_buf[32];
-       u16                                     ht_cap_len;
-       u8                                      ht_info_buf[32];
-       u16                                     ht_info_len;
-
-       HT_SPEC_VER                     ht_spec_ver;
-
-       bool                            aggregation;
-       bool                            long_slot_time;
-}bss_ht, *pbss_ht;
-
-typedef enum _erp_t{
-       ERP_NonERPpresent       = 0x01,
-       ERP_UseProtection       = 0x02,
-       ERP_BarkerPreambleMode = 0x04,
-} erp_t;
-
-
-struct ieee80211_network {
-       /* These entries are used to identify a unique network */
-       u8 bssid[ETH_ALEN];
-       u8 channel;
-       /* Ensure null-terminated for any debug msgs */
-       u8 ssid[IW_ESSID_MAX_SIZE + 1];
-       u8 ssid_len;
-        struct ieee80211_qos_data qos_data;
-
-       //added by amy for LEAP
-       bool    bWithAironetIE;
-       bool    bCkipSupported;
-       bool    bCcxRmEnable;
-       u16     CcxRmState[2];
-       // CCXv4 S59, MBSSID.
-       bool    bMBssidValid;
-       u8      MBssidMask;
-       u8      MBssid[6];
-       // CCX 2 S38, WLAN Device Version Number element. Annie, 2006-08-20.
-       bool    bWithCcxVerNum;
-       u8      BssCcxVerNumber;
-       /* These are network statistics */
-       struct ieee80211_rx_stats stats;
-       u16 capability;
-       u8  rates[MAX_RATES_LENGTH];
-       u8  rates_len;
-       u8  rates_ex[MAX_RATES_EX_LENGTH];
-       u8  rates_ex_len;
-       unsigned long last_scanned;
-       u8  mode;
-       u32 flags;
-       u32 last_associate;
-       u32 time_stamp[2];
-       u16 beacon_interval;
-       u16 listen_interval;
-       u16 atim_window;
-       u8  erp_value;
-       u8  wpa_ie[MAX_WPA_IE_LEN];
-       size_t wpa_ie_len;
-       u8  rsn_ie[MAX_WPA_IE_LEN];
-       size_t rsn_ie_len;
-
-        struct ieee80211_tim_parameters tim;
-       u8  dtim_period;
-       u8  dtim_data;
-       u32 last_dtim_sta_time[2];
-
-        //appeded for QoS
-        u8 wmm_info;
-        struct ieee80211_wmm_ac_param wmm_param[4];
-        u8 QoS_Enable;
-#ifdef THOMAS_TURBO
-       u8 Turbo_Enable;//enable turbo mode, added by thomas
-#endif
-#ifdef ENABLE_DOT11D
-       u16 CountryIeLen;
-       u8 CountryIeBuf[MAX_IE_LEN];
-#endif
-        // HT Related, by amy, 2008.04.29
-       BSS_HT  bssht;
-       // Add to handle broadcom AP management frame CCK rate.
-       bool broadcom_cap_exist;
-       bool ralink_cap_exist;
-       bool atheros_cap_exist;
-       bool cisco_cap_exist;
-       bool marvell_cap_exist;
-       bool unknown_cap_exist;
-//     u8      berp_info;
-       bool    berp_info_valid;
-       bool buseprotection;
-       //put at the end of the structure.
-       struct list_head list;
-};
-
-enum ieee80211_state {
-
-       /* the card is not linked at all */
-       IEEE80211_NOLINK = 0,
-
-       /* IEEE80211_ASSOCIATING* are for BSS client mode
-        * the driver shall not perform RX filtering unless
-        * the state is LINKED.
-        * The driver shall just check for the state LINKED and
-        * defaults to NOLINK for ALL the other states (including
-        * LINKED_SCANNING)
-        */
-
-       /* the association procedure will start (wq scheduling)*/
-       IEEE80211_ASSOCIATING,
-       IEEE80211_ASSOCIATING_RETRY,
-
-       /* the association procedure is sending AUTH request*/
-       IEEE80211_ASSOCIATING_AUTHENTICATING,
-
-       /* the association procedure has successfully authentcated
-        * and is sending association request
-        */
-       IEEE80211_ASSOCIATING_AUTHENTICATED,
-
-       /* the link is ok. the card associated to a BSS or linked
-        * to a ibss cell or acting as an AP and creating the bss
-        */
-       IEEE80211_LINKED,
-
-       /* same as LINKED, but the driver shall apply RX filter
-        * rules as we are in NO_LINK mode. As the card is still
-        * logically linked, but it is doing a syncro site survey
-        * then it will be back to LINKED state.
-        */
-       IEEE80211_LINKED_SCANNING,
-
-};
-
-#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
-#define DEFAULT_FTS 2346
-
-#define CFG_IEEE80211_RESERVE_FCS (1<<0)
-#define CFG_IEEE80211_COMPUTE_FCS (1<<1)
-#define CFG_IEEE80211_RTS (1<<2)
-
-#define IEEE80211_24GHZ_MIN_CHANNEL 1
-#define IEEE80211_24GHZ_MAX_CHANNEL 14
-#define IEEE80211_24GHZ_CHANNELS (IEEE80211_24GHZ_MAX_CHANNEL - \
-                                  IEEE80211_24GHZ_MIN_CHANNEL + 1)
-
-#define IEEE80211_52GHZ_MIN_CHANNEL 34
-#define IEEE80211_52GHZ_MAX_CHANNEL 165
-#define IEEE80211_52GHZ_CHANNELS (IEEE80211_52GHZ_MAX_CHANNEL - \
-                                  IEEE80211_52GHZ_MIN_CHANNEL + 1)
-
-typedef struct tx_pending_t{
-       int frag;
-       struct ieee80211_txb *txb;
-}tx_pending_t;
-
-typedef struct _bandwidth_autoswitch
-{
-       long threshold_20Mhzto40Mhz;
-       long    threshold_40Mhzto20Mhz;
-       bool bforced_tx20Mhz;
-       bool bautoswitch_enable;
-}bandwidth_autoswitch,*pbandwidth_autoswitch;
-
-
-//added by amy for order
-
-#define REORDER_WIN_SIZE       128
-#define REORDER_ENTRY_NUM      128
-typedef struct _RX_REORDER_ENTRY
-{
-       struct list_head        List;
-       u16                     SeqNum;
-       struct ieee80211_rxb* prxb;
-} RX_REORDER_ENTRY, *PRX_REORDER_ENTRY;
-//added by amy for order
-typedef enum _Fsync_State{
-       Default_Fsync,
-       HW_Fsync,
-       SW_Fsync
-}Fsync_State;
-
-typedef struct _IbssParms{
-       u16   atimWin;
-}IbssParms, *PIbssParms;
-#define MAX_NUM_RATES  264 // Max num of support rates element: 8,  Max num of ext. support rate: 255. 061122, by rcnjko.
-
-#ifdef ENABLE_DOT11D
-typedef enum
-{
-       COUNTRY_CODE_FCC = 0,
-       COUNTRY_CODE_IC = 1,
-       COUNTRY_CODE_ETSI = 2,
-       COUNTRY_CODE_SPAIN = 3,
-       COUNTRY_CODE_FRANCE = 4,
-       COUNTRY_CODE_MKK = 5,
-       COUNTRY_CODE_MKK1 = 6,
-       COUNTRY_CODE_ISRAEL = 7,
-       COUNTRY_CODE_TELEC,
-       COUNTRY_CODE_MIC,
-       COUNTRY_CODE_GLOBAL_DOMAIN
-}country_code_type_t;
-#endif
-
-#define RT_MAX_LD_SLOT_NUM     10
-typedef struct _RT_LINK_DETECT_T{
-
-       u32                             NumRecvBcnInPeriod;
-       u32                             NumRecvDataInPeriod;
-
-       u32                             RxBcnNum[RT_MAX_LD_SLOT_NUM];   // number of Rx beacon / CheckForHang_period  to determine link status
-       u32                             RxDataNum[RT_MAX_LD_SLOT_NUM];  // number of Rx data / CheckForHang_period  to determine link status
-       u16                             SlotNum;        // number of CheckForHang period to determine link status
-       u16                             SlotIndex;
-
-       u32                             NumTxOkInPeriod;
-       u32                             NumRxOkInPeriod;
-       u32                             NumRxUnicastOkInPeriod;
-       bool                            bBusyTraffic;
-}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;
-
-//added by amy 090330
-typedef enum _HW_VARIABLES{
-       HW_VAR_ETHER_ADDR,
-       HW_VAR_MULTICAST_REG,
-       HW_VAR_BASIC_RATE,
-       HW_VAR_BSSID,
-       HW_VAR_MEDIA_STATUS,
-       HW_VAR_SECURITY_CONF,
-       HW_VAR_BEACON_INTERVAL,
-       HW_VAR_ATIM_WINDOW,
-       HW_VAR_LISTEN_INTERVAL,
-       HW_VAR_CS_COUNTER,
-       HW_VAR_DEFAULTKEY0,
-       HW_VAR_DEFAULTKEY1,
-       HW_VAR_DEFAULTKEY2,
-       HW_VAR_DEFAULTKEY3,
-       HW_VAR_SIFS,
-       HW_VAR_DIFS,
-       HW_VAR_EIFS,
-       HW_VAR_SLOT_TIME,
-       HW_VAR_ACK_PREAMBLE,
-       HW_VAR_CW_CONFIG,
-       HW_VAR_CW_VALUES,
-       HW_VAR_RATE_FALLBACK_CONTROL,
-       HW_VAR_CONTENTION_WINDOW,
-       HW_VAR_RETRY_COUNT,
-       HW_VAR_TR_SWITCH,
-       HW_VAR_COMMAND,                 // For Command Register, Annie, 2006-04-07.
-       HW_VAR_WPA_CONFIG,              //2004/08/23, kcwu, for 8187 Security config
-       HW_VAR_AMPDU_MIN_SPACE, // The spacing between sub-frame. Roger, 2008.07.04.
-       HW_VAR_SHORTGI_DENSITY, // The density for shortGI. Roger, 2008.07.04.
-       HW_VAR_AMPDU_FACTOR,
-       HW_VAR_MCS_RATE_AVAILABLE,
-       HW_VAR_AC_PARAM,                        // For AC Parameters, 2005.12.01, by rcnjko.
-       HW_VAR_ACM_CTRL,                        // For ACM Control, Annie, 2005-12-13.
-       HW_VAR_DIS_Req_Qsize,           // For DIS_Reg_Qsize, Joseph
-       HW_VAR_CCX_CHNL_LOAD,           // For CCX 2 channel load request, 2006.05.04.
-       HW_VAR_CCX_NOISE_HISTOGRAM,     // For CCX 2 noise histogram request, 2006.05.04.
-       HW_VAR_CCX_CLM_NHM,                     // For CCX 2 parallel channel load request and noise histogram request, 2006.05.12.
-       HW_VAR_TxOPLimit,                               // For turbo mode related settings, added by Roger, 2006.12.07
-       HW_VAR_TURBO_MODE,                      // For turbo mode related settings, added by Roger, 2006.12.15.
-       HW_VAR_RF_STATE,                        // For change or query RF power state, 061214, rcnjko.
-       HW_VAR_RF_OFF_BY_HW,            // For UI to query if external HW signal disable RF, 061229, rcnjko.
-       HW_VAR_BUS_SPEED,               // In unit of bps. 2006.07.03, by rcnjko.
-        HW_VAR_SET_DEV_POWER,  // Set to low power, added by LanHsin, 2007.
-
-       //1!!!!!!!!!!!!!!!!!!!!!!!!!!!
-       //1Attention Please!!!<11n or 8190 specific code should be put below this line>
-       //1!!!!!!!!!!!!!!!!!!!!!!!!!!!
-       HW_VAR_RCR,                             //for RCR, David 2006,05,11
-       HW_VAR_RATR_0,
-       HW_VAR_RRSR,
-       HW_VAR_CPU_RST,
-       HW_VAR_CHECK_BSSID,
-        HW_VAR_LBK_MODE,                       // Set lookback mode, 2008.06.11. added by Roger.
-       // Set HW related setting for 11N AES bug.
-       HW_VAR_AES_11N_FIX,
-       // Set Usb Rx Aggregation
-       HW_VAR_USB_RX_AGGR,
-       HW_VAR_USER_CONTROL_TURBO_MODE,
-       HW_VAR_RETRY_LIMIT,
-#ifndef _RTL8192_EXT_PATCH_
-       HW_VAR_INIT_TX_RATE,  //Get Current Tx rate register. 2008.12.10. Added by tynli
-#endif
-       HW_VAR_TX_RATE_REG,  //Get Current Tx rate register. 2008.12.10. Added by tynli
-       HW_VAR_EFUSE_USAGE, //Get current EFUSE utilization. 2008.12.19. Added by Roger.
-       HW_VAR_EFUSE_BYTES,
-       HW_VAR_AUTOLOAD_STATUS, //Get current autoload status, 0: autoload success, 1: autoload fail. 2008.12.19. Added by Roger.
-       HW_VAR_RF_2R_DISABLE, // 2R disable
-       HW_VAR_SET_RPWM,
-       HW_VAR_H2C_FW_PWRMODE, // For setting FW related H2C cmd structure. by tynli. 2009.2.18
-       HW_VAR_H2C_FW_JOINBSSRPT, // For setting FW related H2C cmd structure. by tynli. 2009.2.18
-       HW_VAR_1X1_RECV_COMBINE,        // For 1T2R but only 1SS, Add by hpfan 2009.04.16 hpfan
-       HW_VAR_STOP_SEND_BEACON,
-       HW_VAR_TSF_TIMER,                       // Read from TSF register to get the current TSF timer, by Bruce, 2009-07-22.
-       HW_VAR_IO_CMD,
-       HW_VAR_HANDLE_FW_C2H,           //Added by tynli. For handling FW C2H command. 2009.10.07.
-       HW_VAR_DL_FW_RSVD_PAGE,                 //Added by tynli. Download the packets that FW will use to RSVD page. 2009.10.14.
-       HW_VAR_AID,                             //Added by tynli.
-       HW_VAR_HW_SEQ_ENABLE,           //Added by tynli. 2009.10.20.
-       HW_VAR_UPDATE_TSF,                      //Added by tynli. 2009.10.22. For Hw count TBTT time.
-       HW_VAR_BCN_VALID,                               //Added by tynli.
-       HW_VAR_FWLPS_RF_ON                      //Added by tynli. 2009.11.09. For checking if Fw finishs RF on sequence.
-}HW_VARIABLES;
-
-#define RT_CHECK_FOR_HANG_PERIOD 2
-
-struct ieee80211_device {
-       struct net_device *dev;
-        struct ieee80211_security sec;
-
-       bool    need_sw_enc;
-#ifdef ENABLE_LPS
-       bool bAwakePktSent;
-       u8  LPSDelayCnt;
-       bool bIsAggregateFrame;
-       bool polling;
-       void (*LeisurePSLeave)(struct ieee80211_device *ieee);
-#endif
-
-#ifdef ENABLE_IPS
-       bool proto_stoppping;
-       bool wx_set_enc;
-       struct semaphore ips_sem;
-       struct work_struct ips_leave_wq;
-        void (*ieee80211_ips_leave_wq) (struct ieee80211_device *ieee);
-        void (*ieee80211_ips_leave)(struct ieee80211_device *ieee);
-#endif
-       void (*SetHwRegHandler)(struct ieee80211_device *ieee, u8 variable, u8 *val);
-       u8   (*rtllib_ap_sec_type)(struct ieee80211_device *ieee);
-
-       //hw security related
-       u8 hwsec_active;  //hw security active.
-       bool is_silent_reset;
-       bool is_roaming;
-       bool ieee_up;
-       bool bSupportRemoteWakeUp;
-       bool actscanning;
-       bool beinretry;
-       bool is_set_key;
-       //11n spec related I wonder if These info structure need to be moved out of ieee80211_device
-
-       //11n HT below
-       PRT_HIGH_THROUGHPUT     pHTInfo;
-       spinlock_t bw_spinlock;
-
-       spinlock_t reorder_spinlock;
-       // for HT operation rate set.  we use this one for HT data rate to separate different descriptors
-       //the way fill this is the same as in the IE
-       u8      Regdot11HTOperationalRateSet[16];               //use RATR format
-       u8      dot11HTOperationalRateSet[16];          //use RATR format
-       u8      RegHTSuppRateSet[16];
-       u8                              HTCurrentOperaRate;
-       u8                              HTHighestOperaRate;
-       //wb added for rate operation mode to firmware
-       u8      bTxDisableRateFallBack;
-       u8      bTxUseDriverAssingedRate;
-       atomic_t        atm_chnlop;
-       atomic_t        atm_swbw;
-
-       // 802.11e and WMM Traffic Stream Info (TX)
-       struct list_head                Tx_TS_Admit_List;
-       struct list_head                Tx_TS_Pending_List;
-       struct list_head                Tx_TS_Unused_List;
-       TX_TS_RECORD            TxTsRecord[TOTAL_TS_NUM];
-       // 802.11e and WMM Traffic Stream Info (RX)
-       struct list_head                Rx_TS_Admit_List;
-       struct list_head                Rx_TS_Pending_List;
-       struct list_head                Rx_TS_Unused_List;
-       RX_TS_RECORD            RxTsRecord[TOTAL_TS_NUM];
-       RX_REORDER_ENTRY        RxReorderEntry[128];
-       struct list_head                RxReorder_Unused_List;
-       u8                              ForcedPriority;         // Force per-packet priority 1~7. (default: 0, not to force it.)
-
-
-       /* Bookkeeping structures */
-       struct net_device_stats stats;
-       struct ieee80211_stats ieee_stats;
-       struct ieee80211_softmac_stats softmac_stats;
-
-       /* Probe / Beacon management */
-       struct list_head network_free_list;
-       struct list_head network_list;
-       struct ieee80211_network *networks;
-       int scans;
-       int scan_age;
-
-       int iw_mode; /* operating mode (IW_MODE_*) */
-       struct iw_spy_data spy_data;
-
-       spinlock_t lock;
-       spinlock_t wpax_suitlist_lock;
-
-       int tx_headroom; /* Set to size of any additional room needed at front
-                         * of allocated Tx SKBs */
-       u32 config;
-
-       /* WEP and other encryption related settings at the device level */
-       int open_wep; /* Set to 1 to allow unencrypted frames */
-       int auth_mode;
-       int reset_on_keychange; /* Set to 1 if the HW needs to be reset on
-                                * WEP key changes */
-
-       /* If the host performs {en,de}cryption, then set to 1 */
-       int host_encrypt;
-       int host_encrypt_msdu;
-       int host_decrypt;
-        /* host performs multicast decryption */
-        int host_mc_decrypt;
-
-        /* host should strip IV and ICV from protected frames */
-        /* meaningful only when hardware decryption is being used */
-        int host_strip_iv_icv;
-
-        int host_open_frag;
-        int host_build_iv;
-       int ieee802_1x; /* is IEEE 802.1X used */
-
-       /* WPA data */
-       bool bHalfWirelessN24GMode;
-       int wpa_enabled;
-       int drop_unencrypted;
-       int tkip_countermeasures;
-       int privacy_invoked;
-       size_t wpa_ie_len;
-       u8 *wpa_ie;
-       u8 ap_mac_addr[6];
-       u16 pairwise_key_type;
-       u16 group_key_type;
-       struct list_head crypt_deinit_list;
-       struct ieee80211_crypt_data *crypt[WEP_KEYS];
-       int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */
-       struct timer_list crypt_deinit_timer;
-        int crypt_quiesced;
-
-       int bcrx_sta_key; /* use individual keys to override default keys even
-                          * with RX of broad/multicast frames */
-
-       /* Fragmentation structures */
-       // each streaming contain a entry
-       struct ieee80211_frag_entry frag_cache[17][IEEE80211_FRAG_CACHE_LEN];
-       unsigned int frag_next_idx[17];
-       u16 fts; /* Fragmentation Threshold */
-#define DEFAULT_RTS_THRESHOLD 2346U
-#define MIN_RTS_THRESHOLD 1
-#define MAX_RTS_THRESHOLD 2346U
-        u16 rts; /* RTS threshold */
-
-        /* Association info */
-        u8 bssid[ETH_ALEN];
-
-       /* This stores infos for the current network.
-        * Either the network we are associated in INFRASTRUCTURE
-        * or the network that we are creating in MASTER mode.
-        * ad-hoc is a mixture ;-).
-        * Note that in infrastructure mode, even when not associated,
-        * fields bssid and essid may be valid (if wpa_set and essid_set
-        * are true) as thy carry the value set by the user via iwconfig
-        */
-       struct ieee80211_network current_network;
-
-       enum ieee80211_state state;
-
-       int short_slot;
-       int reg_mode;
-       int mode;       /* A, B, G */
-       int modulation; /* CCK, OFDM */
-       int freq_band;  /* 2.4Ghz, 5.2Ghz, Mixed */
-       int abg_true;   /* ABG flag              */
-
-       /* used for forcing the ibss workqueue to terminate
-        * without wait for the syncro scan to terminate
-        */
-       short sync_scan_hurryup;
-
-        int perfect_rssi;
-        int worst_rssi;
-
-        u16 prev_seq_ctl;       /* used to drop duplicate frames */
-
-       /* map of allowed channels. 0 is dummy */
-       // FIXME: remember to default to a basic channel plan depending of the PHY type
-#ifdef ENABLE_DOT11D
-       void* pDot11dInfo;
-       bool bGlobalDomain;
-#else
-       int channel_map[MAX_CHANNEL_NUMBER+1];
-#endif
-       int rate;       /* current rate */
-       int basic_rate;
-       //FIXME: pleace callback, see if redundant with softmac_features
-       short active_scan;
-
-       /* this contains flags for selectively enable softmac support */
-       u16 softmac_features;
-
-       /* if the sequence control field is not filled by HW */
-       u16 seq_ctrl[5];
-
-       /* association procedure transaction sequence number */
-       u16 associate_seq;
-
-       /* AID for RTXed association responses */
-       u16 assoc_id;
-
-       /* power save mode related*/
-       u8 ack_tx_to_ieee;
-       short ps;
-       short sta_sleep;
-       int ps_timeout;
-       int ps_period;
-       struct tasklet_struct ps_task;
-       u32 ps_th;
-       u32 ps_tl;
-
-       short raw_tx;
-       /* used if IEEE_SOFTMAC_TX_QUEUE is set */
-       short queue_stop;
-       short scanning;
-       short proto_started;
-
-       struct semaphore wx_sem;
-       struct semaphore scan_sem;
-
-       spinlock_t mgmt_tx_lock;
-       spinlock_t beacon_lock;
-
-       short beacon_txing;
-
-       short wap_set;
-       short ssid_set;
-
-       u8  wpax_type_set;    //{added by David, 2006.9.28}
-       u32 wpax_type_notify; //{added by David, 2006.9.26}
-
-       /* QoS related flag */
-       char init_wmmparam_flag;
-       /* set on initialization */
-       u8  qos_support;
-
-       /* for discarding duplicated packets in IBSS */
-       struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE];
-
-       /* for discarding duplicated packets in BSS */
-       u16 last_rxseq_num[17]; /* rx seq previous per-tid */
-       u16 last_rxfrag_num[17];/* tx frag previous per-tid */
-       unsigned long last_packet_time[17];
-
-       /* for PS mode */
-       unsigned long last_rx_ps_time;
-       u8 LPSAwakeIntvl;
-       u8 RegMaxLPSAwakeIntvl;
-
-       /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */
-       struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM];
-       int mgmt_queue_head;
-       int mgmt_queue_tail;
-#define IEEE80211_QUEUE_LIMIT 128
-       u8 AsocRetryCount;
-       unsigned int hw_header;
-       struct sk_buff_head skb_waitQ[MAX_QUEUE_SIZE];
-       struct sk_buff_head  skb_aggQ[MAX_QUEUE_SIZE];
-       struct sk_buff_head  skb_drv_aggQ[MAX_QUEUE_SIZE];
-       u32     sta_edca_param[4];
-       bool aggregation;
-       // Enable/Disable Rx immediate BA capability.
-       bool enable_rx_imm_BA;
-       bool bibsscoordinator;
-
-       //+by amy for DM ,080515
-       //Dynamic Tx power for near/far range enable/Disable  , by amy , 2008-05-15
-       bool    bdynamic_txpower_enable;
-
-       bool bCTSToSelfEnable;
-       u8      CTSToSelfTH;
-
-       u32     fsync_time_interval;
-       u32     fsync_rate_bitmap;
-       u8      fsync_rssi_threshold;
-       bool    bfsync_enable;
-
-       u8      fsync_multiple_timeinterval;            // FsyncMultipleTimeInterval * FsyncTimeInterval
-       u32     fsync_firstdiff_ratethreshold;          // low threshold
-       u32     fsync_seconddiff_ratethreshold;  // decrease threshold
-       Fsync_State                     fsync_state;
-       bool            bis_any_nonbepkts;
-       //20Mhz 40Mhz AutoSwitch Threshold
-       bandwidth_autoswitch bandwidth_auto_switch;
-       //for txpower tracking
-       bool FwRWRF;
-
-       //added by amy for AP roaming
-       RT_LINK_DETECT_T        LinkDetectInfo;
-
-       /* used if IEEE_SOFTMAC_TX_QUEUE is set */
-       struct  tx_pending_t tx_pending;
-
-       /* used if IEEE_SOFTMAC_ASSOCIATE is set */
-       struct timer_list associate_timer;
-
-       /* used if IEEE_SOFTMAC_BEACONS is set */
-       struct timer_list beacon_timer;
-        struct work_struct associate_complete_wq;
-        struct work_struct associate_procedure_wq;
-        struct delayed_work softmac_scan_wq;
-        struct delayed_work associate_retry_wq;
-        struct delayed_work start_ibss_wq;
-        struct delayed_work hw_wakeup_wq;
-
-        struct work_struct wx_sync_scan_wq;
-        struct workqueue_struct *wq;
-
-       /* Callback functions */
-       void (*set_security)(struct ieee80211_device *ieee,
-                            struct ieee80211_security *sec);
-
-       /* Used to TX data frame by using txb structs.
-        * this is not used if in the softmac_features
-        * is set the flag IEEE_SOFTMAC_TX_QUEUE
-        */
-       int (*hard_start_xmit)(struct ieee80211_txb *txb,
-                              struct ieee80211_device *ieee);
-
-       int (*reset_port)(struct ieee80211_device *ieee);
-        int (*is_queue_full) (struct ieee80211_device *ieee, int pri);
-
-        int (*handle_management) (struct ieee80211_device *ieee,
-                                  struct ieee80211_network * network, u16 type);
-        int (*is_qos_active) (struct ieee80211_device *ieee, struct sk_buff *skb);
-
-       /* Softmac-generated frames (mamagement) are TXed via this
-        * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is
-        * not set. As some cards may have different HW queues that
-        * one might want to use for data and management frames
-        * the option to have two callbacks might be useful.
-        * This function can't sleep.
-        */
-       int (*softmac_hard_start_xmit)(struct sk_buff *skb,
-                              struct ieee80211_device *ieee80211);
-
-       /* used instead of hard_start_xmit (not softmac_hard_start_xmit)
-        * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data
-        * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set
-        * then also management frames are sent via this callback.
-        * This function can't sleep.
-        */
-       void (*softmac_data_hard_start_xmit)(struct sk_buff *skb,
-                              struct ieee80211_device *ieee80211, int rate);
-
-       /* stops the HW queue for DATA frames. Useful to avoid
-        * waste time to TX data frame when we are reassociating
-        * This function can sleep.
-        */
-       void (*data_hard_stop)(struct ieee80211_device *ieee80211);
-
-       /* OK this is complementar to data_poll_hard_stop */
-       void (*data_hard_resume)(struct ieee80211_device *ieee80211);
-
-       /* ask to the driver to retune the radio .
-        * This function can sleep. the driver should ensure
-        * the radio has been swithced before return.
-        */
-       void (*set_chan)(struct ieee80211_device *ieee80211, short ch);
-
-       /* These are not used if the ieee stack takes care of
-        * scanning (IEEE_SOFTMAC_SCAN feature set).
-        * In this case only the set_chan is used.
-        *
-        * The syncro version is similar to the start_scan but
-        * does not return until all channels has been scanned.
-        * this is called in user context and should sleep,
-        * it is called in a work_queue when swithcing to ad-hoc mode
-        * or in behalf of iwlist scan when the card is associated
-        * and root user ask for a scan.
-        * the function stop_scan should stop both the syncro and
-        * background scanning and can sleep.
-        * The function start_scan should initiate the background
-        * scanning and can't sleep.
-        */
-       void (*scan_syncro)(struct ieee80211_device *ieee80211);
-       void (*start_scan)(struct ieee80211_device *ieee80211);
-       void (*stop_scan)(struct ieee80211_device *ieee80211);
-
-       /* indicate the driver that the link state is changed
-        * for example it may indicate the card is associated now.
-        * Driver might be interested in this to apply RX filter
-        * rules or simply light the LINK led
-        */
-       void (*link_change)(struct ieee80211_device *ieee80211);
-
-       /* these two function indicates to the HW when to start
-        * and stop to send beacons. This is used when the
-        * IEEE_SOFTMAC_BEACONS is not set. For now the
-        * stop_send_bacons is NOT guaranteed to be called only
-        * after start_send_beacons.
-        */
-       void (*start_send_beacons) (struct ieee80211_device *dev);
-       void (*stop_send_beacons) (struct ieee80211_device *dev);
-
-       /* power save mode related */
-       void (*sta_wake_up) (struct ieee80211_device *ieee80211);
-       void (*enter_sleep_state) (struct ieee80211_device *ieee80211, u32 th, u32 tl);
-       short (*ps_is_queue_empty) (struct ieee80211_device *ieee80211);
-        int (*handle_beacon) (struct ieee80211_device *ieee80211, struct ieee80211_beacon *beacon, struct ieee80211_network *network);
-        int (*handle_assoc_response) (struct ieee80211_device *ieee80211, struct ieee80211_assoc_response_frame *resp, struct ieee80211_network *network);
-
-       /* check whether Tx hw resouce available */
-       short (*check_nic_enough_desc)(struct ieee80211_device *ieee80211, int queue_index);
-       //added by wb for HT related
-       void (*SetBWModeHandler)(struct ieee80211_device *ieee80211, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
-       bool (*GetNmodeSupportBySecCfg)(struct ieee80211_device *ieee80211);
-       void (*SetWirelessMode)(struct ieee80211_device *ieee80211, u8 wireless_mode);
-       bool (*GetHalfNmodeSupportByAPsHandler)(struct ieee80211_device *ieee80211);
-       void (*InitialGainHandler)(struct ieee80211_device *ieee80211, u8 Operation);
-
-       /* This must be the last item so that it points to the data
-        * allocated beyond this structure by alloc_ieee80211 */
-       u8 priv[0];
-};
-
-#define        RT_RF_OFF_LEVL_ASPM                     BIT0    // PCI ASPM
-#define        RT_RF_OFF_LEVL_CLK_REQ          BIT1    // PCI clock request
-#define        RT_RF_OFF_LEVL_PCI_D3                   BIT2    // PCI D3 mode
-#define        RT_RF_OFF_LEVL_HALT_NIC         BIT3    // NIC halt, re-initialize hw parameters
-#define        RT_RF_OFF_LEVL_FREE_FW          BIT4    // FW free, re-download the FW
-#define        RT_RF_OFF_LEVL_FW_32K           BIT5    // FW in 32k
-#define        RT_RF_PS_LEVEL_ALWAYS_ASPM      BIT6    // Always enable ASPM and Clock Req in initialization.
-#define        RT_RF_LPS_DISALBE_2R                    BIT30   // When LPS is on, disable 2R if no packet is received or transmittd.
-#define        RT_RF_LPS_LEVEL_ASPM                    BIT31   // LPS with ASPM
-#define        RT_IN_PS_LEVEL(pPSC, _PS_FLAG)  ((pPSC->CurPsLevel & _PS_FLAG) ? true : false)
-#define        RT_CLEAR_PS_LEVEL(pPSC, _PS_FLAG)       (pPSC->CurPsLevel &= (~(_PS_FLAG)))
-#define        RT_SET_PS_LEVEL(pPSC, _PS_FLAG) (pPSC->CurPsLevel |= _PS_FLAG)
-
-#define IEEE_A            (1<<0)
-#define IEEE_B            (1<<1)
-#define IEEE_G            (1<<2)
-#define IEEE_N_24G               (1<<4)
-#define        IEEE_N_5G                 (1<<5)
-#define IEEE_MODE_MASK    (IEEE_A|IEEE_B|IEEE_G)
-
-/* Generate a 802.11 header */
-
-/* Uses the channel change callback directly
- * instead of [start/stop] scan callbacks
- */
-#define IEEE_SOFTMAC_SCAN (1<<2)
-
-/* Perform authentication and association handshake */
-#define IEEE_SOFTMAC_ASSOCIATE (1<<3)
-
-/* Generate probe requests */
-#define IEEE_SOFTMAC_PROBERQ (1<<4)
-
-/* Generate respones to probe requests */
-#define IEEE_SOFTMAC_PROBERS (1<<5)
-
-/* The ieee802.11 stack will manages the netif queue
- * wake/stop for the driver, taking care of 802.11
- * fragmentation. See softmac.c for details. */
-#define IEEE_SOFTMAC_TX_QUEUE (1<<7)
-
-/* Uses only the softmac_data_hard_start_xmit
- * even for TX management frames.
- */
-#define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8)
-
-/* Generate beacons.  The stack will enqueue beacons
- * to the card
- */
-#define IEEE_SOFTMAC_BEACONS (1<<6)
-
-static inline void *ieee80211_priv(struct net_device *dev)
-{
-       return ((struct ieee80211_device *)netdev_priv(dev))->priv;
-}
-
-extern inline int ieee80211_is_empty_essid(const char *essid, int essid_len)
-{
-       /* Single white space is for Linksys APs */
-       if (essid_len == 1 && essid[0] == ' ')
-               return 1;
-
-       /* Otherwise, if the entire essid is 0, we assume it is hidden */
-       while (essid_len) {
-               essid_len--;
-               if (essid[essid_len] != '\0')
-                       return 0;
-       }
-
-       return 1;
-}
-
-extern inline int ieee80211_is_valid_mode(struct ieee80211_device *ieee, int mode)
-{
-       /*
-        * It is possible for both access points and our device to support
-        * combinations of modes, so as long as there is one valid combination
-        * of ap/device supported modes, then return success
-        *
-        */
-       if ((mode & IEEE_A) &&
-           (ieee->modulation & IEEE80211_OFDM_MODULATION) &&
-           (ieee->freq_band & IEEE80211_52GHZ_BAND))
-               return 1;
-
-       if ((mode & IEEE_G) &&
-           (ieee->modulation & IEEE80211_OFDM_MODULATION) &&
-           (ieee->freq_band & IEEE80211_24GHZ_BAND))
-               return 1;
-
-       if ((mode & IEEE_B) &&
-           (ieee->modulation & IEEE80211_CCK_MODULATION) &&
-           (ieee->freq_band & IEEE80211_24GHZ_BAND))
-               return 1;
-
-       return 0;
-}
-
-extern inline int ieee80211_get_hdrlen(u16 fc)
-{
-       int hdrlen = IEEE80211_3ADDR_LEN;
-
-       switch (WLAN_FC_GET_TYPE(fc)) {
-       case IEEE80211_FTYPE_DATA:
-               if ((fc & IEEE80211_FCTL_FROMDS) && (fc & IEEE80211_FCTL_TODS))
-                       hdrlen = IEEE80211_4ADDR_LEN; /* Addr4 */
-               if(IEEE80211_QOS_HAS_SEQ(fc))
-                       hdrlen += 2; /* QOS ctrl*/
-               break;
-       case IEEE80211_FTYPE_CTL:
-               switch (WLAN_FC_GET_STYPE(fc)) {
-               case IEEE80211_STYPE_CTS:
-               case IEEE80211_STYPE_ACK:
-                       hdrlen = IEEE80211_1ADDR_LEN;
-                       break;
-               default:
-                       hdrlen = IEEE80211_2ADDR_LEN;
-                       break;
-               }
-               break;
-       }
-
-       return hdrlen;
-}
-
-static inline u8 *ieee80211_get_payload(struct ieee80211_hdr *hdr)
-{
-        switch (ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl))) {
-        case IEEE80211_1ADDR_LEN:
-                return ((struct ieee80211_hdr_1addr *)hdr)->payload;
-        case IEEE80211_2ADDR_LEN:
-                return ((struct ieee80211_hdr_2addr *)hdr)->payload;
-        case IEEE80211_3ADDR_LEN:
-                return ((struct ieee80211_hdr_3addr *)hdr)->payload;
-        case IEEE80211_4ADDR_LEN:
-                return ((struct ieee80211_hdr_4addr *)hdr)->payload;
-        }
-        return NULL;
-}
-
-static inline int ieee80211_is_ofdm_rate(u8 rate)
-{
-        switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
-        case IEEE80211_OFDM_RATE_6MB:
-        case IEEE80211_OFDM_RATE_9MB:
-        case IEEE80211_OFDM_RATE_12MB:
-        case IEEE80211_OFDM_RATE_18MB:
-        case IEEE80211_OFDM_RATE_24MB:
-        case IEEE80211_OFDM_RATE_36MB:
-        case IEEE80211_OFDM_RATE_48MB:
-        case IEEE80211_OFDM_RATE_54MB:
-                return 1;
-        }
-        return 0;
-}
-
-static inline int ieee80211_is_cck_rate(u8 rate)
-{
-        switch (rate & ~IEEE80211_BASIC_RATE_MASK) {
-        case IEEE80211_CCK_RATE_1MB:
-        case IEEE80211_CCK_RATE_2MB:
-        case IEEE80211_CCK_RATE_5MB:
-        case IEEE80211_CCK_RATE_11MB:
-                return 1;
-        }
-        return 0;
-}
-
-
-/* ieee80211.c */
-void free_ieee80211(struct net_device *dev);
-struct net_device *alloc_ieee80211(int sizeof_priv);
-
-int ieee80211_set_encryption(struct ieee80211_device *ieee);
-
-/* ieee80211_tx.c */
-
-int ieee80211_encrypt_fragment(
-       struct ieee80211_device *ieee,
-       struct sk_buff *frag,
-       int hdr_len);
-
-int ieee80211_rtl_xmit(struct sk_buff *skb,
-                         struct net_device *dev);
-void ieee80211_txb_free(struct ieee80211_txb *);
-
-
-/* ieee80211_rx.c */
-int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
-                       struct ieee80211_rx_stats *rx_stats);
-void ieee80211_rx_mgt(struct ieee80211_device *ieee,
-                            struct ieee80211_hdr_4addr *header,
-                            struct ieee80211_rx_stats *stats);
-
-/* ieee80211_wx.c */
-int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
-                                struct iw_request_info *info,
-                                union iwreq_data *wrqu, char *key);
-int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
-                                  struct iw_request_info *info,
-                                  union iwreq_data *wrqu, char *key);
-int ieee80211_wx_get_encode(struct ieee80211_device *ieee,
-                                  struct iw_request_info *info,
-                                  union iwreq_data *wrqu, char *key);
-int ieee80211_wx_get_encode_ext(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data* wrqu, char *extra);
-int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data* wrqu, char *extra);
-int ieee80211_wx_set_auth(struct ieee80211_device *ieee,
-                               struct iw_request_info *info,
-                               struct iw_param *data, char *extra);
-int ieee80211_wx_set_mlme(struct ieee80211_device *ieee,
-                               struct iw_request_info *info,
-                               union iwreq_data *wrqu, char *extra);
-int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len);
-
-/* ieee80211_softmac.c */
-short ieee80211_is_54g(struct ieee80211_network net);
-short ieee80211_is_shortslot(struct ieee80211_network net);
-int ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb,
-                       struct ieee80211_rx_stats *rx_stats, u16 type,
-                       u16 stype);
-void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net);
-
-void SendDisassociation(struct ieee80211_device *ieee, u8* asSta, u8 asRsn);
-void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee);
-
-void ieee80211_stop_send_beacons(struct ieee80211_device *ieee);
-void notify_wx_assoc_event(struct ieee80211_device *ieee);
-void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee);
-void ieee80211_start_bss(struct ieee80211_device *ieee);
-void ieee80211_start_master_bss(struct ieee80211_device *ieee);
-void ieee80211_start_ibss(struct ieee80211_device *ieee);
-void ieee80211_softmac_init(struct ieee80211_device *ieee);
-void ieee80211_softmac_free(struct ieee80211_device *ieee);
-void ieee80211_associate_abort(struct ieee80211_device *ieee);
-void ieee80211_disassociate(struct ieee80211_device *ieee);
-void ieee80211_stop_scan(struct ieee80211_device *ieee);
-void ieee80211_start_scan_syncro(struct ieee80211_device *ieee);
-void ieee80211_check_all_nets(struct ieee80211_device *ieee);
-void ieee80211_start_protocol(struct ieee80211_device *ieee);
-void ieee80211_stop_protocol(struct ieee80211_device *ieee,u8 shutdown);
-void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee);
-void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee,u8 shutdown);
-void ieee80211_reset_queue(struct ieee80211_device *ieee);
-void ieee80211_rtl_wake_queue(struct ieee80211_device *ieee);
-void ieee80211_rtl_stop_queue(struct ieee80211_device *ieee);
-struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee);
-void ieee80211_start_send_beacons(struct ieee80211_device *ieee);
-void ieee80211_stop_send_beacons(struct ieee80211_device *ieee);
-int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p);
-void notify_wx_assoc_event(struct ieee80211_device *ieee);
-void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success);
-
-void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee);
-
-/* ieee80211_crypt_ccmp&tkip&wep.c */
-void ieee80211_tkip_null(void);
-void ieee80211_wep_null(void);
-void ieee80211_ccmp_null(void);
-
-/* ieee80211_softmac_wx.c */
-
-int ieee80211_wx_get_wap(struct ieee80211_device *ieee,
-                           struct iw_request_info *info,
-                           union iwreq_data *wrqu, char *ext);
-
-int ieee80211_wx_set_wap(struct ieee80211_device *ieee,
-                        struct iw_request_info *info,
-                        union iwreq_data *awrq,
-                        char *extra);
-
-int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b);
-
-int ieee80211_wx_set_rate(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_get_rate(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b);
-
-int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b);
-
-int ieee80211_wx_set_essid(struct ieee80211_device *ieee,
-                             struct iw_request_info *a,
-                             union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b);
-
-int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b);
-
-int ieee80211_wx_get_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b);
-
-void ieee80211_wx_sync_scan_wq(struct work_struct *work);
-
-int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee,
-                              struct iw_request_info *info,
-                              union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_get_name(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_set_power(struct ieee80211_device *ieee,
-                                struct iw_request_info *info,
-                                union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_get_power(struct ieee80211_device *ieee,
-                                struct iw_request_info *info,
-                                union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_set_rts(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra);
-
-int ieee80211_wx_get_rts(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra);
-//HT
-#define MAX_RECEIVE_BUFFER_SIZE 9100
-void HTDebugHTCapability(u8 *CapIE, u8 *TitleString );
-void HTDebugHTInfo(u8 *InfoIE, u8 *TitleString);
-
-void HTSetConnectBwMode(struct ieee80211_device *ieee, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
-void HTUpdateDefaultSetting(struct ieee80211_device *ieee);
-void HTConstructCapabilityElement(struct ieee80211_device *ieee, u8 *posHTCap, u8 *len, u8 isEncrypt);
-void HTConstructInfoElement(struct ieee80211_device *ieee, u8 *posHTInfo, u8 *len, u8 isEncrypt);
-void HTConstructRT2RTAggElement(struct ieee80211_device *ieee, u8 *posRT2RTAgg, u8 *len);
-void HTOnAssocRsp(struct ieee80211_device *ieee);
-void HTInitializeHTInfo(struct ieee80211_device *ieee);
-void HTInitializeBssDesc(PBSS_HT pBssHT);
-void HTResetSelfAndSavePeerSetting(struct ieee80211_device *ieee, struct ieee80211_network *pNetwork);
-void HTUpdateSelfAndPeerSetting(struct ieee80211_device *ieee, struct ieee80211_network *pNetwork);
-u8 HTGetHighestMCSRate(struct ieee80211_device *ieee, u8 *pMCSRateSet, u8 *pMCSFilter);
-extern u8 MCS_FILTER_ALL[];
-extern u16 MCS_DATA_RATE[2][2][77] ;
-
-u8 HTCCheck(struct ieee80211_device *ieee, u8 *pFrame);
-void HTResetIOTSetting(PRT_HIGH_THROUGHPUT pHTInfo);
-bool IsHTHalfNmodeAPs(struct ieee80211_device *ieee);
-u16 HTHalfMcsToDataRate(struct ieee80211_device *ieee, u8 nMcsRate);
-u16 HTMcsToDataRate( struct ieee80211_device *ieee, u8 nMcsRate);
-u16  TxCountToDataRate( struct ieee80211_device *ieee, u8 nDataRate);
-int ieee80211_rx_ADDBAReq( struct ieee80211_device *ieee, struct sk_buff *skb);
-int ieee80211_rx_ADDBARsp( struct ieee80211_device *ieee, struct sk_buff *skb);
-int ieee80211_rx_DELBA(struct ieee80211_device *ieee, struct sk_buff *skb);
-void TsInitAddBA( struct ieee80211_device *ieee, PTX_TS_RECORD pTS, u8 Policy, u8 bOverwritePending);
-void TsInitDelBA( struct ieee80211_device *ieee, PTS_COMMON_INFO pTsCommonInfo, TR_SELECT TxRxSelect);
-void BaSetupTimeOut(unsigned long data);
-void TxBaInactTimeout(unsigned long data);
-void RxBaInactTimeout(unsigned long data);
-void ResetBaEntry( PBA_RECORD pBA);
-//function in TS.c
-bool GetTs(
-        struct ieee80211_device*        ieee,
-        PTS_COMMON_INFO                 *ppTS,
-        u8*                             Addr,
-        u8                              TID,
-        TR_SELECT                       TxRxSelect,  //Rx:1, Tx:0
-        bool                            bAddNewTs
-        );
-void TSInitialize(struct ieee80211_device *ieee);
-void TsStartAddBaProcess(struct ieee80211_device *ieee, PTX_TS_RECORD pTxTS);
-void RemovePeerTS(struct ieee80211_device *ieee, u8 *Addr);
-void RemoveAllTS(struct ieee80211_device *ieee);
-void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee);
-
-extern const long ieee80211_wlan_frequencies[];
-
-extern inline void ieee80211_increment_scans(struct ieee80211_device *ieee)
-{
-       ieee->scans++;
-}
-
-extern inline int ieee80211_get_scans(struct ieee80211_device *ieee)
-{
-       return ieee->scans;
-}
-
-static inline const char *escape_essid(const char *essid, u8 essid_len) {
-       static char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
-       const char *s = essid;
-       char *d = escaped;
-
-       if (ieee80211_is_empty_essid(essid, essid_len)) {
-               memcpy(escaped, "<hidden>", sizeof("<hidden>"));
-               return escaped;
-       }
-
-       essid_len = min(essid_len, (u8)IW_ESSID_MAX_SIZE);
-       while (essid_len--) {
-               if (*s == '\0') {
-                       *d++ = '\\';
-                       *d++ = '0';
-                       s++;
-               } else {
-                       *d++ = *s++;
-               }
-       }
-       *d = '\0';
-       return escaped;
-}
-
-/* For the function is more related to hardware setting, it's better to use the
- * ieee handler to refer to it.
- */
-int ieee80211_data_xmit(struct sk_buff *skb, struct net_device *dev);
-int ieee80211_parse_info_param(struct ieee80211_device *ieee,
-               struct ieee80211_info_element *info_element,
-               u16 length,
-               struct ieee80211_network *network,
-               struct ieee80211_rx_stats *stats);
-
-void ieee80211_indicate_packets(struct ieee80211_device *ieee, struct ieee80211_rxb** prxbIndicateArray,u8  index);
-void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr);
-void ieee80211_sta_ps_send_pspoll_frame(struct ieee80211_device *ieee);
-#define RT_ASOC_RETRY_LIMIT    5
-#endif /* IEEE80211_H */
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.c
deleted file mode 100644 (file)
index 61fd4ce..0000000
+++ /dev/null
@@ -1,244 +0,0 @@
-/*
- * Host AP crypto routines
- *
- * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
- * Portions Copyright (C) 2004, Intel Corporation <jketreno@linux.intel.com>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- *
- */
-
-//#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <asm/string.h>
-#include <asm/errno.h>
-
-#include "ieee80211.h"
-
-//MODULE_AUTHOR("Jouni Malinen");
-//MODULE_DESCRIPTION("HostAP crypto");
-//MODULE_LICENSE("GPL");
-
-struct ieee80211_crypto_alg {
-       struct list_head list;
-       struct ieee80211_crypto_ops *ops;
-};
-
-
-struct ieee80211_crypto {
-       struct list_head algs;
-       spinlock_t lock;
-};
-
-static struct ieee80211_crypto *hcrypt;
-
-void ieee80211_crypt_deinit_entries(struct ieee80211_device *ieee,
-                                          int force)
-{
-       struct list_head *ptr, *n;
-       struct ieee80211_crypt_data *entry;
-
-       for (ptr = ieee->crypt_deinit_list.next, n = ptr->next;
-            ptr != &ieee->crypt_deinit_list; ptr = n, n = ptr->next) {
-               entry = list_entry(ptr, struct ieee80211_crypt_data, list);
-
-               if (atomic_read(&entry->refcnt) != 0 && !force)
-                       continue;
-
-               list_del(ptr);
-
-               if (entry->ops)
-                       entry->ops->deinit(entry->priv);
-               kfree(entry);
-       }
-}
-
-void ieee80211_crypt_deinit_handler(unsigned long data)
-{
-       struct ieee80211_device *ieee = (struct ieee80211_device *)data;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ieee->lock, flags);
-       ieee80211_crypt_deinit_entries(ieee, 0);
-       if (!list_empty(&ieee->crypt_deinit_list)) {
-               printk(KERN_DEBUG "%s: entries remaining in delayed crypt "
-                      "deletion list\n", ieee->dev->name);
-               ieee->crypt_deinit_timer.expires = jiffies + HZ;
-               add_timer(&ieee->crypt_deinit_timer);
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-}
-
-void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee,
-                                   struct ieee80211_crypt_data **crypt)
-{
-       struct ieee80211_crypt_data *tmp;
-       unsigned long flags;
-
-       if (*crypt == NULL)
-               return;
-
-       tmp = *crypt;
-       *crypt = NULL;
-
-       /* must not run ops->deinit() while there may be pending encrypt or
-        * decrypt operations. Use a list of delayed deinits to avoid needing
-        * locking. */
-
-       spin_lock_irqsave(&ieee->lock, flags);
-       list_add(&tmp->list, &ieee->crypt_deinit_list);
-       if (!timer_pending(&ieee->crypt_deinit_timer)) {
-               ieee->crypt_deinit_timer.expires = jiffies + HZ;
-               add_timer(&ieee->crypt_deinit_timer);
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-}
-
-int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops)
-{
-       unsigned long flags;
-       struct ieee80211_crypto_alg *alg;
-
-       if (hcrypt == NULL)
-               return -1;
-
-       alg = kzalloc(sizeof(*alg), GFP_KERNEL);
-       if (alg == NULL)
-               return -ENOMEM;
-
-       alg->ops = ops;
-
-       spin_lock_irqsave(&hcrypt->lock, flags);
-       list_add(&alg->list, &hcrypt->algs);
-       spin_unlock_irqrestore(&hcrypt->lock, flags);
-
-       printk(KERN_DEBUG "ieee80211_crypt: registered algorithm '%s'\n",
-              ops->name);
-
-       return 0;
-}
-
-int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops)
-{
-       unsigned long flags;
-       struct list_head *ptr;
-       struct ieee80211_crypto_alg *del_alg = NULL;
-
-       if (hcrypt == NULL)
-               return -1;
-
-       spin_lock_irqsave(&hcrypt->lock, flags);
-       for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
-               struct ieee80211_crypto_alg *alg =
-                       (struct ieee80211_crypto_alg *) ptr;
-               if (alg->ops == ops) {
-                       list_del(&alg->list);
-                       del_alg = alg;
-                       break;
-               }
-       }
-       spin_unlock_irqrestore(&hcrypt->lock, flags);
-
-       if (del_alg) {
-               printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
-                      "'%s'\n", ops->name);
-               kfree(del_alg);
-       }
-
-       return del_alg ? 0 : -1;
-}
-
-
-struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name)
-{
-       unsigned long flags;
-       struct list_head *ptr;
-       struct ieee80211_crypto_alg *found_alg = NULL;
-
-       if (hcrypt == NULL)
-               return NULL;
-
-       spin_lock_irqsave(&hcrypt->lock, flags);
-       for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
-               struct ieee80211_crypto_alg *alg =
-                       (struct ieee80211_crypto_alg *) ptr;
-               if (strcmp(alg->ops->name, name) == 0) {
-                       found_alg = alg;
-                       break;
-               }
-       }
-       spin_unlock_irqrestore(&hcrypt->lock, flags);
-
-       if (found_alg)
-               return found_alg->ops;
-       else
-               return NULL;
-}
-
-
-static void * ieee80211_crypt_null_init(int keyidx) { return (void *) 1; }
-static void ieee80211_crypt_null_deinit(void *priv) {}
-
-static struct ieee80211_crypto_ops ieee80211_crypt_null = {
-       .name                   = "NULL",
-       .init                   = ieee80211_crypt_null_init,
-       .deinit                 = ieee80211_crypt_null_deinit,
-       .encrypt_mpdu           = NULL,
-       .decrypt_mpdu           = NULL,
-       .encrypt_msdu           = NULL,
-       .decrypt_msdu           = NULL,
-       .set_key                = NULL,
-       .get_key                = NULL,
-       .extra_prefix_len       = 0,
-       .extra_postfix_len      = 0,
-       .owner                  = THIS_MODULE,
-};
-
-
-int __init ieee80211_crypto_init(void)
-{
-       int ret = -ENOMEM;
-
-       hcrypt = kzalloc(sizeof(*hcrypt), GFP_KERNEL);
-       if (!hcrypt)
-               goto out;
-
-       INIT_LIST_HEAD(&hcrypt->algs);
-       spin_lock_init(&hcrypt->lock);
-
-       ret = ieee80211_register_crypto_ops(&ieee80211_crypt_null);
-       if (ret < 0) {
-               kfree(hcrypt);
-               hcrypt = NULL;
-       }
-out:
-       return ret;
-}
-
-
-void ieee80211_crypto_deinit(void)
-{
-       struct list_head *ptr, *n;
-
-       if (hcrypt == NULL)
-               return;
-
-       for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
-            ptr = n, n = ptr->next) {
-               struct ieee80211_crypto_alg *alg =
-                       (struct ieee80211_crypto_alg *) ptr;
-               list_del(ptr);
-               printk(KERN_DEBUG "ieee80211_crypt: unregistered algorithm "
-                      "'%s' (deinit)\n", alg->ops->name);
-               kfree(alg);
-       }
-
-       kfree(hcrypt);
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.h b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt.h
deleted file mode 100644 (file)
index ca7dd0d..0000000
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Original code based on Host AP (software wireless LAN access point) driver
- * for Intersil Prism2/2.5/3.
- *
- * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
- * <jkmaline@cc.hut.fi>
- * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
- *
- * Adaption to a generic IEEE 802.11 stack by James Ketrenos
- * <jketreno@linux.intel.com>
- *
- * Copyright (c) 2004, Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- */
-
-/*
- * This file defines the interface to the ieee80211 crypto module.
- */
-#ifndef IEEE80211_CRYPT_H
-#define IEEE80211_CRYPT_H
-
-#include <linux/skbuff.h>
-
-struct ieee80211_crypto_ops {
-       const char *name;
-
-       /* init new crypto context (e.g., allocate private data space,
-        * select IV, etc.); returns NULL on failure or pointer to allocated
-        * private data on success */
-       void * (*init)(int keyidx);
-
-       /* deinitialize crypto context and free allocated private data */
-       void (*deinit)(void *priv);
-
-       /* encrypt/decrypt return < 0 on error or >= 0 on success. The return
-        * value from decrypt_mpdu is passed as the keyidx value for
-        * decrypt_msdu. skb must have enough head and tail room for the
-        * encryption; if not, error will be returned; these functions are
-        * called for all MPDUs (i.e., fragments).
-        */
-       int (*encrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv);
-       int (*decrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv);
-
-       /* These functions are called for full MSDUs, i.e. full frames.
-        * These can be NULL if full MSDU operations are not needed. */
-       int (*encrypt_msdu)(struct sk_buff *skb, int hdr_len, void *priv);
-       int (*decrypt_msdu)(struct sk_buff *skb, int keyidx, int hdr_len,
-                           void *priv);
-
-       int (*set_key)(void *key, int len, u8 *seq, void *priv);
-       int (*get_key)(void *key, int len, u8 *seq, void *priv);
-
-       /* procfs handler for printing out key information and possible
-        * statistics */
-       char * (*print_stats)(char *p, void *priv);
-
-       /* maximum number of bytes added by encryption; encrypt buf is
-        * allocated with extra_prefix_len bytes, copy of in_buf, and
-        * extra_postfix_len; encrypt need not use all this space, but
-        * the result must start at the beginning of the buffer and correct
-        * length must be returned */
-       int extra_prefix_len, extra_postfix_len;
-
-       struct module *owner;
-};
-
-struct ieee80211_crypt_data {
-       struct list_head list; /* delayed deletion list */
-       struct ieee80211_crypto_ops *ops;
-       void *priv;
-       atomic_t refcnt;
-};
-
-int ieee80211_register_crypto_ops(struct ieee80211_crypto_ops *ops);
-int ieee80211_unregister_crypto_ops(struct ieee80211_crypto_ops *ops);
-struct ieee80211_crypto_ops * ieee80211_get_crypto_ops(const char *name);
-void ieee80211_crypt_deinit_entries(struct ieee80211_device *, int);
-void ieee80211_crypt_deinit_handler(unsigned long);
-void ieee80211_crypt_delayed_deinit(struct ieee80211_device *ieee,
-                                   struct ieee80211_crypt_data **crypt);
-#endif
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_ccmp.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_ccmp.c
deleted file mode 100644 (file)
index 48267a0..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-/*
- * Host AP crypt: host-based CCMP encryption implementation for Host AP driver
- *
- * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- */
-
-//#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/random.h>
-#include <linux/skbuff.h>
-#include <linux/netdevice.h>
-#include <linux/if_ether.h>
-#include <linux/if_arp.h>
-#include <asm/string.h>
-#include <linux/wireless.h>
-
-#include "ieee80211.h"
-
-#include <linux/crypto.h>
-
-    #include <linux/scatterlist.h>
-
-MODULE_AUTHOR("Jouni Malinen");
-MODULE_DESCRIPTION("Host AP crypt: CCMP");
-MODULE_LICENSE("GPL");
-
-#ifndef OPENSUSE_SLED
-#define OPENSUSE_SLED 0
-#endif
-
-#define AES_BLOCK_LEN 16
-#define CCMP_HDR_LEN 8
-#define CCMP_MIC_LEN 8
-#define CCMP_TK_LEN 16
-#define CCMP_PN_LEN 6
-
-struct ieee80211_ccmp_data {
-       u8 key[CCMP_TK_LEN];
-       int key_set;
-
-       u8 tx_pn[CCMP_PN_LEN];
-       u8 rx_pn[CCMP_PN_LEN];
-
-       u32 dot11RSNAStatsCCMPFormatErrors;
-       u32 dot11RSNAStatsCCMPReplays;
-       u32 dot11RSNAStatsCCMPDecryptErrors;
-
-       int key_idx;
-
-       struct crypto_tfm *tfm;
-
-       /* scratch buffers for virt_to_page() (crypto API) */
-       u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN],
-               tx_e[AES_BLOCK_LEN], tx_s0[AES_BLOCK_LEN];
-       u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN];
-};
-
-void ieee80211_ccmp_aes_encrypt(struct crypto_tfm *tfm,
-                            const u8 pt[16], u8 ct[16])
-{
-       crypto_cipher_encrypt_one((void*)tfm, ct, pt);
-}
-
-static void * ieee80211_ccmp_init(int key_idx)
-{
-       struct ieee80211_ccmp_data *priv;
-
-       priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
-       if (priv == NULL)
-               goto fail;
-       priv->key_idx = key_idx;
-
-       priv->tfm = (void*)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
-       if (IS_ERR(priv->tfm)) {
-               printk(KERN_DEBUG "ieee80211_crypt_ccmp: could not allocate "
-                      "crypto API aes\n");
-               priv->tfm = NULL;
-               goto fail;
-       }
-       return priv;
-
-fail:
-       if (priv) {
-               if (priv->tfm)
-                       crypto_free_cipher((void*)priv->tfm);
-               kfree(priv);
-       }
-
-       return NULL;
-}
-
-
-static void ieee80211_ccmp_deinit(void *priv)
-{
-       struct ieee80211_ccmp_data *_priv = priv;
-       if (_priv && _priv->tfm)
-               crypto_free_cipher((void*)_priv->tfm);
-       kfree(priv);
-}
-
-
-static inline void xor_block(u8 *b, u8 *a, size_t len)
-{
-       int i;
-       for (i = 0; i < len; i++)
-               b[i] ^= a[i];
-}
-
-
-
-static void ccmp_init_blocks(struct crypto_tfm *tfm,
-                            struct ieee80211_hdr_4addr *hdr,
-                            u8 *pn, size_t dlen, u8 *b0, u8 *auth,
-                            u8 *s0)
-{
-       u8 *pos, qc = 0;
-       size_t aad_len;
-       u16 fc;
-       int a4_included, qc_included;
-       u8 aad[2 * AES_BLOCK_LEN];
-
-       fc = le16_to_cpu(hdr->frame_ctl);
-       a4_included = ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-                      (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS));
-       /*
-       qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
-                      (WLAN_FC_GET_STYPE(fc) & 0x08));
-        */
-       // fixed by David :2006.9.6
-       qc_included = ((WLAN_FC_GET_TYPE(fc) == IEEE80211_FTYPE_DATA) &&
-                      (WLAN_FC_GET_STYPE(fc) & 0x80));
-       aad_len = 22;
-       if (a4_included)
-               aad_len += 6;
-       if (qc_included) {
-               pos = (u8 *) &hdr->addr4;
-               if (a4_included)
-                       pos += 6;
-               qc = *pos & 0x0f;
-               aad_len += 2;
-       }
-       /* CCM Initial Block:
-        * Flag (Include authentication header, M=3 (8-octet MIC),
-        *       L=1 (2-octet Dlen))
-        * Nonce: 0x00 | A2 | PN
-        * Dlen */
-       b0[0] = 0x59;
-       b0[1] = qc;
-       memcpy(b0 + 2, hdr->addr2, ETH_ALEN);
-       memcpy(b0 + 8, pn, CCMP_PN_LEN);
-       b0[14] = (dlen >> 8) & 0xff;
-       b0[15] = dlen & 0xff;
-
-       /* AAD:
-        * FC with bits 4..6 and 11..13 masked to zero; 14 is always one
-        * A1 | A2 | A3
-        * SC with bits 4..15 (seq#) masked to zero
-        * A4 (if present)
-        * QC (if present)
-        */
-       pos = (u8 *) hdr;
-       aad[0] = 0; /* aad_len >> 8 */
-       aad[1] = aad_len & 0xff;
-       aad[2] = pos[0] & 0x8f;
-       aad[3] = pos[1] & 0xc7;
-       memcpy(aad + 4, hdr->addr1, 3 * ETH_ALEN);
-       pos = (u8 *) &hdr->seq_ctl;
-       aad[22] = pos[0] & 0x0f;
-       aad[23] = 0; /* all bits masked */
-       memset(aad + 24, 0, 8);
-       if (a4_included)
-               memcpy(aad + 24, hdr->addr4, ETH_ALEN);
-       if (qc_included) {
-               aad[a4_included ? 30 : 24] = qc;
-               /* rest of QC masked */
-       }
-
-       /* Start with the first block and AAD */
-       ieee80211_ccmp_aes_encrypt(tfm, b0, auth);
-       xor_block(auth, aad, AES_BLOCK_LEN);
-       ieee80211_ccmp_aes_encrypt(tfm, auth, auth);
-       xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN);
-       ieee80211_ccmp_aes_encrypt(tfm, auth, auth);
-       b0[0] &= 0x07;
-       b0[14] = b0[15] = 0;
-       ieee80211_ccmp_aes_encrypt(tfm, b0, s0);
-}
-
-
-
-static int ieee80211_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct ieee80211_ccmp_data *key = priv;
-       int data_len, i;
-       u8 *pos;
-       struct ieee80211_hdr_4addr *hdr;
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-
-       if (skb_headroom(skb) < CCMP_HDR_LEN ||
-           skb_tailroom(skb) < CCMP_MIC_LEN ||
-           skb->len < hdr_len)
-               return -1;
-
-       data_len = skb->len - hdr_len;
-       pos = skb_push(skb, CCMP_HDR_LEN);
-       memmove(pos, pos + CCMP_HDR_LEN, hdr_len);
-       pos += hdr_len;
-//     mic = skb_put(skb, CCMP_MIC_LEN);
-
-       i = CCMP_PN_LEN - 1;
-       while (i >= 0) {
-               key->tx_pn[i]++;
-               if (key->tx_pn[i] != 0)
-                       break;
-               i--;
-       }
-
-       *pos++ = key->tx_pn[5];
-       *pos++ = key->tx_pn[4];
-       *pos++ = 0;
-       *pos++ = (key->key_idx << 6) | (1 << 5) /* Ext IV included */;
-       *pos++ = key->tx_pn[3];
-       *pos++ = key->tx_pn[2];
-       *pos++ = key->tx_pn[1];
-       *pos++ = key->tx_pn[0];
-
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       if (!tcb_desc->bHwSec)
-       {
-               int blocks, last, len;
-               u8 *mic;
-               u8 *b0 = key->tx_b0;
-               u8 *b = key->tx_b;
-               u8 *e = key->tx_e;
-               u8 *s0 = key->tx_s0;
-
-               //mic is moved to here by john
-               mic = skb_put(skb, CCMP_MIC_LEN);
-
-               ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0);
-
-               blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN;
-               last = data_len % AES_BLOCK_LEN;
-
-               for (i = 1; i <= blocks; i++) {
-                       len = (i == blocks && last) ? last : AES_BLOCK_LEN;
-                       /* Authentication */
-                       xor_block(b, pos, len);
-                       ieee80211_ccmp_aes_encrypt(key->tfm, b, b);
-                       /* Encryption, with counter */
-                       b0[14] = (i >> 8) & 0xff;
-                       b0[15] = i & 0xff;
-                       ieee80211_ccmp_aes_encrypt(key->tfm, b0, e);
-                       xor_block(pos, e, len);
-                       pos += len;
-               }
-
-               for (i = 0; i < CCMP_MIC_LEN; i++)
-                       mic[i] = b[i] ^ s0[i];
-       }
-       return 0;
-}
-
-
-static int ieee80211_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct ieee80211_ccmp_data *key = priv;
-       u8 keyidx, *pos;
-       struct ieee80211_hdr_4addr *hdr;
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-       u8 pn[6];
-
-       if (skb->len < hdr_len + CCMP_HDR_LEN + CCMP_MIC_LEN) {
-               key->dot11RSNAStatsCCMPFormatErrors++;
-               return -1;
-       }
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       pos = skb->data + hdr_len;
-       keyidx = pos[3];
-       if (!(keyidx & (1 << 5))) {
-               if (net_ratelimit()) {
-                       printk(KERN_DEBUG "CCMP: received packet without ExtIV"
-                              " flag from %pM\n", hdr->addr2);
-               }
-               key->dot11RSNAStatsCCMPFormatErrors++;
-               return -2;
-       }
-       keyidx >>= 6;
-       if (key->key_idx != keyidx) {
-               printk(KERN_DEBUG "CCMP: RX tkey->key_idx=%d frame "
-                      "keyidx=%d priv=%p\n", key->key_idx, keyidx, priv);
-               return -6;
-       }
-       if (!key->key_set) {
-               if (net_ratelimit()) {
-                       printk(KERN_DEBUG "CCMP: received packet from %pM"
-                              " with keyid=%d that does not have a configured"
-                              " key\n", hdr->addr2, keyidx);
-               }
-               return -3;
-       }
-
-       pn[0] = pos[7];
-       pn[1] = pos[6];
-       pn[2] = pos[5];
-       pn[3] = pos[4];
-       pn[4] = pos[1];
-       pn[5] = pos[0];
-       pos += 8;
-
-       if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) {
-               key->dot11RSNAStatsCCMPReplays++;
-               return -4;
-       }
-       if (!tcb_desc->bHwSec)
-       {
-               size_t data_len = skb->len - hdr_len - CCMP_HDR_LEN - CCMP_MIC_LEN;
-               u8 *mic = skb->data + skb->len - CCMP_MIC_LEN;
-               u8 *b0 = key->rx_b0;
-               u8 *b = key->rx_b;
-               u8 *a = key->rx_a;
-               int i, blocks, last, len;
-
-
-               ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b);
-               xor_block(mic, b, CCMP_MIC_LEN);
-
-               blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN;
-               last = data_len % AES_BLOCK_LEN;
-
-               for (i = 1; i <= blocks; i++) {
-                       len = (i == blocks && last) ? last : AES_BLOCK_LEN;
-                       /* Decrypt, with counter */
-                       b0[14] = (i >> 8) & 0xff;
-                       b0[15] = i & 0xff;
-                       ieee80211_ccmp_aes_encrypt(key->tfm, b0, b);
-                       xor_block(pos, b, len);
-                       /* Authentication */
-                       xor_block(a, pos, len);
-                       ieee80211_ccmp_aes_encrypt(key->tfm, a, a);
-                       pos += len;
-               }
-
-               if (memcmp(mic, a, CCMP_MIC_LEN) != 0) {
-                       if (net_ratelimit()) {
-                               printk(KERN_DEBUG "CCMP: decrypt failed: STA="
-                               "%pM\n", hdr->addr2);
-                       }
-                       key->dot11RSNAStatsCCMPDecryptErrors++;
-                       return -5;
-               }
-
-               memcpy(key->rx_pn, pn, CCMP_PN_LEN);
-       }
-       /* Remove hdr and MIC */
-       memmove(skb->data + CCMP_HDR_LEN, skb->data, hdr_len);
-       skb_pull(skb, CCMP_HDR_LEN);
-       skb_trim(skb, skb->len - CCMP_MIC_LEN);
-
-       return keyidx;
-}
-
-
-static int ieee80211_ccmp_set_key(void *key, int len, u8 *seq, void *priv)
-{
-       struct ieee80211_ccmp_data *data = priv;
-       int keyidx;
-       struct crypto_tfm *tfm = data->tfm;
-
-       keyidx = data->key_idx;
-       memset(data, 0, sizeof(*data));
-       data->key_idx = keyidx;
-       data->tfm = tfm;
-       if (len == CCMP_TK_LEN) {
-               memcpy(data->key, key, CCMP_TK_LEN);
-               data->key_set = 1;
-               if (seq) {
-                       data->rx_pn[0] = seq[5];
-                       data->rx_pn[1] = seq[4];
-                       data->rx_pn[2] = seq[3];
-                       data->rx_pn[3] = seq[2];
-                       data->rx_pn[4] = seq[1];
-                       data->rx_pn[5] = seq[0];
-               }
-               crypto_cipher_setkey((void*)data->tfm, data->key, CCMP_TK_LEN);
-       } else if (len == 0)
-               data->key_set = 0;
-       else
-               return -1;
-
-       return 0;
-}
-
-
-static int ieee80211_ccmp_get_key(void *key, int len, u8 *seq, void *priv)
-{
-       struct ieee80211_ccmp_data *data = priv;
-
-       if (len < CCMP_TK_LEN)
-               return -1;
-
-       if (!data->key_set)
-               return 0;
-       memcpy(key, data->key, CCMP_TK_LEN);
-
-       if (seq) {
-               seq[0] = data->tx_pn[5];
-               seq[1] = data->tx_pn[4];
-               seq[2] = data->tx_pn[3];
-               seq[3] = data->tx_pn[2];
-               seq[4] = data->tx_pn[1];
-               seq[5] = data->tx_pn[0];
-       }
-
-       return CCMP_TK_LEN;
-}
-
-
-static char * ieee80211_ccmp_print_stats(char *p, void *priv)
-{
-       struct ieee80211_ccmp_data *ccmp = priv;
-       int i;
-
-       p += sprintf(p, "key[%d] alg=CCMP key_set=%d tx_pn=",
-                    ccmp->key_idx, ccmp->key_set);
-
-       for (i = 0; i < ARRAY_SIZE(ccmp->tx_pn); i++)
-               p += sprintf(p, "%02x", ccmp->tx_pn[i]);
-
-       sprintf(p, " rx_pn=");
-       for (i = 0; i < ARRAY_SIZE(ccmp->rx_pn); i++)
-               p += sprintf(p, "%02x", ccmp->tx_pn[i]);
-
-       p += sprintf(p, " format_errors=%d replays=%d decrypt_errors=%d\n",
-                    ccmp->dot11RSNAStatsCCMPFormatErrors,
-                    ccmp->dot11RSNAStatsCCMPReplays,
-                    ccmp->dot11RSNAStatsCCMPDecryptErrors);
-
-       return p;
-}
-
-void ieee80211_ccmp_null(void)
-{
-       return;
-}
-
-static struct ieee80211_crypto_ops ieee80211_crypt_ccmp = {
-       .name                   = "CCMP",
-       .init                   = ieee80211_ccmp_init,
-       .deinit                 = ieee80211_ccmp_deinit,
-       .encrypt_mpdu           = ieee80211_ccmp_encrypt,
-       .decrypt_mpdu           = ieee80211_ccmp_decrypt,
-       .encrypt_msdu           = NULL,
-       .decrypt_msdu           = NULL,
-       .set_key                = ieee80211_ccmp_set_key,
-       .get_key                = ieee80211_ccmp_get_key,
-       .print_stats            = ieee80211_ccmp_print_stats,
-       .extra_prefix_len       = CCMP_HDR_LEN,
-       .extra_postfix_len      = CCMP_MIC_LEN,
-       .owner                  = THIS_MODULE,
-};
-
-
-int __init ieee80211_crypto_ccmp_init(void)
-{
-       return ieee80211_register_crypto_ops(&ieee80211_crypt_ccmp);
-}
-
-
-void ieee80211_crypto_ccmp_exit(void)
-{
-       ieee80211_unregister_crypto_ops(&ieee80211_crypt_ccmp);
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_tkip.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_tkip.c
deleted file mode 100644 (file)
index ed623a9..0000000
+++ /dev/null
@@ -1,809 +0,0 @@
-/*
- * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
- *
- * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- */
-
-//#include <linux/config.h>
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/random.h>
-#include <linux/skbuff.h>
-#include <linux/netdevice.h>
-#include <linux/if_ether.h>
-#include <linux/if_arp.h>
-#include <asm/string.h>
-
-#include "ieee80211.h"
-
-
-#include <linux/crypto.h>
-#include <linux/scatterlist.h>
-
-#include <linux/crc32.h>
-
-MODULE_AUTHOR("Jouni Malinen");
-MODULE_DESCRIPTION("Host AP crypt: TKIP");
-MODULE_LICENSE("GPL");
-
-#ifndef OPENSUSE_SLED
-#define OPENSUSE_SLED 0
-#endif
-
-struct ieee80211_tkip_data {
-#define TKIP_KEY_LEN 32
-       u8 key[TKIP_KEY_LEN];
-       int key_set;
-
-       u32 tx_iv32;
-       u16 tx_iv16;
-       u16 tx_ttak[5];
-       int tx_phase1_done;
-
-       u32 rx_iv32;
-       u16 rx_iv16;
-       u16 rx_ttak[5];
-       int rx_phase1_done;
-       u32 rx_iv32_new;
-       u16 rx_iv16_new;
-
-       u32 dot11RSNAStatsTKIPReplays;
-       u32 dot11RSNAStatsTKIPICVErrors;
-       u32 dot11RSNAStatsTKIPLocalMICFailures;
-
-       int key_idx;
-       struct crypto_blkcipher *rx_tfm_arc4;
-       struct crypto_hash *rx_tfm_michael;
-       struct crypto_blkcipher *tx_tfm_arc4;
-       struct crypto_hash *tx_tfm_michael;
-       /* scratch buffers for virt_to_page() (crypto API) */
-       u8 rx_hdr[16], tx_hdr[16];
-};
-
-static void * ieee80211_tkip_init(int key_idx)
-{
-       struct ieee80211_tkip_data *priv;
-
-       priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
-       if (priv == NULL)
-               goto fail;
-       priv->key_idx = key_idx;
-       priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-                       CRYPTO_ALG_ASYNC);
-       if (IS_ERR(priv->tx_tfm_arc4)) {
-               printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-                               "crypto API arc4\n");
-               priv->tx_tfm_arc4 = NULL;
-               goto fail;
-       }
-
-       priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-                       CRYPTO_ALG_ASYNC);
-       if (IS_ERR(priv->tx_tfm_michael)) {
-               printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-                               "crypto API michael_mic\n");
-               priv->tx_tfm_michael = NULL;
-               goto fail;
-       }
-
-       priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
-                       CRYPTO_ALG_ASYNC);
-       if (IS_ERR(priv->rx_tfm_arc4)) {
-               printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-                               "crypto API arc4\n");
-               priv->rx_tfm_arc4 = NULL;
-               goto fail;
-       }
-
-       priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
-                       CRYPTO_ALG_ASYNC);
-       if (IS_ERR(priv->rx_tfm_michael)) {
-               printk(KERN_DEBUG "ieee80211_crypt_tkip: could not allocate "
-                               "crypto API michael_mic\n");
-               priv->rx_tfm_michael = NULL;
-               goto fail;
-       }
-       return priv;
-
-fail:
-       if (priv) {
-               if (priv->tx_tfm_michael)
-                       crypto_free_hash(priv->tx_tfm_michael);
-               if (priv->tx_tfm_arc4)
-                       crypto_free_blkcipher(priv->tx_tfm_arc4);
-               if (priv->rx_tfm_michael)
-                       crypto_free_hash(priv->rx_tfm_michael);
-               if (priv->rx_tfm_arc4)
-                       crypto_free_blkcipher(priv->rx_tfm_arc4);
-               kfree(priv);
-       }
-
-       return NULL;
-}
-
-
-static void ieee80211_tkip_deinit(void *priv)
-{
-       struct ieee80211_tkip_data *_priv = priv;
-       if (_priv) {
-               if (_priv->tx_tfm_michael)
-                       crypto_free_hash(_priv->tx_tfm_michael);
-               if (_priv->tx_tfm_arc4)
-                       crypto_free_blkcipher(_priv->tx_tfm_arc4);
-               if (_priv->rx_tfm_michael)
-                       crypto_free_hash(_priv->rx_tfm_michael);
-               if (_priv->rx_tfm_arc4)
-                       crypto_free_blkcipher(_priv->rx_tfm_arc4);
-       }
-       kfree(priv);
-}
-
-
-static inline u16 RotR1(u16 val)
-{
-       return (val >> 1) | (val << 15);
-}
-
-
-static inline u8 Lo8(u16 val)
-{
-       return val & 0xff;
-}
-
-
-static inline u8 Hi8(u16 val)
-{
-       return val >> 8;
-}
-
-
-static inline u16 Lo16(u32 val)
-{
-       return val & 0xffff;
-}
-
-
-static inline u16 Hi16(u32 val)
-{
-       return val >> 16;
-}
-
-
-static inline u16 Mk16(u8 hi, u8 lo)
-{
-       return lo | (((u16) hi) << 8);
-}
-
-
-static inline u16 Mk16_le(u16 *v)
-{
-       return le16_to_cpu(*v);
-}
-
-
-static const u16 Sbox[256] =
-{
-       0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
-       0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
-       0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
-       0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
-       0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
-       0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
-       0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
-       0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
-       0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
-       0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
-       0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
-       0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
-       0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
-       0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
-       0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
-       0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
-       0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
-       0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
-       0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
-       0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
-       0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
-       0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
-       0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
-       0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
-       0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
-       0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
-       0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
-       0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
-       0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
-       0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
-       0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
-       0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
-};
-
-
-static inline u16 _S_(u16 v)
-{
-       u16 t = Sbox[Hi8(v)];
-       return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
-}
-
-
-#define PHASE1_LOOP_COUNT 8
-
-
-static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32)
-{
-       int i, j;
-
-       /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
-       TTAK[0] = Lo16(IV32);
-       TTAK[1] = Hi16(IV32);
-       TTAK[2] = Mk16(TA[1], TA[0]);
-       TTAK[3] = Mk16(TA[3], TA[2]);
-       TTAK[4] = Mk16(TA[5], TA[4]);
-
-       for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
-               j = 2 * (i & 1);
-               TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
-               TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
-               TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
-               TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
-               TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
-       }
-}
-
-
-static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
-                              u16 IV16)
-{
-       /* Make temporary area overlap WEP seed so that the final copy can be
-        * avoided on little endian hosts. */
-       u16 *PPK = (u16 *) &WEPSeed[4];
-
-       /* Step 1 - make copy of TTAK and bring in TSC */
-       PPK[0] = TTAK[0];
-       PPK[1] = TTAK[1];
-       PPK[2] = TTAK[2];
-       PPK[3] = TTAK[3];
-       PPK[4] = TTAK[4];
-       PPK[5] = TTAK[4] + IV16;
-
-       /* Step 2 - 96-bit bijective mixing using S-box */
-       PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) &TK[0]));
-       PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) &TK[2]));
-       PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) &TK[4]));
-       PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) &TK[6]));
-       PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) &TK[8]));
-       PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) &TK[10]));
-
-       PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) &TK[12]));
-       PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) &TK[14]));
-       PPK[2] += RotR1(PPK[1]);
-       PPK[3] += RotR1(PPK[2]);
-       PPK[4] += RotR1(PPK[3]);
-       PPK[5] += RotR1(PPK[4]);
-
-       /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
-        * WEPSeed[0..2] is transmitted as WEP IV */
-       WEPSeed[0] = Hi8(IV16);
-       WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
-       WEPSeed[2] = Lo8(IV16);
-       WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) &TK[0])) >> 1);
-
-#ifdef __BIG_ENDIAN
-       {
-               int i;
-               for (i = 0; i < 6; i++)
-                       PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
-       }
-#endif
-}
-
-
-static int ieee80211_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct ieee80211_tkip_data *tkey = priv;
-               int len;
-       u8 *pos;
-       struct ieee80211_hdr_4addr *hdr;
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-
-       struct blkcipher_desc desc = {.tfm = tkey->tx_tfm_arc4};
-       int ret = 0;
-       u8 rc4key[16],  *icv;
-       u32 crc;
-       struct scatterlist sg;
-
-       if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 ||
-           skb->len < hdr_len)
-               return -1;
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-
-       if (!tcb_desc->bHwSec)
-       {
-               if (!tkey->tx_phase1_done) {
-                       tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
-                                       tkey->tx_iv32);
-                       tkey->tx_phase1_done = 1;
-               }
-               tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
-       }
-       else
-       tkey->tx_phase1_done = 1;
-
-
-       len = skb->len - hdr_len;
-       pos = skb_push(skb, 8);
-       memmove(pos, pos + 8, hdr_len);
-       pos += hdr_len;
-
-       if (tcb_desc->bHwSec)
-       {
-               *pos++ = Hi8(tkey->tx_iv16);
-               *pos++ = (Hi8(tkey->tx_iv16) | 0x20) & 0x7F;
-               *pos++ = Lo8(tkey->tx_iv16);
-       }
-       else
-       {
-               *pos++ = rc4key[0];
-               *pos++ = rc4key[1];
-               *pos++ = rc4key[2];
-       }
-
-       *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */;
-       *pos++ = tkey->tx_iv32 & 0xff;
-       *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
-       *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
-       *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
-
-       if (!tcb_desc->bHwSec)
-       {
-               icv = skb_put(skb, 4);
-               crc = ~crc32_le(~0, pos, len);
-               icv[0] = crc;
-               icv[1] = crc >> 8;
-               icv[2] = crc >> 16;
-               icv[3] = crc >> 24;
-               crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
-               sg_init_one(&sg, pos, len+4);
-               ret= crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
-
-       }
-
-       tkey->tx_iv16++;
-       if (tkey->tx_iv16 == 0) {
-               tkey->tx_phase1_done = 0;
-               tkey->tx_iv32++;
-       }
-
-       if (!tcb_desc->bHwSec)
-               return ret;
-       else
-               return 0;
-
-
-}
-
-static int ieee80211_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct ieee80211_tkip_data *tkey = priv;
-       u8 keyidx, *pos;
-       u32 iv32;
-       u16 iv16;
-       struct ieee80211_hdr_4addr *hdr;
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-       struct blkcipher_desc desc = {.tfm = tkey->rx_tfm_arc4};
-       u8 rc4key[16];
-       u8 icv[4];
-       u32 crc;
-       struct scatterlist sg;
-       int plen;
-       if (skb->len < hdr_len + 8 + 4)
-               return -1;
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       pos = skb->data + hdr_len;
-       keyidx = pos[3];
-       if (!(keyidx & (1 << 5))) {
-               if (net_ratelimit()) {
-                       printk(KERN_DEBUG "TKIP: received packet without ExtIV"
-                              " flag from %pM\n", hdr->addr2);
-               }
-               return -2;
-       }
-       keyidx >>= 6;
-       if (tkey->key_idx != keyidx) {
-               printk(KERN_DEBUG "TKIP: RX tkey->key_idx=%d frame "
-                      "keyidx=%d priv=%p\n", tkey->key_idx, keyidx, priv);
-               return -6;
-       }
-       if (!tkey->key_set) {
-               if (net_ratelimit()) {
-                       printk(KERN_DEBUG "TKIP: received packet from %pM"
-                              " with keyid=%d that does not have a configured"
-                              " key\n", hdr->addr2, keyidx);
-               }
-               return -3;
-       }
-       iv16 = (pos[0] << 8) | pos[2];
-       iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
-       pos += 8;
-
-       if (!tcb_desc->bHwSec)
-       {
-               if (iv32 < tkey->rx_iv32 ||
-               (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16)) {
-                       if (net_ratelimit()) {
-                               printk(KERN_DEBUG "TKIP: replay detected: STA=%pM"
-                               " previous TSC %08x%04x received TSC "
-                               "%08x%04x\n", hdr->addr2,
-                               tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
-                       }
-                       tkey->dot11RSNAStatsTKIPReplays++;
-                       return -4;
-               }
-
-               if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
-                       tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
-                       tkey->rx_phase1_done = 1;
-               }
-               tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
-
-               plen = skb->len - hdr_len - 12;
-
-               crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
-               sg_init_one(&sg, pos, plen+4);
-               if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) {
-                       if (net_ratelimit()) {
-                               printk(KERN_DEBUG ": TKIP: failed to decrypt "
-                                               "received packet from %pM\n",
-                                               hdr->addr2);
-                       }
-                       return -7;
-               }
-
-               crc = ~crc32_le(~0, pos, plen);
-               icv[0] = crc;
-               icv[1] = crc >> 8;
-               icv[2] = crc >> 16;
-               icv[3] = crc >> 24;
-
-               if (memcmp(icv, pos + plen, 4) != 0) {
-                       if (iv32 != tkey->rx_iv32) {
-                               /* Previously cached Phase1 result was already lost, so
-                               * it needs to be recalculated for the next packet. */
-                               tkey->rx_phase1_done = 0;
-                       }
-                       if (net_ratelimit()) {
-                               printk(KERN_DEBUG
-                                      "TKIP: ICV error detected: STA=%pM\n",
-                                      hdr->addr2);
-                       }
-                       tkey->dot11RSNAStatsTKIPICVErrors++;
-                       return -5;
-               }
-
-       }
-
-       /* Update real counters only after Michael MIC verification has
-        * completed */
-       tkey->rx_iv32_new = iv32;
-       tkey->rx_iv16_new = iv16;
-
-       /* Remove IV and ICV */
-       memmove(skb->data + 8, skb->data, hdr_len);
-       skb_pull(skb, 8);
-       skb_trim(skb, skb->len - 4);
-
-       return keyidx;
-}
-
-
-static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,
-                       u8 * data, size_t data_len, u8 * mic)
-{
-        struct hash_desc desc;
-        struct scatterlist sg[2];
-
-        if (tfm_michael == NULL) {
-                printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
-                return -1;
-        }
-        sg_init_table(sg, 2);
-        sg_set_buf(&sg[0], hdr, 16);
-        sg_set_buf(&sg[1], data, data_len);
-
-        if (crypto_hash_setkey(tfm_michael, key, 8))
-                return -1;
-
-        desc.tfm = tfm_michael;
-        desc.flags = 0;
-        return crypto_hash_digest(&desc, sg, data_len + 16, mic);
-}
-
-
-
-static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr)
-{
-       struct ieee80211_hdr_4addr *hdr11;
-
-       hdr11 = (struct ieee80211_hdr_4addr *) skb->data;
-       switch (le16_to_cpu(hdr11->frame_ctl) &
-               (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
-       case IEEE80211_FCTL_TODS:
-               memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
-               break;
-       case IEEE80211_FCTL_FROMDS:
-               memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
-               break;
-       case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
-               memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
-               break;
-       case 0:
-               memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
-               memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
-               break;
-       }
-
-       hdr[12] = 0; /* priority */
-
-       hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
-}
-
-
-static int ieee80211_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct ieee80211_tkip_data *tkey = priv;
-       u8 *pos;
-       struct ieee80211_hdr_4addr *hdr;
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-
-       if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
-               printk(KERN_DEBUG "Invalid packet for Michael MIC add "
-                      "(tailroom=%d hdr_len=%d skb->len=%d)\n",
-                      skb_tailroom(skb), hdr_len, skb->len);
-               return -1;
-       }
-
-       michael_mic_hdr(skb, tkey->tx_hdr);
-
-       // { david, 2006.9.1
-       // fix the wpa process with wmm enabled.
-       if(IEEE80211_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl))) {
-               tkey->tx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
-       }
-       // }
-       pos = skb_put(skb, 8);
-       if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
-                               skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
-               return -1;
-
-       return 0;
-}
-
-
-#if WIRELESS_EXT >= 18
-static void ieee80211_michael_mic_failure(struct net_device *dev,
-                                      struct ieee80211_hdr_4addr *hdr,
-                                      int keyidx)
-{
-       union iwreq_data wrqu;
-       struct iw_michaelmicfailure ev;
-
-       /* TODO: needed parameters: count, keyid, key type, TSC */
-       memset(&ev, 0, sizeof(ev));
-       ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
-       if (hdr->addr1[0] & 0x01)
-               ev.flags |= IW_MICFAILURE_GROUP;
-       else
-               ev.flags |= IW_MICFAILURE_PAIRWISE;
-       ev.src_addr.sa_family = ARPHRD_ETHER;
-       memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
-       memset(&wrqu, 0, sizeof(wrqu));
-       wrqu.data.length = sizeof(ev);
-       wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev);
-}
-#elif WIRELESS_EXT >= 15
-static void ieee80211_michael_mic_failure(struct net_device *dev,
-                                      struct ieee80211_hdr_4addr *hdr,
-                                      int keyidx)
-{
-       union iwreq_data wrqu;
-       char buf[128];
-
-       /* TODO: needed parameters: count, keyid, key type, TSC */
-       sprintf(buf, "MLME-MICHAELMICFAILURE.indication(keyid=%d %scast addr="
-               "%pM)", keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni",
-               hdr->addr2);
-       memset(&wrqu, 0, sizeof(wrqu));
-       wrqu.data.length = strlen(buf);
-       wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
-}
-#else /* WIRELESS_EXT >= 15 */
-static inline void ieee80211_michael_mic_failure(struct net_device *dev,
-                                             struct ieee80211_hdr_4addr *hdr,
-                                             int keyidx)
-{
-}
-#endif /* WIRELESS_EXT >= 15 */
-
-static int ieee80211_michael_mic_verify(struct sk_buff *skb, int keyidx,
-                                    int hdr_len, void *priv)
-{
-       struct ieee80211_tkip_data *tkey = priv;
-       u8 mic[8];
-       struct ieee80211_hdr_4addr *hdr;
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-
-       if (!tkey->key_set)
-               return -1;
-
-       michael_mic_hdr(skb, tkey->rx_hdr);
-       // { david, 2006.9.1
-       // fix the wpa process with wmm enabled.
-       if(IEEE80211_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl))) {
-               tkey->rx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
-       }
-       // }
-
-       if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
-                               skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
-               return -1;
-       if (memcmp(mic, skb->data + skb->len - 8, 8) != 0) {
-               struct ieee80211_hdr_4addr *hdr;
-               hdr = (struct ieee80211_hdr_4addr *) skb->data;
-               printk(KERN_DEBUG "%s: Michael MIC verification failed for "
-                      "MSDU from %pM keyidx=%d\n",
-                      skb->dev ? skb->dev->name : "N/A", hdr->addr2,
-                      keyidx);
-               if (skb->dev)
-                       ieee80211_michael_mic_failure(skb->dev, hdr, keyidx);
-               tkey->dot11RSNAStatsTKIPLocalMICFailures++;
-               return -1;
-       }
-
-       /* Update TSC counters for RX now that the packet verification has
-        * completed. */
-       tkey->rx_iv32 = tkey->rx_iv32_new;
-       tkey->rx_iv16 = tkey->rx_iv16_new;
-
-       skb_trim(skb, skb->len - 8);
-
-       return 0;
-}
-
-
-static int ieee80211_tkip_set_key(void *key, int len, u8 *seq, void *priv)
-{
-       struct ieee80211_tkip_data *tkey = priv;
-       int keyidx;
-       struct crypto_hash *tfm = tkey->tx_tfm_michael;
-       struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4;
-       struct crypto_hash *tfm3 = tkey->rx_tfm_michael;
-       struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4;
-
-       keyidx = tkey->key_idx;
-       memset(tkey, 0, sizeof(*tkey));
-       tkey->key_idx = keyidx;
-       tkey->tx_tfm_michael = tfm;
-       tkey->tx_tfm_arc4 = tfm2;
-       tkey->rx_tfm_michael = tfm3;
-       tkey->rx_tfm_arc4 = tfm4;
-
-       if (len == TKIP_KEY_LEN) {
-               memcpy(tkey->key, key, TKIP_KEY_LEN);
-               tkey->key_set = 1;
-               tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
-               if (seq) {
-                       tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
-                               (seq[3] << 8) | seq[2];
-                       tkey->rx_iv16 = (seq[1] << 8) | seq[0];
-               }
-       } else if (len == 0)
-               tkey->key_set = 0;
-       else
-               return -1;
-
-       return 0;
-}
-
-
-static int ieee80211_tkip_get_key(void *key, int len, u8 *seq, void *priv)
-{
-       struct ieee80211_tkip_data *tkey = priv;
-
-       if (len < TKIP_KEY_LEN)
-               return -1;
-
-       if (!tkey->key_set)
-               return 0;
-       memcpy(key, tkey->key, TKIP_KEY_LEN);
-
-       if (seq) {
-               /* Return the sequence number of the last transmitted frame. */
-               u16 iv16 = tkey->tx_iv16;
-               u32 iv32 = tkey->tx_iv32;
-               if (iv16 == 0)
-                       iv32--;
-               iv16--;
-               seq[0] = tkey->tx_iv16;
-               seq[1] = tkey->tx_iv16 >> 8;
-               seq[2] = tkey->tx_iv32;
-               seq[3] = tkey->tx_iv32 >> 8;
-               seq[4] = tkey->tx_iv32 >> 16;
-               seq[5] = tkey->tx_iv32 >> 24;
-       }
-
-       return TKIP_KEY_LEN;
-}
-
-
-static char * ieee80211_tkip_print_stats(char *p, void *priv)
-{
-       struct ieee80211_tkip_data *tkip = priv;
-       p += sprintf(p, "key[%d] alg=TKIP key_set=%d "
-                    "tx_pn=%02x%02x%02x%02x%02x%02x "
-                    "rx_pn=%02x%02x%02x%02x%02x%02x "
-                    "replays=%d icv_errors=%d local_mic_failures=%d\n",
-                    tkip->key_idx, tkip->key_set,
-                    (tkip->tx_iv32 >> 24) & 0xff,
-                    (tkip->tx_iv32 >> 16) & 0xff,
-                    (tkip->tx_iv32 >> 8) & 0xff,
-                    tkip->tx_iv32 & 0xff,
-                    (tkip->tx_iv16 >> 8) & 0xff,
-                    tkip->tx_iv16 & 0xff,
-                    (tkip->rx_iv32 >> 24) & 0xff,
-                    (tkip->rx_iv32 >> 16) & 0xff,
-                    (tkip->rx_iv32 >> 8) & 0xff,
-                    tkip->rx_iv32 & 0xff,
-                    (tkip->rx_iv16 >> 8) & 0xff,
-                    tkip->rx_iv16 & 0xff,
-                    tkip->dot11RSNAStatsTKIPReplays,
-                    tkip->dot11RSNAStatsTKIPICVErrors,
-                    tkip->dot11RSNAStatsTKIPLocalMICFailures);
-       return p;
-}
-
-
-static struct ieee80211_crypto_ops ieee80211_crypt_tkip = {
-       .name                   = "TKIP",
-       .init                   = ieee80211_tkip_init,
-       .deinit                 = ieee80211_tkip_deinit,
-       .encrypt_mpdu           = ieee80211_tkip_encrypt,
-       .decrypt_mpdu           = ieee80211_tkip_decrypt,
-       .encrypt_msdu           = ieee80211_michael_mic_add,
-       .decrypt_msdu           = ieee80211_michael_mic_verify,
-       .set_key                = ieee80211_tkip_set_key,
-       .get_key                = ieee80211_tkip_get_key,
-       .print_stats            = ieee80211_tkip_print_stats,
-       .extra_prefix_len       = 4 + 4, /* IV + ExtIV */
-       .extra_postfix_len      = 8 + 4, /* MIC + ICV */
-       .owner                  = THIS_MODULE,
-};
-
-
-int __init ieee80211_crypto_tkip_init(void)
-{
-       return ieee80211_register_crypto_ops(&ieee80211_crypt_tkip);
-}
-
-
-void ieee80211_crypto_tkip_exit(void)
-{
-       ieee80211_unregister_crypto_ops(&ieee80211_crypt_tkip);
-}
-
-void ieee80211_tkip_null(void)
-{
-        return;
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_wep.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_crypt_wep.c
deleted file mode 100644 (file)
index 5504391..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-/*
- * Host AP crypt: host-based WEP encryption implementation for Host AP driver
- *
- * Copyright (c) 2002-2004, Jouni Malinen <jkmaline@cc.hut.fi>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- */
-
-#include <linux/module.h>
-#include <linux/init.h>
-#include <linux/slab.h>
-#include <linux/random.h>
-#include <linux/skbuff.h>
-#include <asm/string.h>
-
-#include "ieee80211.h"
-
-
-#include <linux/crypto.h>
-
-#include <linux/scatterlist.h>
-#include <linux/crc32.h>
-
-MODULE_AUTHOR("Jouni Malinen");
-MODULE_DESCRIPTION("Host AP crypt: WEP");
-MODULE_LICENSE("GPL");
-#ifndef OPENSUSE_SLED
-#define OPENSUSE_SLED 0
-#endif
-
-struct prism2_wep_data {
-       u32 iv;
-#define WEP_KEY_LEN 13
-       u8 key[WEP_KEY_LEN + 1];
-       u8 key_len;
-       u8 key_idx;
-        struct crypto_blkcipher *tx_tfm;
-        struct crypto_blkcipher *rx_tfm;
-};
-
-
-static void * prism2_wep_init(int keyidx)
-{
-       struct prism2_wep_data *priv;
-
-       priv = kzalloc(sizeof(*priv), GFP_ATOMIC);
-       if (priv == NULL)
-               goto fail;
-       priv->key_idx = keyidx;
-
-       priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
-        if (IS_ERR(priv->tx_tfm)) {
-                printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate "
-                       "crypto API arc4\n");
-                priv->tx_tfm = NULL;
-                goto fail;
-        }
-        priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
-        if (IS_ERR(priv->rx_tfm)) {
-                printk(KERN_DEBUG "ieee80211_crypt_wep: could not allocate "
-                       "crypto API arc4\n");
-                priv->rx_tfm = NULL;
-                goto fail;
-        }
-
-       /* start WEP IV from a random value */
-       get_random_bytes(&priv->iv, 4);
-
-       return priv;
-
-fail:
-       if (priv) {
-                if (priv->tx_tfm)
-                        crypto_free_blkcipher(priv->tx_tfm);
-                if (priv->rx_tfm)
-                        crypto_free_blkcipher(priv->rx_tfm);
-                kfree(priv);
-        }
-       return NULL;
-}
-
-
-static void prism2_wep_deinit(void *priv)
-{
-       struct prism2_wep_data *_priv = priv;
-       if (_priv) {
-                if (_priv->tx_tfm)
-                        crypto_free_blkcipher(_priv->tx_tfm);
-                if (_priv->rx_tfm)
-                        crypto_free_blkcipher(_priv->rx_tfm);
-        }
-       kfree(priv);
-}
-
-/* Perform WEP encryption on given skb that has at least 4 bytes of headroom
- * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted,
- * so the payload length increases with 8 bytes.
- *
- * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data))
- */
-static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct prism2_wep_data *wep = priv;
-       u32 klen, len;
-       u8 key[WEP_KEY_LEN + 3];
-       u8 *pos;
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-       struct blkcipher_desc desc = {.tfm = wep->tx_tfm};
-       u32 crc;
-       u8 *icv;
-       struct scatterlist sg;
-       if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 ||
-           skb->len < hdr_len)
-               return -1;
-
-       len = skb->len - hdr_len;
-       pos = skb_push(skb, 4);
-       memmove(pos, pos + 4, hdr_len);
-       pos += hdr_len;
-
-       klen = 3 + wep->key_len;
-
-       wep->iv++;
-
-       /* Fluhrer, Mantin, and Shamir have reported weaknesses in the key
-        * scheduling algorithm of RC4. At least IVs (KeyByte + 3, 0xff, N)
-        * can be used to speedup attacks, so avoid using them. */
-       if ((wep->iv & 0xff00) == 0xff00) {
-               u8 B = (wep->iv >> 16) & 0xff;
-               if (B >= 3 && B < klen)
-                       wep->iv += 0x0100;
-       }
-
-       /* Prepend 24-bit IV to RC4 key and TX frame */
-       *pos++ = key[0] = (wep->iv >> 16) & 0xff;
-       *pos++ = key[1] = (wep->iv >> 8) & 0xff;
-       *pos++ = key[2] = wep->iv & 0xff;
-       *pos++ = wep->key_idx << 6;
-
-       /* Copy rest of the WEP key (the secret part) */
-       memcpy(key + 3, wep->key, wep->key_len);
-
-       if (!tcb_desc->bHwSec)
-       {
-
-               /* Append little-endian CRC32 and encrypt it to produce ICV */
-               crc = ~crc32_le(~0, pos, len);
-               icv = skb_put(skb, 4);
-               icv[0] = crc;
-               icv[1] = crc >> 8;
-               icv[2] = crc >> 16;
-               icv[3] = crc >> 24;
-
-               crypto_blkcipher_setkey(wep->tx_tfm, key, klen);
-               sg_init_one(&sg, pos, len+4);
-               return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
-       }
-
-       return 0;
-}
-
-
-/* Perform WEP decryption on given buffer. Buffer includes whole WEP part of
- * the frame: IV (4 bytes), encrypted payload (including SNAP header),
- * ICV (4 bytes). len includes both IV and ICV.
- *
- * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on
- * failure. If frame is OK, IV and ICV will be removed.
- */
-static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
-{
-       struct prism2_wep_data *wep = priv;
-       u32  klen, plen;
-       u8 key[WEP_KEY_LEN + 3];
-       u8 keyidx, *pos;
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
-       struct blkcipher_desc desc = {.tfm = wep->rx_tfm};
-       u32 crc;
-       u8 icv[4];
-       struct scatterlist sg;
-       if (skb->len < hdr_len + 8)
-               return -1;
-
-       pos = skb->data + hdr_len;
-       key[0] = *pos++;
-       key[1] = *pos++;
-       key[2] = *pos++;
-       keyidx = *pos++ >> 6;
-       if (keyidx != wep->key_idx)
-               return -1;
-
-       klen = 3 + wep->key_len;
-
-       /* Copy rest of the WEP key (the secret part) */
-       memcpy(key + 3, wep->key, wep->key_len);
-
-       /* Apply RC4 to data and compute CRC32 over decrypted data */
-       plen = skb->len - hdr_len - 8;
-
-       if (!tcb_desc->bHwSec)
-       {
-               crypto_blkcipher_setkey(wep->rx_tfm, key, klen);
-               sg_init_one(&sg, pos, plen+4);
-               if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4))
-                       return -7;
-               crc = ~crc32_le(~0, pos, plen);
-               icv[0] = crc;
-               icv[1] = crc >> 8;
-               icv[2] = crc >> 16;
-               icv[3] = crc >> 24;
-               if (memcmp(icv, pos + plen, 4) != 0) {
-                       /* ICV mismatch - drop frame */
-                       return -2;
-               }
-       }
-       /* Remove IV and ICV */
-       memmove(skb->data + 4, skb->data, hdr_len);
-       skb_pull(skb, 4);
-       skb_trim(skb, skb->len - 4);
-
-       return 0;
-}
-
-
-static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv)
-{
-       struct prism2_wep_data *wep = priv;
-
-       if (len < 0 || len > WEP_KEY_LEN)
-               return -1;
-
-       memcpy(wep->key, key, len);
-       wep->key_len = len;
-
-       return 0;
-}
-
-
-static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv)
-{
-       struct prism2_wep_data *wep = priv;
-
-       if (len < wep->key_len)
-               return -1;
-
-       memcpy(key, wep->key, wep->key_len);
-
-       return wep->key_len;
-}
-
-
-static char * prism2_wep_print_stats(char *p, void *priv)
-{
-       struct prism2_wep_data *wep = priv;
-       p += sprintf(p, "key[%d] alg=WEP len=%d\n",
-                    wep->key_idx, wep->key_len);
-       return p;
-}
-
-
-static struct ieee80211_crypto_ops ieee80211_crypt_wep = {
-       .name                   = "WEP",
-       .init                   = prism2_wep_init,
-       .deinit                 = prism2_wep_deinit,
-       .encrypt_mpdu           = prism2_wep_encrypt,
-       .decrypt_mpdu           = prism2_wep_decrypt,
-       .encrypt_msdu           = NULL,
-       .decrypt_msdu           = NULL,
-       .set_key                = prism2_wep_set_key,
-       .get_key                = prism2_wep_get_key,
-       .print_stats            = prism2_wep_print_stats,
-       .extra_prefix_len       = 4, /* IV */
-       .extra_postfix_len      = 4, /* ICV */
-       .owner                  = THIS_MODULE,
-};
-
-
-int __init ieee80211_crypto_wep_init(void)
-{
-       return ieee80211_register_crypto_ops(&ieee80211_crypt_wep);
-}
-
-
-void __exit ieee80211_crypto_wep_exit(void)
-{
-       ieee80211_unregister_crypto_ops(&ieee80211_crypt_wep);
-}
-
-void ieee80211_wep_null(void)
-{
-        return;
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_module.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_module.c
deleted file mode 100644 (file)
index 37a65ff..0000000
+++ /dev/null
@@ -1,352 +0,0 @@
-/*******************************************************************************
-
-  Copyright(c) 2004 Intel Corporation. All rights reserved.
-
-  Portions of this file are based on the WEP enablement code provided by the
-  Host AP project hostap-drivers v0.1.3
-  Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-  <jkmaline@cc.hut.fi>
-  Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of version 2 of the GNU General Public License as
-  published by the Free Software Foundation.
-
-  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.
-
-  The full GNU General Public License is included in this distribution in the
-  file called LICENSE.
-
-  Contact Information:
-  James P. Ketrenos <ipw2100-admin@linux.intel.com>
-  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-*******************************************************************************/
-
-#include <linux/compiler.h>
-#include <linux/errno.h>
-#include <linux/if_arp.h>
-#include <linux/in6.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/pci.h>
-#include <linux/proc_fs.h>
-#include <linux/skbuff.h>
-#include <linux/slab.h>
-#include <linux/tcp.h>
-#include <linux/types.h>
-#include <linux/wireless.h>
-#include <linux/etherdevice.h>
-#include <asm/uaccess.h>
-#include <net/arp.h>
-
-#include "ieee80211.h"
-
-MODULE_DESCRIPTION("802.11 data/management/control stack");
-MODULE_AUTHOR("Copyright (C) 2004 Intel Corporation <jketreno@linux.intel.com>");
-MODULE_LICENSE("GPL");
-
-#define DRV_NAME "ieee80211"
-
-static inline int ieee80211_networks_allocate(struct ieee80211_device *ieee)
-{
-       if (ieee->networks)
-               return 0;
-
-       ieee->networks = kcalloc(
-               MAX_NETWORK_COUNT, sizeof(struct ieee80211_network),
-               GFP_KERNEL);
-       if (!ieee->networks) {
-               printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
-                       ieee->dev->name);
-               return -ENOMEM;
-       }
-
-       return 0;
-}
-
-static inline void ieee80211_networks_free(struct ieee80211_device *ieee)
-{
-       if (!ieee->networks)
-               return;
-       kfree(ieee->networks);
-       ieee->networks = NULL;
-}
-
-static inline void ieee80211_networks_initialize(struct ieee80211_device *ieee)
-{
-       int i;
-
-       INIT_LIST_HEAD(&ieee->network_free_list);
-       INIT_LIST_HEAD(&ieee->network_list);
-       for (i = 0; i < MAX_NETWORK_COUNT; i++)
-               list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
-}
-
-
-struct net_device *alloc_ieee80211(int sizeof_priv)
-{
-       struct ieee80211_device *ieee;
-       struct net_device *dev;
-       int i, err;
-
-       IEEE80211_DEBUG_INFO("Initializing...\n");
-
-       dev = alloc_etherdev(sizeof(struct ieee80211_device) + sizeof_priv);
-       if (!dev) {
-               IEEE80211_ERROR("Unable to network device.\n");
-               goto failed;
-       }
-
-       ieee = netdev_priv(dev);
-
-       memset(ieee, 0, sizeof(struct ieee80211_device) + sizeof_priv);
-       ieee->dev = dev;
-
-       err = ieee80211_networks_allocate(ieee);
-       if (err) {
-               IEEE80211_ERROR("Unable to allocate beacon storage: %d\n",
-                               err);
-               goto failed;
-       }
-       ieee80211_networks_initialize(ieee);
-
-
-       /* Default fragmentation threshold is maximum payload size */
-       ieee->fts = DEFAULT_FTS;
-       ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
-       ieee->open_wep = 1;
-
-       /* Default to enabling full open WEP with host based encrypt/decrypt */
-       ieee->host_encrypt = 1;
-       ieee->host_decrypt = 1;
-       ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
-
-       INIT_LIST_HEAD(&ieee->crypt_deinit_list);
-       init_timer(&ieee->crypt_deinit_timer);
-       ieee->crypt_deinit_timer.data = (unsigned long)ieee;
-       ieee->crypt_deinit_timer.function = ieee80211_crypt_deinit_handler;
-
-       spin_lock_init(&ieee->lock);
-       spin_lock_init(&ieee->wpax_suitlist_lock);
-       spin_lock_init(&ieee->bw_spinlock);
-       spin_lock_init(&ieee->reorder_spinlock);
-
-       /* added by WB */
-       atomic_set(&(ieee->atm_chnlop), 0);
-       atomic_set(&(ieee->atm_swbw), 0);
-
-       ieee->wpax_type_set = 0;
-       ieee->wpa_enabled = 0;
-       ieee->tkip_countermeasures = 0;
-       ieee->drop_unencrypted = 0;
-       ieee->privacy_invoked = 0;
-       ieee->ieee802_1x = 1;
-       ieee->raw_tx = 0;
-       /* ieee->hwsec_support = 1; default support hw security: use module_param instead */
-       ieee->hwsec_active = 0; /* disable hwsec, switch it on when necessary */
-
-       ieee80211_softmac_init(ieee);
-
-       ieee->pHTInfo = kzalloc(sizeof(RT_HIGH_THROUGHPUT), GFP_KERNEL);
-       if (ieee->pHTInfo == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc memory for HTInfo\n");
-               return NULL;
-       }
-       HTUpdateDefaultSetting(ieee);
-       HTInitializeHTInfo(ieee); /* may move to other place */
-       TSInitialize(ieee);
-       for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
-               INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
-
-       for (i = 0; i < 17; i++) {
-               ieee->last_rxseq_num[i] = -1;
-               ieee->last_rxfrag_num[i] = -1;
-               ieee->last_packet_time[i] = 0;
-       }
-
-       /* Functions to load crypt module automatically */
-       ieee80211_tkip_null();
-       ieee80211_wep_null();
-       ieee80211_ccmp_null();
-
-       return dev;
-
-failed:
-       if (dev)
-               free_netdev(dev);
-       return NULL;
-}
-
-
-void free_ieee80211(struct net_device *dev)
-{
-       struct ieee80211_device *ieee = netdev_priv(dev);
-       int i;
-       kfree(ieee->pHTInfo);
-       ieee->pHTInfo = NULL;
-       RemoveAllTS(ieee);
-       ieee80211_softmac_free(ieee);
-       del_timer_sync(&ieee->crypt_deinit_timer);
-       ieee80211_crypt_deinit_entries(ieee, 1);
-
-       for (i = 0; i < WEP_KEYS; i++) {
-               struct ieee80211_crypt_data *crypt = ieee->crypt[i];
-               if (crypt) {
-                       if (crypt->ops)
-                               crypt->ops->deinit(crypt->priv);
-                       kfree(crypt);
-                       ieee->crypt[i] = NULL;
-               }
-       }
-
-       ieee80211_networks_free(ieee);
-       free_netdev(dev);
-}
-
-#ifdef CONFIG_IEEE80211_DEBUG
-
-u32 ieee80211_debug_level = 0;
-static int debug =
-       /* IEEE80211_DL_INFO    | */
-       /* IEEE80211_DL_WX      | */
-       /* IEEE80211_DL_SCAN    | */
-       /* IEEE80211_DL_STATE   | */
-       /* IEEE80211_DL_MGMT    | */
-       /* IEEE80211_DL_FRAG    | */
-       /* IEEE80211_DL_EAP     | */
-       /* IEEE80211_DL_DROP    | */
-       /* IEEE80211_DL_TX      | */
-       /* IEEE80211_DL_RX      | */
-       /* IEEE80211_DL_QOS     | */
-       /* IEEE80211_DL_HT      | */
-       /* IEEE80211_DL_TS      | */
-       /* IEEE80211_DL_BA      | */
-       /* IEEE80211_DL_REORDER | */
-       /* IEEE80211_DL_TRACE   | */
-       /* IEEE80211_DL_DATA    | */
-       IEEE80211_DL_ERR        /* always open this flag to show error out */
-       ;
-struct proc_dir_entry *ieee80211_proc = NULL;
-
-static int show_debug_level(char *page, char **start, off_t offset,
-                       int count, int *eof, void *data)
-{
-       return snprintf(page, count, "0x%08X\n", ieee80211_debug_level);
-}
-
-static int store_debug_level(struct file *file, const char *buffer,
-                       unsigned long count, void *data)
-{
-       char buf[] = "0x00000000";
-       unsigned long len = min(sizeof(buf) - 1, (u32)count);
-       char *p = (char *)buf;
-       unsigned long val;
-
-       if (copy_from_user(buf, buffer, len))
-               return count;
-       buf[len] = 0;
-       if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
-               p++;
-               if (p[0] == 'x' || p[0] == 'X')
-                       p++;
-               val = simple_strtoul(p, &p, 16);
-       } else
-               val = simple_strtoul(p, &p, 10);
-       if (p == buf)
-               printk(KERN_INFO DRV_NAME
-                       ": %s is not in hex or decimal form.\n", buf);
-       else
-               ieee80211_debug_level = val;
-
-       return strnlen(buf, count);
-}
-
-extern int ieee80211_crypto_init(void);
-extern void ieee80211_crypto_deinit(void);
-extern int ieee80211_crypto_tkip_init(void);
-extern void ieee80211_crypto_tkip_exit(void);
-extern int ieee80211_crypto_ccmp_init(void);
-extern void ieee80211_crypto_ccmp_exit(void);
-extern int ieee80211_crypto_wep_init(void);
-extern void ieee80211_crypto_wep_exit(void);
-
-int __init ieee80211_rtl_init(void)
-{
-       struct proc_dir_entry *e;
-       int retval;
-
-       retval = ieee80211_crypto_init();
-       if (retval)
-               return retval;
-       retval = ieee80211_crypto_tkip_init();
-       if (retval) {
-               ieee80211_crypto_deinit();
-               return retval;
-       }
-       retval = ieee80211_crypto_ccmp_init();
-       if (retval) {
-               ieee80211_crypto_tkip_exit();
-               ieee80211_crypto_deinit();
-               return retval;
-       }
-       retval = ieee80211_crypto_wep_init();
-       if (retval) {
-               ieee80211_crypto_ccmp_exit();
-               ieee80211_crypto_tkip_exit();
-               ieee80211_crypto_deinit();
-               return retval;
-       }
-
-       ieee80211_debug_level = debug;
-       ieee80211_proc = proc_mkdir(DRV_NAME, init_net.proc_net);
-       if (ieee80211_proc == NULL) {
-               IEEE80211_ERROR("Unable to create " DRV_NAME
-                               " proc directory\n");
-               return -EIO;
-       }
-       e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR,
-                       ieee80211_proc);
-       if (!e) {
-               remove_proc_entry(DRV_NAME, init_net.proc_net);
-               ieee80211_proc = NULL;
-               return -EIO;
-       }
-       e->read_proc = show_debug_level;
-       e->write_proc = store_debug_level;
-       e->data = NULL;
-
-       return 0;
-}
-
-void __exit ieee80211_rtl_exit(void)
-{
-       if (ieee80211_proc) {
-               remove_proc_entry("debug_level", ieee80211_proc);
-               remove_proc_entry(DRV_NAME, init_net.proc_net);
-               ieee80211_proc = NULL;
-       }
-       ieee80211_crypto_wep_exit();
-       ieee80211_crypto_ccmp_exit();
-       ieee80211_crypto_tkip_exit();
-       ieee80211_crypto_deinit();
-}
-
-#include <linux/moduleparam.h>
-module_param(debug, int, 0444);
-MODULE_PARM_DESC(debug, "debug output mask");
-
-
-#endif
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_rx.c
deleted file mode 100644 (file)
index 022086d..0000000
+++ /dev/null
@@ -1,2676 +0,0 @@
-/*
- * Original code based Host AP (software wireless LAN access point) driver
- * for Intersil Prism2/2.5/3 - hostap.o module, common routines
- *
- * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
- * <jkmaline@cc.hut.fi>
- * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
- * Copyright (c) 2004, Intel Corporation
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation. See README and COPYING for
- * more details.
- ******************************************************************************
-
-  Few modifications for Realtek's Wi-Fi drivers by
-  Andrea Merello <andreamrl@tiscali.it>
-
-  A special thanks goes to Realtek for their support !
-
-******************************************************************************/
-
-
-#include <linux/compiler.h>
-#include <linux/errno.h>
-#include <linux/if_arp.h>
-#include <linux/in6.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/pci.h>
-#include <linux/proc_fs.h>
-#include <linux/skbuff.h>
-#include <linux/slab.h>
-#include <linux/tcp.h>
-#include <linux/types.h>
-#include <linux/wireless.h>
-#include <linux/etherdevice.h>
-#include <asm/uaccess.h>
-#include <linux/ctype.h>
-
-#include "ieee80211.h"
-#ifdef ENABLE_DOT11D
-#include "dot11d.h"
-#endif
-static inline void ieee80211_monitor_rx(struct ieee80211_device *ieee,
-                                       struct sk_buff *skb,
-                                       struct ieee80211_rx_stats *rx_stats)
-{
-       struct ieee80211_hdr_4addr *hdr = (struct ieee80211_hdr_4addr *)skb->data;
-       u16 fc = le16_to_cpu(hdr->frame_ctl);
-
-       skb->dev = ieee->dev;
-        skb_reset_mac_header(skb);
-
-       skb_pull(skb, ieee80211_get_hdrlen(fc));
-       skb->pkt_type = PACKET_OTHERHOST;
-       skb->protocol = __constant_htons(ETH_P_80211_RAW);
-       memset(skb->cb, 0, sizeof(skb->cb));
-       netif_rx(skb);
-}
-
-
-/* Called only as a tasklet (software IRQ) */
-static struct ieee80211_frag_entry *
-ieee80211_frag_cache_find(struct ieee80211_device *ieee, unsigned int seq,
-                         unsigned int frag, u8 tid,u8 *src, u8 *dst)
-{
-       struct ieee80211_frag_entry *entry;
-       int i;
-
-       for (i = 0; i < IEEE80211_FRAG_CACHE_LEN; i++) {
-               entry = &ieee->frag_cache[tid][i];
-               if (entry->skb != NULL &&
-                   time_after(jiffies, entry->first_frag_time + 2 * HZ)) {
-                       IEEE80211_DEBUG_FRAG(
-                               "expiring fragment cache entry "
-                               "seq=%u last_frag=%u\n",
-                               entry->seq, entry->last_frag);
-                       dev_kfree_skb_any(entry->skb);
-                       entry->skb = NULL;
-               }
-
-               if (entry->skb != NULL && entry->seq == seq &&
-                   (entry->last_frag + 1 == frag || frag == -1) &&
-                   memcmp(entry->src_addr, src, ETH_ALEN) == 0 &&
-                   memcmp(entry->dst_addr, dst, ETH_ALEN) == 0)
-                       return entry;
-       }
-
-       return NULL;
-}
-
-/* Called only as a tasklet (software IRQ) */
-static struct sk_buff *
-ieee80211_frag_cache_get(struct ieee80211_device *ieee,
-                        struct ieee80211_hdr_4addr *hdr)
-{
-       struct sk_buff *skb = NULL;
-       u16 fc = le16_to_cpu(hdr->frame_ctl);
-       u16 sc = le16_to_cpu(hdr->seq_ctl);
-       unsigned int frag = WLAN_GET_SEQ_FRAG(sc);
-       unsigned int seq = WLAN_GET_SEQ_SEQ(sc);
-       struct ieee80211_frag_entry *entry;
-       struct ieee80211_hdr_3addrqos *hdr_3addrqos;
-       struct ieee80211_hdr_4addrqos *hdr_4addrqos;
-       u8 tid;
-
-       if (((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) {
-         hdr_4addrqos = (struct ieee80211_hdr_4addrqos *)hdr;
-         tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & IEEE80211_QCTL_TID;
-         tid = UP2AC(tid);
-         tid ++;
-       } else if (IEEE80211_QOS_HAS_SEQ(fc)) {
-         hdr_3addrqos = (struct ieee80211_hdr_3addrqos *)hdr;
-         tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & IEEE80211_QCTL_TID;
-         tid = UP2AC(tid);
-         tid ++;
-       } else {
-         tid = 0;
-       }
-
-       if (frag == 0) {
-               /* Reserve enough space to fit maximum frame length */
-               skb = dev_alloc_skb(ieee->dev->mtu +
-                                   sizeof(struct ieee80211_hdr_4addr) +
-                                   8 /* LLC */ +
-                                   2 /* alignment */ +
-                                   8 /* WEP */ +
-                                   ETH_ALEN /* WDS */ +
-                                   (IEEE80211_QOS_HAS_SEQ(fc)?2:0) /* QOS Control */);
-               if (skb == NULL)
-                       return NULL;
-
-               entry = &ieee->frag_cache[tid][ieee->frag_next_idx[tid]];
-               ieee->frag_next_idx[tid]++;
-               if (ieee->frag_next_idx[tid] >= IEEE80211_FRAG_CACHE_LEN)
-                       ieee->frag_next_idx[tid] = 0;
-
-               if (entry->skb != NULL)
-                       dev_kfree_skb_any(entry->skb);
-
-               entry->first_frag_time = jiffies;
-               entry->seq = seq;
-               entry->last_frag = frag;
-               entry->skb = skb;
-               memcpy(entry->src_addr, hdr->addr2, ETH_ALEN);
-               memcpy(entry->dst_addr, hdr->addr1, ETH_ALEN);
-       } else {
-               /* received a fragment of a frame for which the head fragment
-                * should have already been received */
-               entry = ieee80211_frag_cache_find(ieee, seq, frag, tid,hdr->addr2,
-                                                 hdr->addr1);
-               if (entry != NULL) {
-                       entry->last_frag = frag;
-                       skb = entry->skb;
-               }
-       }
-
-       return skb;
-}
-
-
-/* Called only as a tasklet (software IRQ) */
-static int ieee80211_frag_cache_invalidate(struct ieee80211_device *ieee,
-                                          struct ieee80211_hdr_4addr *hdr)
-{
-       u16 fc = le16_to_cpu(hdr->frame_ctl);
-       u16 sc = le16_to_cpu(hdr->seq_ctl);
-       unsigned int seq = WLAN_GET_SEQ_SEQ(sc);
-       struct ieee80211_frag_entry *entry;
-       struct ieee80211_hdr_3addrqos *hdr_3addrqos;
-       struct ieee80211_hdr_4addrqos *hdr_4addrqos;
-       u8 tid;
-
-       if(((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) {
-         hdr_4addrqos = (struct ieee80211_hdr_4addrqos *)hdr;
-         tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & IEEE80211_QCTL_TID;
-         tid = UP2AC(tid);
-         tid ++;
-       } else if (IEEE80211_QOS_HAS_SEQ(fc)) {
-         hdr_3addrqos = (struct ieee80211_hdr_3addrqos *)hdr;
-         tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & IEEE80211_QCTL_TID;
-         tid = UP2AC(tid);
-         tid ++;
-       } else {
-         tid = 0;
-       }
-
-       entry = ieee80211_frag_cache_find(ieee, seq, -1, tid,hdr->addr2,
-                                         hdr->addr1);
-
-       if (entry == NULL) {
-               IEEE80211_DEBUG_FRAG(
-                       "could not invalidate fragment cache "
-                       "entry (seq=%u)\n", seq);
-               return -1;
-       }
-
-       entry->skb = NULL;
-       return 0;
-}
-
-
-
-/* ieee80211_rx_frame_mgtmt
- *
- * Responsible for handling management control frames
- *
- * Called by ieee80211_rx */
-static inline int
-ieee80211_rx_frame_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb,
-                       struct ieee80211_rx_stats *rx_stats, u16 type,
-                       u16 stype)
-{
-       /* On the struct stats definition there is written that
-        * this is not mandatory.... but seems that the probe
-        * response parser uses it
-        */
-        struct ieee80211_hdr_3addr * hdr = (struct ieee80211_hdr_3addr *)skb->data;
-
-       rx_stats->len = skb->len;
-       ieee80211_rx_mgt(ieee,(struct ieee80211_hdr_4addr *)skb->data,rx_stats);
-        if ((memcmp(hdr->addr1, ieee->dev->dev_addr, ETH_ALEN)))//use ADDR1 to perform address matching for Management frames
-        {
-                dev_kfree_skb_any(skb);
-                return 0;
-        }
-
-       ieee80211_rx_frame_softmac(ieee, skb, rx_stats, type, stype);
-
-       dev_kfree_skb_any(skb);
-
-       return 0;
-
-       #ifdef NOT_YET
-       if (ieee->iw_mode == IW_MODE_MASTER) {
-               printk(KERN_DEBUG "%s: Master mode not yet suppported.\n",
-                      ieee->dev->name);
-               return 0;
-       }
-
-       if (ieee->hostapd && type == IEEE80211_TYPE_MGMT) {
-               if (stype == WLAN_FC_STYPE_BEACON &&
-                   ieee->iw_mode == IW_MODE_MASTER) {
-                       struct sk_buff *skb2;
-                       /* Process beacon frames also in kernel driver to
-                        * update STA(AP) table statistics */
-                       skb2 = skb_clone(skb, GFP_ATOMIC);
-                       if (skb2)
-                               hostap_rx(skb2->dev, skb2, rx_stats);
-               }
-
-               /* send management frames to the user space daemon for
-                * processing */
-               ieee->apdevstats.rx_packets++;
-               ieee->apdevstats.rx_bytes += skb->len;
-               prism2_rx_80211(ieee->apdev, skb, rx_stats, PRISM2_RX_MGMT);
-               return 0;
-       }
-
-           if (ieee->iw_mode == IW_MODE_MASTER) {
-               if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) {
-                       printk(KERN_DEBUG "%s: unknown management frame "
-                              "(type=0x%02x, stype=0x%02x) dropped\n",
-                              skb->dev->name, type, stype);
-                       return -1;
-               }
-
-               hostap_rx(skb->dev, skb, rx_stats);
-               return 0;
-       }
-
-       printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: management frame "
-              "received in non-Host AP mode\n", skb->dev->name);
-       return -1;
-       #endif
-}
-
-
-
-/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
-/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
-static unsigned char rfc1042_header[] =
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
-/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
-static unsigned char bridge_tunnel_header[] =
-{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
-/* No encapsulation header if EtherType < 0x600 (=length) */
-
-/* Called by ieee80211_rx_frame_decrypt */
-static int ieee80211_is_eapol_frame(struct ieee80211_device *ieee,
-                                   struct sk_buff *skb, size_t hdrlen)
-{
-       struct net_device *dev = ieee->dev;
-       u16 fc, ethertype;
-       struct ieee80211_hdr_4addr *hdr;
-       u8 *pos;
-
-       if (skb->len < 24)
-               return 0;
-
-        if (ieee->hwsec_active)
-        {
-                cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
-                tcb_desc->bHwSec = 1;
-
-                if(ieee->need_sw_enc)
-                        tcb_desc->bHwSec = 0;
-        }
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       fc = le16_to_cpu(hdr->frame_ctl);
-
-       /* check that the frame is unicast frame to us */
-       if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-           IEEE80211_FCTL_TODS &&
-           memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0 &&
-           memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) {
-               /* ToDS frame with own addr BSSID and DA */
-       } else if ((fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) ==
-                  IEEE80211_FCTL_FROMDS &&
-                  memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) {
-               /* FromDS frame with own addr as DA */
-       } else
-               return 0;
-
-       if (skb->len < 24 + 8)
-               return 0;
-
-       /* check for port access entity Ethernet type */
-       pos = skb->data + hdrlen;
-       ethertype = (pos[6] << 8) | pos[7];
-       if (ethertype == ETH_P_PAE)
-               return 1;
-
-       return 0;
-}
-
-/* Called only as a tasklet (software IRQ), by ieee80211_rx */
-static inline int
-ieee80211_rx_frame_decrypt(struct ieee80211_device* ieee, struct sk_buff *skb,
-                          struct ieee80211_crypt_data *crypt)
-{
-       struct ieee80211_hdr_4addr *hdr;
-       int res, hdrlen;
-
-       if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
-               return 0;
-
-       if (ieee->hwsec_active)
-       {
-               cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
-               tcb_desc->bHwSec = 1;
-       }
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
-
-#ifdef CONFIG_IEEE80211_CRYPT_TKIP
-       if (ieee->tkip_countermeasures &&
-           strcmp(crypt->ops->name, "TKIP") == 0) {
-               if (net_ratelimit()) {
-                       printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
-                              "received packet from %pM\n",
-                              ieee->dev->name, hdr->addr2);
-               }
-               return -1;
-       }
-#endif
-
-       atomic_inc(&crypt->refcnt);
-       res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
-       atomic_dec(&crypt->refcnt);
-       if (res < 0) {
-               IEEE80211_DEBUG_DROP(
-                       "decryption failed (SA=%pM"
-                       ") res=%d\n", hdr->addr2, res);
-               if (res == -2)
-                       IEEE80211_DEBUG_DROP("Decryption failed ICV "
-                                            "mismatch (key %d)\n",
-                                            skb->data[hdrlen + 3] >> 6);
-               ieee->ieee_stats.rx_discards_undecryptable++;
-               return -1;
-       }
-
-       return res;
-}
-
-
-/* Called only as a tasklet (software IRQ), by ieee80211_rx */
-static inline int
-ieee80211_rx_frame_decrypt_msdu(struct ieee80211_device* ieee, struct sk_buff *skb,
-                            int keyidx, struct ieee80211_crypt_data *crypt)
-{
-       struct ieee80211_hdr_4addr *hdr;
-       int res, hdrlen;
-
-       if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
-               return 0;
-       if (ieee->hwsec_active)
-       {
-               cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
-               tcb_desc->bHwSec = 1;
-
-                if(ieee->need_sw_enc)
-                        tcb_desc->bHwSec = 0;
-
-       }
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       hdrlen = ieee80211_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
-
-       atomic_inc(&crypt->refcnt);
-       res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv);
-       atomic_dec(&crypt->refcnt);
-       if (res < 0) {
-               printk(KERN_DEBUG "%s: MSDU decryption/MIC verification failed"
-                      " (SA=%pM keyidx=%d)\n",
-                      ieee->dev->name, hdr->addr2, keyidx);
-               return -1;
-       }
-
-       return 0;
-}
-
-
-/* this function is stolen from ipw2200 driver*/
-#define IEEE_PACKET_RETRY_TIME (5*HZ)
-static int is_duplicate_packet(struct ieee80211_device *ieee,
-                                     struct ieee80211_hdr_4addr *header)
-{
-       u16 fc = le16_to_cpu(header->frame_ctl);
-       u16 sc = le16_to_cpu(header->seq_ctl);
-       u16 seq = WLAN_GET_SEQ_SEQ(sc);
-       u16 frag = WLAN_GET_SEQ_FRAG(sc);
-       u16 *last_seq, *last_frag;
-       unsigned long *last_time;
-       struct ieee80211_hdr_3addrqos *hdr_3addrqos;
-       struct ieee80211_hdr_4addrqos *hdr_4addrqos;
-       u8 tid;
-
-
-       //TO2DS and QoS
-       if(((fc & IEEE80211_FCTL_DSTODS) == IEEE80211_FCTL_DSTODS)&&IEEE80211_QOS_HAS_SEQ(fc)) {
-         hdr_4addrqos = (struct ieee80211_hdr_4addrqos *)header;
-         tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & IEEE80211_QCTL_TID;
-         tid = UP2AC(tid);
-         tid ++;
-       } else if(IEEE80211_QOS_HAS_SEQ(fc)) { //QoS
-         hdr_3addrqos = (struct ieee80211_hdr_3addrqos*)header;
-         tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & IEEE80211_QCTL_TID;
-         tid = UP2AC(tid);
-         tid ++;
-       } else { // no QoS
-         tid = 0;
-       }
-
-       switch (ieee->iw_mode) {
-       case IW_MODE_ADHOC:
-       {
-               struct list_head *p;
-               struct ieee_ibss_seq *entry = NULL;
-               u8 *mac = header->addr2;
-               int index = mac[5] % IEEE_IBSS_MAC_HASH_SIZE;
-
-               list_for_each(p, &ieee->ibss_mac_hash[index]) {
-                       entry = list_entry(p, struct ieee_ibss_seq, list);
-                       if (!memcmp(entry->mac, mac, ETH_ALEN))
-                               break;
-               }
-
-               if (p == &ieee->ibss_mac_hash[index]) {
-                       entry = kmalloc(sizeof(struct ieee_ibss_seq), GFP_ATOMIC);
-                       if (!entry) {
-                               printk(KERN_WARNING "Cannot malloc new mac entry\n");
-                               return 0;
-                       }
-                       memcpy(entry->mac, mac, ETH_ALEN);
-                       entry->seq_num[tid] = seq;
-                       entry->frag_num[tid] = frag;
-                       entry->packet_time[tid] = jiffies;
-                       list_add(&entry->list, &ieee->ibss_mac_hash[index]);
-                       return 0;
-               }
-               last_seq = &entry->seq_num[tid];
-               last_frag = &entry->frag_num[tid];
-               last_time = &entry->packet_time[tid];
-               break;
-       }
-
-       case IW_MODE_INFRA:
-               last_seq = &ieee->last_rxseq_num[tid];
-               last_frag = &ieee->last_rxfrag_num[tid];
-               last_time = &ieee->last_packet_time[tid];
-
-               break;
-       default:
-               return 0;
-       }
-
-       if ((*last_seq == seq) &&
-           time_after(*last_time + IEEE_PACKET_RETRY_TIME, jiffies)) {
-               if (*last_frag == frag){
-                       goto drop;
-
-               }
-               if (*last_frag + 1 != frag)
-                       /* out-of-order fragment */
-                       goto drop;
-       } else
-               *last_seq = seq;
-
-       *last_frag = frag;
-       *last_time = jiffies;
-       return 0;
-
-drop:
-       return 1;
-}
-bool
-AddReorderEntry(
-       PRX_TS_RECORD                   pTS,
-       PRX_REORDER_ENTRY               pReorderEntry
-       )
-{
-       struct list_head *pList = &pTS->RxPendingPktList;
-
-       while(pList->next != &pTS->RxPendingPktList)
-       {
-               if( SN_LESS(pReorderEntry->SeqNum, ((PRX_REORDER_ENTRY)list_entry(pList->next,RX_REORDER_ENTRY,List))->SeqNum) )
-               {
-                       pList = pList->next;
-               }
-               else if( SN_EQUAL(pReorderEntry->SeqNum, ((PRX_REORDER_ENTRY)list_entry(pList->next,RX_REORDER_ENTRY,List))->SeqNum) )
-               {
-                       return false;
-               }
-               else
-               {
-                       break;
-               }
-       }
-
-       pReorderEntry->List.next = pList->next;
-       pReorderEntry->List.next->prev = &pReorderEntry->List;
-       pReorderEntry->List.prev = pList;
-       pList->next = &pReorderEntry->List;
-
-       return true;
-}
-
-void ieee80211_indicate_packets(struct ieee80211_device *ieee, struct ieee80211_rxb** prxbIndicateArray,u8  index)
-{
-       u8 i = 0 , j=0;
-       u16 ethertype;
-
-       for(j = 0; j<index; j++)
-       {
-//added by amy for reorder
-               struct ieee80211_rxb* prxb = prxbIndicateArray[j];
-               for(i = 0; i<prxb->nr_subframes; i++) {
-                       struct sk_buff *sub_skb = prxb->subframes[i];
-
-               /* convert hdr + possible LLC headers into Ethernet header */
-                       ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
-                       if (sub_skb->len >= 8 &&
-                               ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
-                                 ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
-                                memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
-                       /* remove RFC1042 or Bridge-Tunnel encapsulation and
-                        * replace EtherType */
-                               skb_pull(sub_skb, SNAP_SIZE);
-                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->src, ETH_ALEN);
-                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->dst, ETH_ALEN);
-                       } else {
-                               u16 len;
-                       /* Leave Ethernet header part of hdr and full payload */
-                               len = htons(sub_skb->len);
-                               memcpy(skb_push(sub_skb, 2), &len, 2);
-                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->src, ETH_ALEN);
-                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->dst, ETH_ALEN);
-                       }
-
-               /* Indicat the packets to upper layer */
-                       if (sub_skb) {
-                               sub_skb->protocol = eth_type_trans(sub_skb, ieee->dev);
-                               memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
-                               sub_skb->dev = ieee->dev;
-                               sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
-                               ieee->last_rx_ps_time = jiffies;
-                               netif_rx(sub_skb);
-                       }
-               }
-               kfree(prxb);
-               prxb = NULL;
-       }
-}
-
-
-void RxReorderIndicatePacket( struct ieee80211_device *ieee,
-               struct ieee80211_rxb* prxb,
-               PRX_TS_RECORD           pTS,
-               u16                     SeqNum)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-       PRX_REORDER_ENTRY       pReorderEntry = NULL;
-       struct ieee80211_rxb* prxbIndicateArray[REORDER_WIN_SIZE];
-       u8                      WinSize = pHTInfo->RxReorderWinSize;
-       u16                     WinEnd = (pTS->RxIndicateSeq + WinSize -1)%4096;
-       u8                      index = 0;
-       bool                    bMatchWinStart = false, bPktInBuf = false;
-       IEEE80211_DEBUG(IEEE80211_DL_REORDER,"%s(): Seq is %d,pTS->RxIndicateSeq is %d, WinSize is %d\n",__FUNCTION__,SeqNum,pTS->RxIndicateSeq,WinSize);
-
-       /* Rx Reorder initialize condition.*/
-       if(pTS->RxIndicateSeq == 0xffff) {
-               pTS->RxIndicateSeq = SeqNum;
-       }
-
-       /* Drop out the packet which SeqNum is smaller than WinStart */
-       if(SN_LESS(SeqNum, pTS->RxIndicateSeq)) {
-               IEEE80211_DEBUG(IEEE80211_DL_REORDER,"Packet Drop! IndicateSeq: %d, NewSeq: %d\n",
-                                pTS->RxIndicateSeq, SeqNum);
-               pHTInfo->RxReorderDropCounter++;
-               {
-                       int i;
-                       for(i =0; i < prxb->nr_subframes; i++) {
-                               dev_kfree_skb(prxb->subframes[i]);
-                       }
-                       kfree(prxb);
-                       prxb = NULL;
-               }
-               return;
-       }
-
-       /*
-        * Sliding window manipulation. Conditions includes:
-        * 1. Incoming SeqNum is equal to WinStart =>Window shift 1
-        * 2. Incoming SeqNum is larger than the WinEnd => Window shift N
-        */
-       if(SN_EQUAL(SeqNum, pTS->RxIndicateSeq)) {
-               pTS->RxIndicateSeq = (pTS->RxIndicateSeq + 1) % 4096;
-               bMatchWinStart = true;
-       } else if(SN_LESS(WinEnd, SeqNum)) {
-               if(SeqNum >= (WinSize - 1)) {
-                       pTS->RxIndicateSeq = SeqNum + 1 -WinSize;
-               } else {
-                       pTS->RxIndicateSeq = 4095 - (WinSize - (SeqNum +1)) + 1;
-               }
-               IEEE80211_DEBUG(IEEE80211_DL_REORDER, "Window Shift! IndicateSeq: %d, NewSeq: %d\n",pTS->RxIndicateSeq, SeqNum);
-       }
-
-       /*
-        * Indication process.
-        * After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets
-        * with the SeqNum smaller than latest WinStart and buffer other packets.
-        */
-       /* For Rx Reorder condition:
-        * 1. All packets with SeqNum smaller than WinStart => Indicate
-        * 2. All packets with SeqNum larger than or equal to WinStart => Buffer it.
-        */
-       if(bMatchWinStart) {
-               /* Current packet is going to be indicated.*/
-               IEEE80211_DEBUG(IEEE80211_DL_REORDER, "Packets indication!! IndicateSeq: %d, NewSeq: %d\n",\
-                               pTS->RxIndicateSeq, SeqNum);
-               prxbIndicateArray[0] = prxb;
-               index = 1;
-       } else {
-               /* Current packet is going to be inserted into pending list.*/
-               if(!list_empty(&ieee->RxReorder_Unused_List)) {
-                       pReorderEntry = (PRX_REORDER_ENTRY)list_entry(ieee->RxReorder_Unused_List.next,RX_REORDER_ENTRY,List);
-                       list_del_init(&pReorderEntry->List);
-
-                       /* Make a reorder entry and insert into a the packet list.*/
-                       pReorderEntry->SeqNum = SeqNum;
-                       pReorderEntry->prxb = prxb;
-
-                       if(!AddReorderEntry(pTS, pReorderEntry)) {
-                               IEEE80211_DEBUG(IEEE80211_DL_REORDER, "%s(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n",
-                                       __FUNCTION__, pTS->RxIndicateSeq, SeqNum);
-                               list_add_tail(&pReorderEntry->List,&ieee->RxReorder_Unused_List);
-                               {
-                                       int i;
-                                       for(i =0; i < prxb->nr_subframes; i++) {
-                                               dev_kfree_skb(prxb->subframes[i]);
-                                       }
-                                       kfree(prxb);
-                                       prxb = NULL;
-                               }
-                       } else {
-                               IEEE80211_DEBUG(IEEE80211_DL_REORDER,
-                                        "Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n",pTS->RxIndicateSeq, SeqNum);
-                       }
-               }
-               else {
-                       /*
-                        * Packets are dropped if there is not enough reorder entries.
-                        * This part shall be modified!! We can just indicate all the
-                        * packets in buffer and get reorder entries.
-                        */
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR, "RxReorderIndicatePacket(): There is no reorder entry!! Packet is dropped!!\n");
-                       {
-                               int i;
-                               for(i =0; i < prxb->nr_subframes; i++) {
-                                       dev_kfree_skb(prxb->subframes[i]);
-                               }
-                               kfree(prxb);
-                               prxb = NULL;
-                       }
-               }
-       }
-
-       /* Check if there is any packet need indicate.*/
-       while(!list_empty(&pTS->RxPendingPktList)) {
-               IEEE80211_DEBUG(IEEE80211_DL_REORDER,"%s(): start RREORDER indicate\n",__FUNCTION__);
-#if 1
-               pReorderEntry = (PRX_REORDER_ENTRY)list_entry(pTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
-               if( SN_LESS(pReorderEntry->SeqNum, pTS->RxIndicateSeq) ||
-                               SN_EQUAL(pReorderEntry->SeqNum, pTS->RxIndicateSeq))
-               {
-                       /* This protect buffer from overflow. */
-                       if(index >= REORDER_WIN_SIZE) {
-                               IEEE80211_DEBUG(IEEE80211_DL_ERR, "RxReorderIndicatePacket(): Buffer overflow!! \n");
-                               bPktInBuf = true;
-                               break;
-                       }
-
-                       list_del_init(&pReorderEntry->List);
-
-                       if(SN_EQUAL(pReorderEntry->SeqNum, pTS->RxIndicateSeq))
-                               pTS->RxIndicateSeq = (pTS->RxIndicateSeq + 1) % 4096;
-
-                       IEEE80211_DEBUG(IEEE80211_DL_REORDER,"Packets indication!! IndicateSeq: %d, NewSeq: %d\n",pTS->RxIndicateSeq, SeqNum);
-                       prxbIndicateArray[index] = pReorderEntry->prxb;
-                       index++;
-
-                       list_add_tail(&pReorderEntry->List,&ieee->RxReorder_Unused_List);
-               } else {
-                       bPktInBuf = true;
-                       break;
-               }
-#endif
-       }
-
-       /* Handling pending timer. Set this timer to prevent from long time Rx buffering.*/
-       if(index>0) {
-               // Cancel previous pending timer.
-               if (timer_pending(&pTS->RxPktPendingTimer))
-                       del_timer_sync(&pTS->RxPktPendingTimer);
-               pTS->RxTimeoutIndicateSeq = 0xffff;
-
-               // Indicate packets
-               if(index>REORDER_WIN_SIZE){
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer buffer full!! \n");
-                       return;
-               }
-               ieee80211_indicate_packets(ieee, prxbIndicateArray, index);
-               bPktInBuf = false;
-       }
-
-       if(bPktInBuf && pTS->RxTimeoutIndicateSeq==0xffff) {
-               // Set new pending timer.
-               IEEE80211_DEBUG(IEEE80211_DL_REORDER,"%s(): SET rx timeout timer\n", __FUNCTION__);
-               pTS->RxTimeoutIndicateSeq = pTS->RxIndicateSeq;
-
-               mod_timer(&pTS->RxPktPendingTimer,  jiffies + MSECS(pHTInfo->RxReorderPendingTime));
-       }
-}
-
-u8 parse_subframe(struct ieee80211_device* ieee,struct sk_buff *skb,
-                  struct ieee80211_rx_stats *rx_stats,
-                 struct ieee80211_rxb *rxb,u8* src,u8* dst)
-{
-       struct ieee80211_hdr_3addr  *hdr = (struct ieee80211_hdr_3addr* )skb->data;
-       u16             fc = le16_to_cpu(hdr->frame_ctl);
-
-       u16             LLCOffset= sizeof(struct ieee80211_hdr_3addr);
-       u16             ChkLength;
-       bool            bIsAggregateFrame = false;
-       u16             nSubframe_Length;
-       u8              nPadding_Length = 0;
-       u16             SeqNum=0;
-
-       struct sk_buff *sub_skb;
-       u8             *data_ptr;
-       /* just for debug purpose */
-       SeqNum = WLAN_GET_SEQ_SEQ(le16_to_cpu(hdr->seq_ctl));
-
-       if((IEEE80211_QOS_HAS_SEQ(fc))&&\
-                       (((frameqos *)(skb->data + IEEE80211_3ADDR_LEN))->field.reserved)) {
-               bIsAggregateFrame = true;
-       }
-
-       if(IEEE80211_QOS_HAS_SEQ(fc)) {
-               LLCOffset += 2;
-       }
-
-       if(rx_stats->bContainHTC) {
-               LLCOffset += sHTCLng;
-       }
-       // Null packet, don't indicate it to upper layer
-       ChkLength = LLCOffset;/* + (Frame_WEP(frame)!=0 ?Adapter->MgntInfo.SecurityInfo.EncryptionHeadOverhead:0);*/
-
-       if( skb->len <= ChkLength ) {
-               return 0;
-       }
-
-       skb_pull(skb, LLCOffset);
-       ieee->bIsAggregateFrame = bIsAggregateFrame;//added by amy for Leisure PS
-
-       if(!bIsAggregateFrame) {
-               rxb->nr_subframes = 1;
-#ifdef JOHN_NOCPY
-               rxb->subframes[0] = skb;
-#else
-               rxb->subframes[0] = skb_copy(skb, GFP_ATOMIC);
-#endif
-
-               memcpy(rxb->src,src,ETH_ALEN);
-               memcpy(rxb->dst,dst,ETH_ALEN);
-               //IEEE80211_DEBUG_DATA(IEEE80211_DL_RX,skb->data,skb->len);
-               return 1;
-       } else {
-               rxb->nr_subframes = 0;
-               memcpy(rxb->src,src,ETH_ALEN);
-               memcpy(rxb->dst,dst,ETH_ALEN);
-               while(skb->len > ETHERNET_HEADER_SIZE) {
-                       /* Offset 12 denote 2 mac address */
-                       nSubframe_Length = *((u16*)(skb->data + 12));
-                       //==m==>change the length order
-                       nSubframe_Length = (nSubframe_Length>>8) + (nSubframe_Length<<8);
-
-                       if(skb->len<(ETHERNET_HEADER_SIZE + nSubframe_Length)) {
-                               printk("%s: A-MSDU parse error!! pRfd->nTotalSubframe : %d\n",\
-                                               __FUNCTION__,rxb->nr_subframes);
-                               printk("%s: A-MSDU parse error!! Subframe Length: %d\n",__FUNCTION__, nSubframe_Length);
-                               printk("nRemain_Length is %d and nSubframe_Length is : %d\n",skb->len,nSubframe_Length);
-                               printk("The Packet SeqNum is %d\n",SeqNum);
-                               return 0;
-                       }
-
-                       /* move the data point to data content */
-                       skb_pull(skb, ETHERNET_HEADER_SIZE);
-
-#ifdef JOHN_NOCPY
-                       sub_skb = skb_clone(skb, GFP_ATOMIC);
-                       sub_skb->len = nSubframe_Length;
-                       sub_skb->tail = sub_skb->data + nSubframe_Length;
-#else
-                       /* Allocate new skb for releasing to upper layer */
-                       sub_skb = dev_alloc_skb(nSubframe_Length + 12);
-                       skb_reserve(sub_skb, 12);
-                       data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length);
-                       memcpy(data_ptr,skb->data,nSubframe_Length);
-#endif
-                       rxb->subframes[rxb->nr_subframes++] = sub_skb;
-                       if(rxb->nr_subframes >= MAX_SUBFRAME_COUNT) {
-                               IEEE80211_DEBUG_RX("ParseSubframe(): Too many Subframes! Packets dropped!\n");
-                               break;
-                       }
-                       skb_pull(skb,nSubframe_Length);
-
-                       if(skb->len != 0) {
-                               nPadding_Length = 4 - ((nSubframe_Length + ETHERNET_HEADER_SIZE) % 4);
-                               if(nPadding_Length == 4) {
-                                       nPadding_Length = 0;
-                               }
-
-                               if(skb->len < nPadding_Length) {
-                                       return 0;
-                               }
-
-                               skb_pull(skb,nPadding_Length);
-                       }
-               }
-#ifdef JOHN_NOCPY
-               dev_kfree_skb(skb);
-#endif
-               return rxb->nr_subframes;
-       }
-}
-
-/* All received frames are sent to this function. @skb contains the frame in
- * IEEE 802.11 format, i.e., in the format it was sent over air.
- * This function is called only as a tasklet (software IRQ). */
-int ieee80211_rtl_rx(struct ieee80211_device *ieee, struct sk_buff *skb,
-                struct ieee80211_rx_stats *rx_stats)
-{
-       struct net_device *dev = ieee->dev;
-       struct ieee80211_hdr_4addr *hdr;
-
-       size_t hdrlen;
-       u16 fc, type, stype, sc;
-       struct net_device_stats *stats;
-       unsigned int frag;
-       u8 *payload;
-       u16 ethertype;
-       //added by amy for reorder
-       u8      TID = 0;
-       u16     SeqNum = 0;
-       PRX_TS_RECORD pTS = NULL;
-       bool unicast_packet = false;
-       //added by amy for reorder
-#ifdef NOT_YET
-       struct net_device *wds = NULL;
-       struct sk_buff *skb2 = NULL;
-       struct net_device *wds = NULL;
-       int frame_authorized = 0;
-       int from_assoc_ap = 0;
-       void *sta = NULL;
-#endif
-       u8 dst[ETH_ALEN];
-       u8 src[ETH_ALEN];
-       u8 bssid[ETH_ALEN];
-       struct ieee80211_crypt_data *crypt = NULL;
-       int keyidx = 0;
-
-       int i;
-       struct ieee80211_rxb* rxb = NULL;
-       // cheat the the hdr type
-       hdr = (struct ieee80211_hdr_4addr *)skb->data;
-       stats = &ieee->stats;
-
-       if (skb->len < 10) {
-               printk(KERN_INFO "%s: SKB length < 10\n",
-                      dev->name);
-               goto rx_dropped;
-       }
-
-       fc = le16_to_cpu(hdr->frame_ctl);
-       type = WLAN_FC_GET_TYPE(fc);
-       stype = WLAN_FC_GET_STYPE(fc);
-       sc = le16_to_cpu(hdr->seq_ctl);
-
-       frag = WLAN_GET_SEQ_FRAG(sc);
-       hdrlen = ieee80211_get_hdrlen(fc);
-
-       if(HTCCheck(ieee, skb->data))
-       {
-               if(net_ratelimit())
-               printk("find HTCControl\n");
-               hdrlen += 4;
-               rx_stats->bContainHTC = 1;
-       }
-
-#ifdef NOT_YET
-#if WIRELESS_EXT > 15
-       /* Put this code here so that we avoid duplicating it in all
-        * Rx paths. - Jean II */
-#ifdef IW_WIRELESS_SPY         /* defined in iw_handler.h */
-       /* If spy monitoring on */
-       if (iface->spy_data.spy_number > 0) {
-               struct iw_quality wstats;
-               wstats.level = rx_stats->rssi;
-               wstats.noise = rx_stats->noise;
-               wstats.updated = 6;     /* No qual value */
-               /* Update spy records */
-               wireless_spy_update(dev, hdr->addr2, &wstats);
-       }
-#endif /* IW_WIRELESS_SPY */
-#endif /* WIRELESS_EXT > 15 */
-       hostap_update_rx_stats(local->ap, hdr, rx_stats);
-#endif
-
-#if WIRELESS_EXT > 15
-       if (ieee->iw_mode == IW_MODE_MONITOR) {
-               ieee80211_monitor_rx(ieee, skb, rx_stats);
-               stats->rx_packets++;
-               stats->rx_bytes += skb->len;
-               return 1;
-       }
-#endif
-       if (ieee->host_decrypt) {
-               int idx = 0;
-               if (skb->len >= hdrlen + 3)
-                       idx = skb->data[hdrlen + 3] >> 6;
-               crypt = ieee->crypt[idx];
-#ifdef NOT_YET
-               sta = NULL;
-
-               /* Use station specific key to override default keys if the
-                * receiver address is a unicast address ("individual RA"). If
-                * bcrx_sta_key parameter is set, station specific key is used
-                * even with broad/multicast targets (this is against IEEE
-                * 802.11, but makes it easier to use different keys with
-                * stations that do not support WEP key mapping). */
-
-               if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key)
-                       (void) hostap_handle_sta_crypto(local, hdr, &crypt,
-                                                       &sta);
-#endif
-
-               /* allow NULL decrypt to indicate an station specific override
-                * for default encryption */
-               if (crypt && (crypt->ops == NULL ||
-                             crypt->ops->decrypt_mpdu == NULL))
-                       crypt = NULL;
-
-               if (!crypt && (fc & IEEE80211_FCTL_WEP)) {
-                       /* This seems to be triggered by some (multicast?)
-                        * frames from other than current BSS, so just drop the
-                        * frames silently instead of filling system log with
-                        * these reports. */
-                       IEEE80211_DEBUG_DROP("Decryption failed (not set)"
-                                            " (SA=%pM)\n",
-                                            hdr->addr2);
-                       ieee->ieee_stats.rx_discards_undecryptable++;
-                       goto rx_dropped;
-               }
-       }
-
-       if (skb->len < IEEE80211_DATA_HDR3_LEN)
-               goto rx_dropped;
-
-       // if QoS enabled, should check the sequence for each of the AC
-       if( (ieee->pHTInfo->bCurRxReorderEnable == false) || !ieee->current_network.qos_data.active|| !IsDataFrame(skb->data) || IsLegacyDataFrame(skb->data)){
-               if (is_duplicate_packet(ieee, hdr))
-               goto rx_dropped;
-
-       }
-       else
-       {
-               PRX_TS_RECORD pRxTS = NULL;
-
-               if(GetTs(
-                               ieee,
-                               (PTS_COMMON_INFO*) &pRxTS,
-                               hdr->addr2,
-                               (u8)Frame_QoSTID((u8*)(skb->data)),
-                               RX_DIR,
-                               true))
-               {
-
-                       if(     (fc & (1<<11))  &&
-                                       (frag == pRxTS->RxLastFragNum) &&
-                                       (WLAN_GET_SEQ_SEQ(sc) == pRxTS->RxLastSeqNum)   )
-                       {
-                               goto rx_dropped;
-                       }
-                       else
-                       {
-                               pRxTS->RxLastFragNum = frag;
-                               pRxTS->RxLastSeqNum = WLAN_GET_SEQ_SEQ(sc);
-                       }
-               }
-               else
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR, "%s(): No TS!! Skip the check!!\n",__FUNCTION__);
-                       goto rx_dropped;
-               }
-       }
-
-       if (type == IEEE80211_FTYPE_MGMT) {
-
-               if (ieee80211_rx_frame_mgmt(ieee, skb, rx_stats, type, stype))
-                       goto rx_dropped;
-               else
-                       goto rx_exit;
-       }
-
-       /* Data frame - extract src/dst addresses */
-       switch (fc & (IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS)) {
-       case IEEE80211_FCTL_FROMDS:
-               memcpy(dst, hdr->addr1, ETH_ALEN);
-               memcpy(src, hdr->addr3, ETH_ALEN);
-               memcpy(bssid, hdr->addr2, ETH_ALEN);
-               break;
-       case IEEE80211_FCTL_TODS:
-               memcpy(dst, hdr->addr3, ETH_ALEN);
-               memcpy(src, hdr->addr2, ETH_ALEN);
-               memcpy(bssid, hdr->addr1, ETH_ALEN);
-               break;
-       case IEEE80211_FCTL_FROMDS | IEEE80211_FCTL_TODS:
-               if (skb->len < IEEE80211_DATA_HDR4_LEN)
-                       goto rx_dropped;
-               memcpy(dst, hdr->addr3, ETH_ALEN);
-               memcpy(src, hdr->addr4, ETH_ALEN);
-               memcpy(bssid, ieee->current_network.bssid, ETH_ALEN);
-               break;
-       case 0:
-               memcpy(dst, hdr->addr1, ETH_ALEN);
-               memcpy(src, hdr->addr2, ETH_ALEN);
-               memcpy(bssid, hdr->addr3, ETH_ALEN);
-               break;
-       }
-
-#ifdef NOT_YET
-       if (hostap_rx_frame_wds(ieee, hdr, fc, &wds))
-               goto rx_dropped;
-       if (wds) {
-               skb->dev = dev = wds;
-               stats = hostap_get_stats(dev);
-       }
-
-       if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
-           (fc & (IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) == IEEE80211_FCTL_FROMDS &&
-           ieee->stadev &&
-           memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
-               /* Frame from BSSID of the AP for which we are a client */
-               skb->dev = dev = ieee->stadev;
-               stats = hostap_get_stats(dev);
-               from_assoc_ap = 1;
-       }
-#endif
-
-       dev->last_rx = jiffies;
-
-#ifdef NOT_YET
-       if ((ieee->iw_mode == IW_MODE_MASTER ||
-            ieee->iw_mode == IW_MODE_REPEAT) &&
-           !from_assoc_ap) {
-               switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats,
-                                            wds != NULL)) {
-               case AP_RX_CONTINUE_NOT_AUTHORIZED:
-                       frame_authorized = 0;
-                       break;
-               case AP_RX_CONTINUE:
-                       frame_authorized = 1;
-                       break;
-               case AP_RX_DROP:
-                       goto rx_dropped;
-               case AP_RX_EXIT:
-                       goto rx_exit;
-               }
-       }
-#endif
-       /* Nullfunc frames may have PS-bit set, so they must be passed to
-        * hostap_handle_sta_rx() before being dropped here. */
-       if (stype != IEEE80211_STYPE_DATA &&
-           stype != IEEE80211_STYPE_DATA_CFACK &&
-           stype != IEEE80211_STYPE_DATA_CFPOLL &&
-           stype != IEEE80211_STYPE_DATA_CFACKPOLL&&
-           stype != IEEE80211_STYPE_QOS_DATA//add by David,2006.8.4
-           ) {
-               if (stype != IEEE80211_STYPE_NULLFUNC)
-                       IEEE80211_DEBUG_DROP(
-                               "RX: dropped data frame "
-                               "with no data (type=0x%02x, "
-                               "subtype=0x%02x, len=%d)\n",
-                               type, stype, skb->len);
-               goto rx_dropped;
-       }
-        if (memcmp(bssid, ieee->current_network.bssid, ETH_ALEN))
-                goto rx_dropped;
-
-#ifdef ENABLE_LPS
-       if ((ieee->iw_mode == IW_MODE_INFRA)  && (ieee->sta_sleep == 1)
-               && (ieee->polling)) {
-               if (WLAN_FC_MORE_DATA(fc)) {
-                       /* more data bit is set, let's request a new frame from the AP */
-                       ieee80211_sta_ps_send_pspoll_frame(ieee);
-               } else {
-                       ieee->polling =  false;
-               }
-       }
-#endif
-
-       ieee->need_sw_enc = 0;
-
-        if((!rx_stats->Decrypted)){
-                ieee->need_sw_enc = 1;
-        }
-
-       /* skb: hdr + (possibly fragmented, possibly encrypted) payload */
-
-       if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
-           (keyidx = ieee80211_rx_frame_decrypt(ieee, skb, crypt)) < 0)
-       {
-               printk("decrypt frame error\n");
-               goto rx_dropped;
-       }
-
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-
-       /* skb: hdr + (possibly fragmented) plaintext payload */
-       // PR: FIXME: hostap has additional conditions in the "if" below:
-       // ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
-       if ((frag != 0 || (fc & IEEE80211_FCTL_MOREFRAGS))) {
-               int flen;
-               struct sk_buff *frag_skb = ieee80211_frag_cache_get(ieee, hdr);
-               IEEE80211_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
-
-               if (!frag_skb) {
-                       IEEE80211_DEBUG(IEEE80211_DL_RX | IEEE80211_DL_FRAG,
-                                       "Rx cannot get skb from fragment "
-                                       "cache (morefrag=%d seq=%u frag=%u)\n",
-                                       (fc & IEEE80211_FCTL_MOREFRAGS) != 0,
-                                       WLAN_GET_SEQ_SEQ(sc), frag);
-                       goto rx_dropped;
-               }
-               flen = skb->len;
-               if (frag != 0)
-                       flen -= hdrlen;
-
-               if (frag_skb->tail + flen > frag_skb->end) {
-                       printk(KERN_WARNING "%s: host decrypted and "
-                              "reassembled frame did not fit skb\n",
-                              dev->name);
-                       ieee80211_frag_cache_invalidate(ieee, hdr);
-                       goto rx_dropped;
-               }
-
-               if (frag == 0) {
-                       /* copy first fragment (including full headers) into
-                        * beginning of the fragment cache skb */
-                       memcpy(skb_put(frag_skb, flen), skb->data, flen);
-               } else {
-                       /* append frame payload to the end of the fragment
-                        * cache skb */
-                       memcpy(skb_put(frag_skb, flen), skb->data + hdrlen,
-                              flen);
-               }
-               dev_kfree_skb_any(skb);
-               skb = NULL;
-
-               if (fc & IEEE80211_FCTL_MOREFRAGS) {
-                       /* more fragments expected - leave the skb in fragment
-                        * cache for now; it will be delivered to upper layers
-                        * after all fragments have been received */
-                       goto rx_exit;
-               }
-
-               /* this was the last fragment and the frame will be
-                * delivered, so remove skb from fragment cache */
-               skb = frag_skb;
-               hdr = (struct ieee80211_hdr_4addr *) skb->data;
-               ieee80211_frag_cache_invalidate(ieee, hdr);
-       }
-
-       /* skb: hdr + (possible reassembled) full MSDU payload; possibly still
-        * encrypted/authenticated */
-       if (ieee->host_decrypt && (fc & IEEE80211_FCTL_WEP) &&
-           ieee80211_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
-       {
-               printk("==>decrypt msdu error\n");
-               goto rx_dropped;
-       }
-
-       //added by amy for AP roaming
-       ieee->LinkDetectInfo.NumRecvDataInPeriod++;
-       ieee->LinkDetectInfo.NumRxOkInPeriod++;
-
-       hdr = (struct ieee80211_hdr_4addr *) skb->data;
-       if((!is_multicast_ether_addr(hdr->addr1)) && (!is_broadcast_ether_addr(hdr->addr1)))
-               unicast_packet = true;
-
-       if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep) {
-               if (/*ieee->ieee802_1x &&*/
-                   ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
-
-#ifdef CONFIG_IEEE80211_DEBUG
-                       /* pass unencrypted EAPOL frames even if encryption is
-                        * configured */
-                       struct eapol *eap = (struct eapol *)(skb->data +
-                               24);
-                       IEEE80211_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
-                                               eap_get_type(eap->type));
-#endif
-               } else {
-                       IEEE80211_DEBUG_DROP(
-                               "encryption configured, but RX "
-                               "frame not encrypted (SA=%pM)\n",
-                               hdr->addr2);
-                       goto rx_dropped;
-               }
-       }
-
-#ifdef CONFIG_IEEE80211_DEBUG
-       if (crypt && !(fc & IEEE80211_FCTL_WEP) &&
-           ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
-                       struct eapol *eap = (struct eapol *)(skb->data +
-                               24);
-                       IEEE80211_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
-                                               eap_get_type(eap->type));
-       }
-#endif
-
-       if (crypt && !(fc & IEEE80211_FCTL_WEP) && !ieee->open_wep &&
-           !ieee80211_is_eapol_frame(ieee, skb, hdrlen)) {
-               IEEE80211_DEBUG_DROP(
-                       "dropped unencrypted RX data "
-                       "frame from %pM"
-                       " (drop_unencrypted=1)\n",
-                       hdr->addr2);
-               goto rx_dropped;
-       }
-//added by amy for reorder
-       if(ieee->current_network.qos_data.active && IsQoSDataFrame(skb->data)
-               && !is_multicast_ether_addr(hdr->addr1) && !is_broadcast_ether_addr(hdr->addr1))
-       {
-               TID = Frame_QoSTID(skb->data);
-               SeqNum = WLAN_GET_SEQ_SEQ(sc);
-               GetTs(ieee,(PTS_COMMON_INFO*) &pTS,hdr->addr2,TID,RX_DIR,true);
-               if(TID !=0 && TID !=3)
-               {
-                       ieee->bis_any_nonbepkts = true;
-               }
-       }
-
-//added by amy for reorder
-       /* skb: hdr + (possible reassembled) full plaintext payload */
-       payload = skb->data + hdrlen;
-
-       rxb = kmalloc(sizeof(struct ieee80211_rxb), GFP_ATOMIC);
-       if(rxb == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR,"%s(): kmalloc rxb error\n",__FUNCTION__);
-               goto rx_dropped;
-       }
-       /* to parse amsdu packets */
-       /* qos data packets & reserved bit is 1 */
-       if(parse_subframe(ieee, skb,rx_stats,rxb,src,dst) == 0) {
-               /* only to free rxb, and not submit the packets to upper layer */
-               for(i =0; i < rxb->nr_subframes; i++) {
-                       dev_kfree_skb(rxb->subframes[i]);
-               }
-               kfree(rxb);
-               rxb = NULL;
-               goto rx_dropped;
-       }
-
-#ifdef ENABLE_LPS
-               if(unicast_packet)
-               {
-                       if (type == IEEE80211_FTYPE_DATA)
-                       {
-
-                               if(ieee->bIsAggregateFrame)
-                                       ieee->LinkDetectInfo.NumRxUnicastOkInPeriod+=rxb->nr_subframes;
-                               else
-                                       ieee->LinkDetectInfo.NumRxUnicastOkInPeriod++;
-
-                               // 2009.03.03 Leave DC mode immediately when detect high traffic
-                               if((ieee->state == IEEE80211_LINKED) /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
-                               {
-                                       if(     ((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod +ieee->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
-                                               (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
-                                       {
-                                               if(ieee->LeisurePSLeave)
-                                                       ieee->LeisurePSLeave(ieee);
-                                       }
-                               }
-                       }
-               }
-#endif
-
-       ieee->last_rx_ps_time = jiffies;
-//added by amy for reorder
-       if(ieee->pHTInfo->bCurRxReorderEnable == false ||pTS == NULL){
-//added by amy for reorder
-               for(i = 0; i<rxb->nr_subframes; i++) {
-                       struct sk_buff *sub_skb = rxb->subframes[i];
-
-                       if (sub_skb) {
-                               /* convert hdr + possible LLC headers into Ethernet header */
-                               ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
-                               if (sub_skb->len >= 8 &&
-                                               ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
-                                                 ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
-                                                memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
-                                       /* remove RFC1042 or Bridge-Tunnel encapsulation and
-                                        * replace EtherType */
-                                       skb_pull(sub_skb, SNAP_SIZE);
-                                       memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
-                                       memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
-                               } else {
-                                       u16 len;
-                                       /* Leave Ethernet header part of hdr and full payload */
-                                       len = htons(sub_skb->len);
-                                       memcpy(skb_push(sub_skb, 2), &len, 2);
-                                       memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
-                                       memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
-                               }
-
-                               stats->rx_packets++;
-                               stats->rx_bytes += sub_skb->len;
-                               if(is_multicast_ether_addr(dst)) {
-                                       stats->multicast++;
-                               }
-
-                               /* Indicat the packets to upper layer */
-                               sub_skb->protocol = eth_type_trans(sub_skb, dev);
-                               memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
-                               sub_skb->dev = dev;
-                               sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
-                               netif_rx(sub_skb);
-                       }
-               }
-               kfree(rxb);
-               rxb = NULL;
-
-       }
-       else
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_REORDER,"%s(): REORDER ENABLE AND PTS not NULL, and we will enter RxReorderIndicatePacket()\n",__FUNCTION__);
-               RxReorderIndicatePacket(ieee, rxb, pTS, SeqNum);
-       }
-#ifndef JOHN_NOCPY
-       dev_kfree_skb(skb);
-#endif
-
- rx_exit:
-#ifdef NOT_YET
-       if (sta)
-               hostap_handle_sta_release(sta);
-#endif
-       return 1;
-
- rx_dropped:
-       kfree(rxb);
-       rxb = NULL;
-       stats->rx_dropped++;
-
-       /* Returning 0 indicates to caller that we have not handled the SKB--
-        * so it is still allocated and can be used again by underlying
-        * hardware as a DMA target */
-       return 0;
-}
-
-#define MGMT_FRAME_FIXED_PART_LENGTH            0x24
-
-static u8 qos_oui[QOS_OUI_LEN] = { 0x00, 0x50, 0xF2 };
-
-/*
-* Make the structure we read from the beacon packet to have
-* the right values
-*/
-static int ieee80211_verify_qos_info(struct ieee80211_qos_information_element
-                                     *info_element, int sub_type)
-{
-
-        if (info_element->qui_subtype != sub_type)
-                return -1;
-        if (memcmp(info_element->qui, qos_oui, QOS_OUI_LEN))
-                return -1;
-        if (info_element->qui_type != QOS_OUI_TYPE)
-                return -1;
-        if (info_element->version != QOS_VERSION_1)
-                return -1;
-
-        return 0;
-}
-
-
-/*
- * Parse a QoS parameter element
- */
-static int ieee80211_read_qos_param_element(struct ieee80211_qos_parameter_info
-                                            *element_param, struct ieee80211_info_element
-                                            *info_element)
-{
-        int ret = 0;
-        u16 size = sizeof(struct ieee80211_qos_parameter_info) - 2;
-
-        if ((info_element == NULL) || (element_param == NULL))
-                return -1;
-
-        if (info_element->id == QOS_ELEMENT_ID && info_element->len == size) {
-                memcpy(element_param->info_element.qui, info_element->data,
-                       info_element->len);
-                element_param->info_element.elementID = info_element->id;
-                element_param->info_element.length = info_element->len;
-        } else
-                ret = -1;
-        if (ret == 0)
-                ret = ieee80211_verify_qos_info(&element_param->info_element,
-                                                QOS_OUI_PARAM_SUB_TYPE);
-        return ret;
-}
-
-/*
- * Parse a QoS information element
- */
-static int ieee80211_read_qos_info_element(struct
-                                           ieee80211_qos_information_element
-                                           *element_info, struct ieee80211_info_element
-                                           *info_element)
-{
-        int ret = 0;
-        u16 size = sizeof(struct ieee80211_qos_information_element) - 2;
-
-        if (element_info == NULL)
-                return -1;
-        if (info_element == NULL)
-                return -1;
-
-        if ((info_element->id == QOS_ELEMENT_ID) && (info_element->len == size)) {
-                memcpy(element_info->qui, info_element->data,
-                       info_element->len);
-                element_info->elementID = info_element->id;
-                element_info->length = info_element->len;
-        } else
-                ret = -1;
-
-        if (ret == 0)
-                ret = ieee80211_verify_qos_info(element_info,
-                                                QOS_OUI_INFO_SUB_TYPE);
-        return ret;
-}
-
-
-/*
- * Write QoS parameters from the ac parameters.
- */
-static int ieee80211_qos_convert_ac_to_parameters(struct
-                                                  ieee80211_qos_parameter_info
-                                                  *param_elm, struct
-                                                  ieee80211_qos_parameters
-                                                  *qos_param)
-{
-        int rc = 0;
-        int i;
-        struct ieee80211_qos_ac_parameter *ac_params;
-       u8 aci;
-
-        for (i = 0; i < QOS_QUEUE_NUM; i++) {
-                ac_params = &(param_elm->ac_params_record[i]);
-
-               aci = (ac_params->aci_aifsn & 0x60) >> 5;
-
-               if(aci >= QOS_QUEUE_NUM)
-                       continue;
-                qos_param->aifs[aci] = (ac_params->aci_aifsn) & 0x0f;
-
-               /* WMM spec P.11: The minimum value for AIFSN shall be 2 */
-                qos_param->aifs[aci] = (qos_param->aifs[aci] < 2) ? 2:qos_param->aifs[aci];
-
-                qos_param->cw_min[aci] = ac_params->ecw_min_max & 0x0F;
-
-                qos_param->cw_max[aci] = (ac_params->ecw_min_max & 0xF0) >> 4;
-
-                qos_param->flag[aci] =
-                    (ac_params->aci_aifsn & 0x10) ? 0x01 : 0x00;
-                qos_param->tx_op_limit[aci] = le16_to_cpu(ac_params->tx_op_limit);
-        }
-        return rc;
-}
-
-/*
- * we have a generic data element which it may contain QoS information or
- * parameters element. check the information element length to decide
- * which type to read
- */
-static int ieee80211_parse_qos_info_param_IE(struct ieee80211_info_element
-                                             *info_element,
-                                             struct ieee80211_network *network)
-{
-        int rc = 0;
-        struct ieee80211_qos_parameters *qos_param = NULL;
-        struct ieee80211_qos_information_element qos_info_element;
-
-        rc = ieee80211_read_qos_info_element(&qos_info_element, info_element);
-
-        if (rc == 0) {
-                network->qos_data.param_count = qos_info_element.ac_info & 0x0F;
-                network->flags |= NETWORK_HAS_QOS_INFORMATION;
-        } else {
-                struct ieee80211_qos_parameter_info param_element;
-
-                rc = ieee80211_read_qos_param_element(&param_element,
-                                                      info_element);
-                if (rc == 0) {
-                        qos_param = &(network->qos_data.parameters);
-                        ieee80211_qos_convert_ac_to_parameters(&param_element,
-                                                               qos_param);
-                        network->flags |= NETWORK_HAS_QOS_PARAMETERS;
-                        network->qos_data.param_count =
-                            param_element.info_element.ac_info & 0x0F;
-                }
-        }
-
-        if (rc == 0) {
-                IEEE80211_DEBUG_QOS("QoS is supported\n");
-                network->qos_data.supported = 1;
-        }
-        return rc;
-}
-
-#ifdef CONFIG_IEEE80211_DEBUG
-#define MFIE_STRING(x) case MFIE_TYPE_ ##x: return #x
-
-static const char *get_info_element_string(u16 id)
-{
-        switch (id) {
-                MFIE_STRING(SSID);
-                MFIE_STRING(RATES);
-                MFIE_STRING(FH_SET);
-                MFIE_STRING(DS_SET);
-                MFIE_STRING(CF_SET);
-                MFIE_STRING(TIM);
-                MFIE_STRING(IBSS_SET);
-                MFIE_STRING(COUNTRY);
-                MFIE_STRING(HOP_PARAMS);
-                MFIE_STRING(HOP_TABLE);
-                MFIE_STRING(REQUEST);
-                MFIE_STRING(CHALLENGE);
-                MFIE_STRING(POWER_CONSTRAINT);
-                MFIE_STRING(POWER_CAPABILITY);
-                MFIE_STRING(TPC_REQUEST);
-                MFIE_STRING(TPC_REPORT);
-                MFIE_STRING(SUPP_CHANNELS);
-                MFIE_STRING(CSA);
-                MFIE_STRING(MEASURE_REQUEST);
-                MFIE_STRING(MEASURE_REPORT);
-                MFIE_STRING(QUIET);
-                MFIE_STRING(IBSS_DFS);
-               // MFIE_STRING(ERP_INFO);
-                MFIE_STRING(RSN);
-                MFIE_STRING(RATES_EX);
-                MFIE_STRING(GENERIC);
-                MFIE_STRING(QOS_PARAMETER);
-        default:
-                return "UNKNOWN";
-        }
-}
-#endif
-
-#ifdef ENABLE_DOT11D
-static inline void ieee80211_extract_country_ie(
-       struct ieee80211_device *ieee,
-       struct ieee80211_info_element *info_element,
-       struct ieee80211_network *network,
-       u8 * addr2
-)
-{
-       if(IS_DOT11D_ENABLE(ieee))
-       {
-               if(info_element->len!= 0)
-               {
-                       memcpy(network->CountryIeBuf, info_element->data, info_element->len);
-                       network->CountryIeLen = info_element->len;
-
-                       if(!IS_COUNTRY_IE_VALID(ieee))
-                       {
-                               Dot11d_UpdateCountryIe(ieee, addr2, info_element->len, info_element->data);
-                       }
-               }
-
-               //
-               // 070305, rcnjko: I update country IE watch dog here because
-               // some AP (e.g. Cisco 1242) don't include country IE in their
-               // probe response frame.
-               //
-               if(IS_EQUAL_CIE_SRC(ieee, addr2) )
-               {
-                       UPDATE_CIE_WATCHDOG(ieee);
-               }
-       }
-
-}
-#endif
-
-int ieee80211_parse_info_param(struct ieee80211_device *ieee,
-               struct ieee80211_info_element *info_element,
-               u16 length,
-               struct ieee80211_network *network,
-               struct ieee80211_rx_stats *stats)
-{
-       u8 i;
-       short offset;
-        u16    tmp_htcap_len=0;
-       u16     tmp_htinfo_len=0;
-       u16 ht_realtek_agg_len=0;
-       u8  ht_realtek_agg_buf[MAX_IE_LEN];
-#ifdef CONFIG_IEEE80211_DEBUG
-       char rates_str[64];
-       char *p;
-#endif
-
-       while (length >= sizeof(*info_element)) {
-               if (sizeof(*info_element) + info_element->len > length) {
-                       IEEE80211_DEBUG_MGMT("Info elem: parse failed: "
-                                            "info_element->len + 2 > left : "
-                                            "info_element->len+2=%zd left=%d, id=%d.\n",
-                                            info_element->len +
-                                            sizeof(*info_element),
-                                            length, info_element->id);
-                       /* We stop processing but don't return an error here
-                        * because some misbehaviour APs break this rule. ie.
-                        * Orinoco AP1000. */
-                       break;
-               }
-
-               switch (info_element->id) {
-               case MFIE_TYPE_SSID:
-                       if (ieee80211_is_empty_essid(info_element->data,
-                                                    info_element->len)) {
-                               network->flags |= NETWORK_EMPTY_ESSID;
-                               break;
-                       }
-
-                       network->ssid_len = min(info_element->len,
-                                               (u8) IW_ESSID_MAX_SIZE);
-                       memcpy(network->ssid, info_element->data, network->ssid_len);
-                       if (network->ssid_len < IW_ESSID_MAX_SIZE)
-                               memset(network->ssid + network->ssid_len, 0,
-                                      IW_ESSID_MAX_SIZE - network->ssid_len);
-
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_SSID: '%s' len=%d.\n",
-                                            network->ssid, network->ssid_len);
-                       break;
-
-               case MFIE_TYPE_RATES:
-#ifdef CONFIG_IEEE80211_DEBUG
-                       p = rates_str;
-#endif
-                       network->rates_len = min(info_element->len,
-                                                MAX_RATES_LENGTH);
-                       for (i = 0; i < network->rates_len; i++) {
-                               network->rates[i] = info_element->data[i];
-#ifdef CONFIG_IEEE80211_DEBUG
-                               p += snprintf(p, sizeof(rates_str) -
-                                             (p - rates_str), "%02X ",
-                                             network->rates[i]);
-#endif
-                               if (ieee80211_is_ofdm_rate
-                                   (info_element->data[i])) {
-                                       network->flags |= NETWORK_HAS_OFDM;
-                                       if (info_element->data[i] &
-                                           IEEE80211_BASIC_RATE_MASK)
-                                               network->flags &=
-                                                   ~NETWORK_HAS_CCK;
-                               }
-                       }
-
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_RATES: '%s' (%d)\n",
-                                            rates_str, network->rates_len);
-                       break;
-
-               case MFIE_TYPE_RATES_EX:
-#ifdef CONFIG_IEEE80211_DEBUG
-                       p = rates_str;
-#endif
-                       network->rates_ex_len = min(info_element->len,
-                                                   MAX_RATES_EX_LENGTH);
-                       for (i = 0; i < network->rates_ex_len; i++) {
-                               network->rates_ex[i] = info_element->data[i];
-#ifdef CONFIG_IEEE80211_DEBUG
-                               p += snprintf(p, sizeof(rates_str) -
-                                             (p - rates_str), "%02X ",
-                                             network->rates[i]);
-#endif
-                               if (ieee80211_is_ofdm_rate
-                                   (info_element->data[i])) {
-                                       network->flags |= NETWORK_HAS_OFDM;
-                                       if (info_element->data[i] &
-                                           IEEE80211_BASIC_RATE_MASK)
-                                               network->flags &=
-                                                   ~NETWORK_HAS_CCK;
-                               }
-                       }
-
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_RATES_EX: '%s' (%d)\n",
-                                            rates_str, network->rates_ex_len);
-                       break;
-
-               case MFIE_TYPE_DS_SET:
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_DS_SET: %d\n",
-                                            info_element->data[0]);
-                       network->channel = info_element->data[0];
-                       break;
-
-               case MFIE_TYPE_FH_SET:
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_FH_SET: ignored\n");
-                       break;
-
-               case MFIE_TYPE_CF_SET:
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_CF_SET: ignored\n");
-                       break;
-
-               case MFIE_TYPE_TIM:
-                       if(info_element->len < 4)
-                               break;
-
-                       network->tim.tim_count = info_element->data[0];
-                       network->tim.tim_period = info_element->data[1];
-
-                        network->dtim_period = info_element->data[1];
-                        if(ieee->state != IEEE80211_LINKED)
-                                break;
-                       //we use jiffies for legacy Power save
-                       network->last_dtim_sta_time[0] = jiffies;
-                        network->last_dtim_sta_time[1] = stats->mac_time[1];
-
-                        network->dtim_data = IEEE80211_DTIM_VALID;
-
-                        if(info_element->data[0] != 0)
-                                break;
-
-                        if(info_element->data[2] & 1)
-                                network->dtim_data |= IEEE80211_DTIM_MBCAST;
-
-                        offset = (info_element->data[2] >> 1)*2;
-
-                        if(ieee->assoc_id < 8*offset ||
-                                ieee->assoc_id > 8*(offset + info_element->len -3))
-
-                                break;
-
-                        offset = (ieee->assoc_id / 8) - offset;// + ((aid % 8)? 0 : 1) ;
-
-                        if(info_element->data[3+offset] & (1<<(ieee->assoc_id%8)))
-                                network->dtim_data |= IEEE80211_DTIM_UCAST;
-
-                       break;
-
-               case MFIE_TYPE_ERP:
-                       network->erp_value = info_element->data[0];
-                       network->flags |= NETWORK_HAS_ERP_VALUE;
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_ERP_SET: %d\n",
-                                            network->erp_value);
-                       break;
-               case MFIE_TYPE_IBSS_SET:
-                       network->atim_window = info_element->data[0];
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_IBSS_SET: %d\n",
-                                            network->atim_window);
-                       break;
-
-               case MFIE_TYPE_CHALLENGE:
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_CHALLENGE: ignored\n");
-                       break;
-
-               case MFIE_TYPE_GENERIC:
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_GENERIC: %d bytes\n",
-                                            info_element->len);
-                       if (!ieee80211_parse_qos_info_param_IE(info_element,
-                                                              network))
-                               break;
-
-                       if (info_element->len >= 4 &&
-                           info_element->data[0] == 0x00 &&
-                           info_element->data[1] == 0x50 &&
-                           info_element->data[2] == 0xf2 &&
-                           info_element->data[3] == 0x01) {
-                               network->wpa_ie_len = min(info_element->len + 2,
-                                                         MAX_WPA_IE_LEN);
-                               memcpy(network->wpa_ie, info_element,
-                                      network->wpa_ie_len);
-                               break;
-                       }
-
-#ifdef THOMAS_TURBO
-                        if (info_element->len == 7 &&
-                            info_element->data[0] == 0x00 &&
-                            info_element->data[1] == 0xe0 &&
-                            info_element->data[2] == 0x4c &&
-                            info_element->data[3] == 0x01 &&
-                            info_element->data[4] == 0x02) {
-                                network->Turbo_Enable = 1;
-                        }
-#endif
-
-                        //for HTcap and HTinfo parameters
-                       if(tmp_htcap_len == 0){
-                               if(info_element->len >= 4 &&
-                                  info_element->data[0] == 0x00 &&
-                                  info_element->data[1] == 0x90 &&
-                                  info_element->data[2] == 0x4c &&
-                                  info_element->data[3] == 0x033){
-
-                                               tmp_htcap_len = min(info_element->len,(u8)MAX_IE_LEN);
-                                               if(tmp_htcap_len != 0){
-                                                       network->bssht.bdHTSpecVer = HT_SPEC_VER_EWC;
-                                                       network->bssht.bdHTCapLen = tmp_htcap_len > sizeof(network->bssht.bdHTCapBuf)?\
-                                                               sizeof(network->bssht.bdHTCapBuf):tmp_htcap_len;
-                                                       memcpy(network->bssht.bdHTCapBuf,info_element->data,network->bssht.bdHTCapLen);
-                                               }
-                               }
-                               if(tmp_htcap_len != 0)
-                                       network->bssht.bdSupportHT = true;
-                               else
-                                       network->bssht.bdSupportHT = false;
-                       }
-
-
-                       if(tmp_htinfo_len == 0){
-                               if(info_element->len >= 4 &&
-                                       info_element->data[0] == 0x00 &&
-                                       info_element->data[1] == 0x90 &&
-                                       info_element->data[2] == 0x4c &&
-                                       info_element->data[3] == 0x034){
-
-                                               tmp_htinfo_len = min(info_element->len,(u8)MAX_IE_LEN);
-                                               if(tmp_htinfo_len != 0){
-                                                       network->bssht.bdHTSpecVer = HT_SPEC_VER_EWC;
-                                                       if(tmp_htinfo_len){
-                                                               network->bssht.bdHTInfoLen = tmp_htinfo_len > sizeof(network->bssht.bdHTInfoBuf)?\
-                                                                       sizeof(network->bssht.bdHTInfoBuf):tmp_htinfo_len;
-                                                               memcpy(network->bssht.bdHTInfoBuf,info_element->data,network->bssht.bdHTInfoLen);
-                                                       }
-
-                                               }
-
-                               }
-                       }
-
-                       if(ieee->aggregation){
-                               if(network->bssht.bdSupportHT){
-                                       if(info_element->len >= 4 &&
-                                               info_element->data[0] == 0x00 &&
-                                               info_element->data[1] == 0xe0 &&
-                                               info_element->data[2] == 0x4c &&
-                                               info_element->data[3] == 0x02){
-
-                                               ht_realtek_agg_len = min(info_element->len,(u8)MAX_IE_LEN);
-                                               memcpy(ht_realtek_agg_buf,info_element->data,info_element->len);
-
-                                       }
-                                       if(ht_realtek_agg_len >= 5){
-                                               network->bssht.bdRT2RTAggregation = true;
-
-                                               if((ht_realtek_agg_buf[4] == 1) && (ht_realtek_agg_buf[5] & 0x02))
-                                               network->bssht.bdRT2RTLongSlotTime = true;
-                                       }
-                               }
-
-                       }
-
-                               if((info_element->len >= 3 &&
-                                        info_element->data[0] == 0x00 &&
-                                        info_element->data[1] == 0x05 &&
-                                        info_element->data[2] == 0xb5) ||
-                                        (info_element->len >= 3 &&
-                                        info_element->data[0] == 0x00 &&
-                                        info_element->data[1] == 0x0a &&
-                                        info_element->data[2] == 0xf7) ||
-                                        (info_element->len >= 3 &&
-                                        info_element->data[0] == 0x00 &&
-                                        info_element->data[1] == 0x10 &&
-                                        info_element->data[2] == 0x18)){
-
-                                               network->broadcom_cap_exist = true;
-
-                               }
-
-                       if(info_element->len >= 3 &&
-                               info_element->data[0] == 0x00 &&
-                               info_element->data[1] == 0x0c &&
-                               info_element->data[2] == 0x43)
-                       {
-                               network->ralink_cap_exist = true;
-                       }
-                       else
-                               network->ralink_cap_exist = false;
-                       //added by amy for atheros AP
-                       if((info_element->len >= 3 &&
-                               info_element->data[0] == 0x00 &&
-                               info_element->data[1] == 0x03 &&
-                               info_element->data[2] == 0x7f) ||
-                               (info_element->len >= 3 &&
-                               info_element->data[0] == 0x00 &&
-                               info_element->data[1] == 0x13 &&
-                               info_element->data[2] == 0x74))
-                       {
-                               network->atheros_cap_exist = true;
-                       }
-                       else
-                               network->atheros_cap_exist = false;
-
-                       if ((info_element->len >= 3 &&
-                                               info_element->data[0] == 0x00 &&
-                                               info_element->data[1] == 0x50 &&
-                                               info_element->data[2] == 0x43) )
-                       {
-                               network->marvell_cap_exist = true;
-                       }
-
-
-                       if(info_element->len >= 3 &&
-                               info_element->data[0] == 0x00 &&
-                               info_element->data[1] == 0x40 &&
-                               info_element->data[2] == 0x96)
-                       {
-                               network->cisco_cap_exist = true;
-                       }
-                       else
-                               network->cisco_cap_exist = false;
-                       //added by amy for LEAP of cisco
-                       if(info_element->len > 4 &&
-                               info_element->data[0] == 0x00 &&
-                               info_element->data[1] == 0x40 &&
-                               info_element->data[2] == 0x96 &&
-                               info_element->data[3] == 0x01)
-                       {
-                               if(info_element->len == 6)
-                               {
-                                       memcpy(network->CcxRmState, &info_element[4], 2);
-                                       if(network->CcxRmState[0] != 0)
-                                       {
-                                               network->bCcxRmEnable = true;
-                                       }
-                                       else
-                                               network->bCcxRmEnable = false;
-                                       //
-                                       // CCXv4 Table 59-1 MBSSID Masks.
-                                       //
-                                       network->MBssidMask = network->CcxRmState[1] & 0x07;
-                                       if(network->MBssidMask != 0)
-                                       {
-                                               network->bMBssidValid = true;
-                                               network->MBssidMask = 0xff << (network->MBssidMask);
-                                               cpMacAddr(network->MBssid, network->bssid);
-                                               network->MBssid[5] &= network->MBssidMask;
-                                       }
-                                       else
-                                       {
-                                               network->bMBssidValid = false;
-                                       }
-                               }
-                               else
-                               {
-                                       network->bCcxRmEnable = false;
-                               }
-                       }
-                       if(info_element->len > 4  &&
-                               info_element->data[0] == 0x00 &&
-                               info_element->data[1] == 0x40 &&
-                               info_element->data[2] == 0x96 &&
-                               info_element->data[3] == 0x03)
-                       {
-                               if(info_element->len == 5)
-                               {
-                                       network->bWithCcxVerNum = true;
-                                       network->BssCcxVerNumber = info_element->data[4];
-                               }
-                               else
-                               {
-                                       network->bWithCcxVerNum = false;
-                                       network->BssCcxVerNumber = 0;
-                               }
-                       }
-                       break;
-
-               case MFIE_TYPE_RSN:
-                       IEEE80211_DEBUG_MGMT("MFIE_TYPE_RSN: %d bytes\n",
-                                            info_element->len);
-                       network->rsn_ie_len = min(info_element->len + 2,
-                                                 MAX_WPA_IE_LEN);
-                       memcpy(network->rsn_ie, info_element,
-                              network->rsn_ie_len);
-                       break;
-
-                        //HT related element.
-               case MFIE_TYPE_HT_CAP:
-                       IEEE80211_DEBUG_SCAN("MFIE_TYPE_HT_CAP: %d bytes\n",
-                                            info_element->len);
-                       tmp_htcap_len = min(info_element->len,(u8)MAX_IE_LEN);
-                       if(tmp_htcap_len != 0){
-                               network->bssht.bdHTSpecVer = HT_SPEC_VER_EWC;
-                               network->bssht.bdHTCapLen = tmp_htcap_len > sizeof(network->bssht.bdHTCapBuf)?\
-                                       sizeof(network->bssht.bdHTCapBuf):tmp_htcap_len;
-                               memcpy(network->bssht.bdHTCapBuf,info_element->data,network->bssht.bdHTCapLen);
-
-                               //If peer is HT, but not WMM, call QosSetLegacyWMMParamWithHT()
-                               // windows driver will update WMM parameters each beacon received once connected
-                                // Linux driver is a bit different.
-                               network->bssht.bdSupportHT = true;
-                       }
-                       else
-                               network->bssht.bdSupportHT = false;
-                       break;
-
-
-               case MFIE_TYPE_HT_INFO:
-                       IEEE80211_DEBUG_SCAN("MFIE_TYPE_HT_INFO: %d bytes\n",
-                                            info_element->len);
-                       tmp_htinfo_len = min(info_element->len,(u8)MAX_IE_LEN);
-                       if(tmp_htinfo_len){
-                               network->bssht.bdHTSpecVer = HT_SPEC_VER_IEEE;
-                               network->bssht.bdHTInfoLen = tmp_htinfo_len > sizeof(network->bssht.bdHTInfoBuf)?\
-                                       sizeof(network->bssht.bdHTInfoBuf):tmp_htinfo_len;
-                               memcpy(network->bssht.bdHTInfoBuf,info_element->data,network->bssht.bdHTInfoLen);
-                       }
-                       break;
-
-               case MFIE_TYPE_AIRONET:
-                       IEEE80211_DEBUG_SCAN("MFIE_TYPE_AIRONET: %d bytes\n",
-                                            info_element->len);
-                       if(info_element->len >IE_CISCO_FLAG_POSITION)
-                       {
-                               network->bWithAironetIE = true;
-
-                               // CCX 1 spec v1.13, A01.1 CKIP Negotiation (page23):
-                               // "A Cisco access point advertises support for CKIP in beacon and probe response packets,
-                               //  by adding an Aironet element and setting one or both of the CKIP negotiation bits."
-                               if(     (info_element->data[IE_CISCO_FLAG_POSITION]&SUPPORT_CKIP_MIC)   ||
-                                       (info_element->data[IE_CISCO_FLAG_POSITION]&SUPPORT_CKIP_PK)    )
-                               {
-                                       network->bCkipSupported = true;
-                               }
-                               else
-                               {
-                                       network->bCkipSupported = false;
-                               }
-                       }
-                       else
-                       {
-                               network->bWithAironetIE = false;
-                               network->bCkipSupported = false;
-                       }
-                       break;
-               case MFIE_TYPE_QOS_PARAMETER:
-                       printk(KERN_ERR
-                              "QoS Error need to parse QOS_PARAMETER IE\n");
-                       break;
-
-#ifdef ENABLE_DOT11D
-               case MFIE_TYPE_COUNTRY:
-                       IEEE80211_DEBUG_SCAN("MFIE_TYPE_COUNTRY: %d bytes\n",
-                                            info_element->len);
-                       ieee80211_extract_country_ie(ieee, info_element, network, network->bssid);//addr2 is same as addr3 when from an AP
-                       break;
-#endif
-
-               default:
-                       IEEE80211_DEBUG_MGMT
-                           ("Unsupported info element: %s (%d)\n",
-                            get_info_element_string(info_element->id),
-                            info_element->id);
-                       break;
-               }
-
-               length -= sizeof(*info_element) + info_element->len;
-               info_element =
-                   (struct ieee80211_info_element *)&info_element->
-                   data[info_element->len];
-       }
-
-       if(!network->atheros_cap_exist && !network->broadcom_cap_exist &&
-               !network->cisco_cap_exist && !network->ralink_cap_exist && !network->bssht.bdRT2RTAggregation &&
-               !network->marvell_cap_exist)
-       {
-               network->unknown_cap_exist = true;
-       }
-       else
-       {
-               network->unknown_cap_exist = false;
-       }
-       return 0;
-}
-
-static inline u8 ieee80211_SignalStrengthTranslate(
-       u8  CurrSS
-       )
-{
-       u8 RetSS;
-
-       // Step 1. Scale mapping.
-       if(CurrSS >= 71 && CurrSS <= 100)
-       {
-               RetSS = 90 + ((CurrSS - 70) / 3);
-       }
-       else if(CurrSS >= 41 && CurrSS <= 70)
-       {
-               RetSS = 78 + ((CurrSS - 40) / 3);
-       }
-       else if(CurrSS >= 31 && CurrSS <= 40)
-       {
-               RetSS = 66 + (CurrSS - 30);
-       }
-       else if(CurrSS >= 21 && CurrSS <= 30)
-       {
-               RetSS = 54 + (CurrSS - 20);
-       }
-       else if(CurrSS >= 5 && CurrSS <= 20)
-       {
-               RetSS = 42 + (((CurrSS - 5) * 2) / 3);
-       }
-       else if(CurrSS == 4)
-       {
-               RetSS = 36;
-       }
-       else if(CurrSS == 3)
-       {
-               RetSS = 27;
-       }
-       else if(CurrSS == 2)
-       {
-               RetSS = 18;
-       }
-       else if(CurrSS == 1)
-       {
-               RetSS = 9;
-       }
-       else
-       {
-               RetSS = CurrSS;
-       }
-
-       return RetSS;
-}
-
-long ieee80211_translate_todbm(u8 signal_strength_index        )// 0-100 index.
-{
-       long    signal_power; // in dBm.
-
-       // Translate to dBm (x=0.5y-95).
-       signal_power = (long)((signal_strength_index + 1) >> 1);
-       signal_power -= 95;
-
-       return signal_power;
-}
-
-static inline int ieee80211_network_init(
-       struct ieee80211_device *ieee,
-       struct ieee80211_probe_response *beacon,
-       struct ieee80211_network *network,
-       struct ieee80211_rx_stats *stats)
-{
-        network->qos_data.active = 0;
-        network->qos_data.supported = 0;
-        network->qos_data.param_count = 0;
-        network->qos_data.old_param_count = 0;
-
-       /* Pull out fixed field data */
-       memcpy(network->bssid, beacon->header.addr3, ETH_ALEN);
-       network->capability = le16_to_cpu(beacon->capability);
-       network->last_scanned = jiffies;
-       network->time_stamp[0] = le32_to_cpu(beacon->time_stamp[0]);
-       network->time_stamp[1] = le32_to_cpu(beacon->time_stamp[1]);
-       network->beacon_interval = le32_to_cpu(beacon->beacon_interval);
-       /* Where to pull this? beacon->listen_interval;*/
-       network->listen_interval = 0x0A;
-       network->rates_len = network->rates_ex_len = 0;
-       network->last_associate = 0;
-       network->ssid_len = 0;
-       network->flags = 0;
-       network->atim_window = 0;
-       network->erp_value = (network->capability & WLAN_CAPABILITY_IBSS) ?
-            0x3 : 0x0;
-       network->berp_info_valid = false;
-        network->broadcom_cap_exist = false;
-       network->ralink_cap_exist = false;
-       network->atheros_cap_exist = false;
-       network->marvell_cap_exist = false;
-       network->cisco_cap_exist = false;
-       network->unknown_cap_exist = false;
-#ifdef THOMAS_TURBO
-       network->Turbo_Enable = 0;
-#endif
-#ifdef ENABLE_DOT11D
-       network->CountryIeLen = 0;
-       memset(network->CountryIeBuf, 0, MAX_IE_LEN);
-#endif
-//Initialize HT parameters
-       HTInitializeBssDesc(&network->bssht);
-       if (stats->freq == IEEE80211_52GHZ_BAND) {
-               /* for A band (No DS info) */
-               network->channel = stats->received_channel;
-       } else
-               network->flags |= NETWORK_HAS_CCK;
-
-       network->wpa_ie_len = 0;
-       network->rsn_ie_len = 0;
-
-        if (ieee80211_parse_info_param
-            (ieee,beacon->info_element, stats->len - sizeof(*beacon), network, stats))
-                return 1;
-
-       network->mode = 0;
-       if (stats->freq == IEEE80211_52GHZ_BAND)
-               network->mode = IEEE_A;
-       else {
-               if (network->flags & NETWORK_HAS_OFDM)
-                       network->mode |= IEEE_G;
-               if (network->flags & NETWORK_HAS_CCK)
-                       network->mode |= IEEE_B;
-       }
-
-       if (network->mode == 0) {
-               IEEE80211_DEBUG_SCAN("Filtered out '%s (%pM)' "
-                                    "network.\n",
-                                    escape_essid(network->ssid,
-                                                 network->ssid_len),
-                                    network->bssid);
-               return 1;
-       }
-
-       if(network->bssht.bdSupportHT){
-               if(network->mode == IEEE_A)
-                       network->mode = IEEE_N_5G;
-               else if(network->mode & (IEEE_G | IEEE_B))
-                       network->mode = IEEE_N_24G;
-       }
-       if (ieee80211_is_empty_essid(network->ssid, network->ssid_len))
-               network->flags |= NETWORK_EMPTY_ESSID;
-
-       stats->signal = 30 + (stats->SignalStrength * 70) / 100;
-       stats->noise = ieee80211_translate_todbm((u8)(100-stats->signal)) -25;
-
-       memcpy(&network->stats, stats, sizeof(network->stats));
-
-       return 0;
-}
-
-static inline int is_same_network(struct ieee80211_network *src,
-                                 struct ieee80211_network *dst, struct ieee80211_device* ieee)
-{
-       /* A network is only a duplicate if the channel, BSSID, ESSID
-        * and the capability field (in particular IBSS and BSS) all match.
-        * We treat all <hidden> with the same BSSID and channel
-        * as one network */
-       return (((src->ssid_len == dst->ssid_len) || (ieee->iw_mode == IW_MODE_INFRA)) &&
-               (src->channel == dst->channel) &&
-               !memcmp(src->bssid, dst->bssid, ETH_ALEN) &&
-               (!memcmp(src->ssid, dst->ssid, src->ssid_len) || (ieee->iw_mode == IW_MODE_INFRA)) &&
-               ((src->capability & WLAN_CAPABILITY_IBSS) ==
-               (dst->capability & WLAN_CAPABILITY_IBSS)) &&
-               ((src->capability & WLAN_CAPABILITY_BSS) ==
-               (dst->capability & WLAN_CAPABILITY_BSS)));
-}
-
-static inline void update_network(struct ieee80211_network *dst,
-                                 struct ieee80211_network *src)
-{
-       int qos_active;
-       u8 old_param;
-
-       memcpy(&dst->stats, &src->stats, sizeof(struct ieee80211_rx_stats));
-       dst->capability = src->capability;
-       memcpy(dst->rates, src->rates, src->rates_len);
-       dst->rates_len = src->rates_len;
-       memcpy(dst->rates_ex, src->rates_ex, src->rates_ex_len);
-       dst->rates_ex_len = src->rates_ex_len;
-       if(src->ssid_len > 0)
-       {
-               memset(dst->ssid, 0, dst->ssid_len);
-               dst->ssid_len = src->ssid_len;
-               memcpy(dst->ssid, src->ssid, src->ssid_len);
-       }
-       dst->mode = src->mode;
-       dst->flags = src->flags;
-       dst->time_stamp[0] = src->time_stamp[0];
-       dst->time_stamp[1] = src->time_stamp[1];
-       if (src->flags & NETWORK_HAS_ERP_VALUE)
-       {
-               dst->erp_value = src->erp_value;
-               dst->berp_info_valid = src->berp_info_valid = true;
-       }
-       dst->beacon_interval = src->beacon_interval;
-       dst->listen_interval = src->listen_interval;
-       dst->atim_window = src->atim_window;
-       dst->dtim_period = src->dtim_period;
-       dst->dtim_data = src->dtim_data;
-       dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0];
-       dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1];
-       memcpy(&dst->tim, &src->tim, sizeof(struct ieee80211_tim_parameters));
-
-        dst->bssht.bdSupportHT = src->bssht.bdSupportHT;
-       dst->bssht.bdRT2RTAggregation = src->bssht.bdRT2RTAggregation;
-       dst->bssht.bdHTCapLen= src->bssht.bdHTCapLen;
-       memcpy(dst->bssht.bdHTCapBuf,src->bssht.bdHTCapBuf,src->bssht.bdHTCapLen);
-       dst->bssht.bdHTInfoLen= src->bssht.bdHTInfoLen;
-       memcpy(dst->bssht.bdHTInfoBuf,src->bssht.bdHTInfoBuf,src->bssht.bdHTInfoLen);
-       dst->bssht.bdHTSpecVer = src->bssht.bdHTSpecVer;
-       dst->bssht.bdRT2RTLongSlotTime = src->bssht.bdRT2RTLongSlotTime;
-       dst->broadcom_cap_exist = src->broadcom_cap_exist;
-       dst->ralink_cap_exist = src->ralink_cap_exist;
-       dst->atheros_cap_exist = src->atheros_cap_exist;
-       dst->marvell_cap_exist = src->marvell_cap_exist;
-       dst->cisco_cap_exist = src->cisco_cap_exist;
-       dst->unknown_cap_exist = src->unknown_cap_exist;
-       memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len);
-       dst->wpa_ie_len = src->wpa_ie_len;
-       memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len);
-       dst->rsn_ie_len = src->rsn_ie_len;
-
-       dst->last_scanned = jiffies;
-       /* qos related parameters */
-       qos_active = dst->qos_data.active;
-       old_param = dst->qos_data.param_count;
-       if(dst->flags & NETWORK_HAS_QOS_MASK){
-        //not update QOS paramter in beacon, as most AP will set all these parameter to 0.//WB
-       }
-       else {
-               dst->qos_data.supported = src->qos_data.supported;
-               dst->qos_data.param_count = src->qos_data.param_count;
-       }
-
-       if(dst->qos_data.supported == 1) {
-               dst->QoS_Enable = 1;
-               if(dst->ssid_len)
-                       IEEE80211_DEBUG_QOS
-                               ("QoS the network %s is QoS supported\n",
-                               dst->ssid);
-               else
-                       IEEE80211_DEBUG_QOS
-                               ("QoS the network is QoS supported\n");
-       }
-       dst->qos_data.active = qos_active;
-       dst->qos_data.old_param_count = old_param;
-
-       /* dst->last_associate is not overwritten */
-       dst->wmm_info = src->wmm_info; //sure to exist in beacon or probe response frame.
-       if(src->wmm_param[0].ac_aci_acm_aifsn|| \
-          src->wmm_param[1].ac_aci_acm_aifsn|| \
-          src->wmm_param[2].ac_aci_acm_aifsn|| \
-          src->wmm_param[3].ac_aci_acm_aifsn) {
-         memcpy(dst->wmm_param, src->wmm_param, WME_AC_PRAM_LEN);
-       }
-#ifdef THOMAS_TURBO
-       dst->Turbo_Enable = src->Turbo_Enable;
-#endif
-
-#ifdef ENABLE_DOT11D
-       dst->CountryIeLen = src->CountryIeLen;
-       memcpy(dst->CountryIeBuf, src->CountryIeBuf, src->CountryIeLen);
-#endif
-
-       //added by amy for LEAP
-       dst->bWithAironetIE = src->bWithAironetIE;
-       dst->bCkipSupported = src->bCkipSupported;
-       memcpy(dst->CcxRmState,src->CcxRmState,2);
-       dst->bCcxRmEnable = src->bCcxRmEnable;
-       dst->MBssidMask = src->MBssidMask;
-       dst->bMBssidValid = src->bMBssidValid;
-       memcpy(dst->MBssid,src->MBssid,6);
-       dst->bWithCcxVerNum = src->bWithCcxVerNum;
-       dst->BssCcxVerNumber = src->BssCcxVerNumber;
-
-}
-
-static inline int is_beacon(__le16 fc)
-{
-       return (WLAN_FC_GET_STYPE(le16_to_cpu(fc)) == IEEE80211_STYPE_BEACON);
-}
-
-static inline void ieee80211_process_probe_response(
-       struct ieee80211_device *ieee,
-       struct ieee80211_probe_response *beacon,
-       struct ieee80211_rx_stats *stats)
-{
-       struct ieee80211_network network;
-       struct ieee80211_network *target;
-       struct ieee80211_network *oldest = NULL;
-#ifdef CONFIG_IEEE80211_DEBUG
-       struct ieee80211_info_element *info_element = &beacon->info_element[0];
-#endif
-       unsigned long flags;
-       short renew;
-
-       memset(&network, 0, sizeof(struct ieee80211_network));
-       IEEE80211_DEBUG_SCAN(
-               "'%s' (%pM): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
-               escape_essid(info_element->data, info_element->len),
-               beacon->header.addr3,
-               (beacon->capability & (1<<0xf)) ? '1' : '0',
-               (beacon->capability & (1<<0xe)) ? '1' : '0',
-               (beacon->capability & (1<<0xd)) ? '1' : '0',
-               (beacon->capability & (1<<0xc)) ? '1' : '0',
-               (beacon->capability & (1<<0xb)) ? '1' : '0',
-               (beacon->capability & (1<<0xa)) ? '1' : '0',
-               (beacon->capability & (1<<0x9)) ? '1' : '0',
-               (beacon->capability & (1<<0x8)) ? '1' : '0',
-               (beacon->capability & (1<<0x7)) ? '1' : '0',
-               (beacon->capability & (1<<0x6)) ? '1' : '0',
-               (beacon->capability & (1<<0x5)) ? '1' : '0',
-               (beacon->capability & (1<<0x4)) ? '1' : '0',
-               (beacon->capability & (1<<0x3)) ? '1' : '0',
-               (beacon->capability & (1<<0x2)) ? '1' : '0',
-               (beacon->capability & (1<<0x1)) ? '1' : '0',
-               (beacon->capability & (1<<0x0)) ? '1' : '0');
-
-       if (ieee80211_network_init(ieee, beacon, &network, stats)) {
-               IEEE80211_DEBUG_SCAN("Dropped '%s' (%pM) via %s.\n",
-                                    escape_essid(info_element->data,
-                                                 info_element->len),
-                                    beacon->header.addr3,
-                                    WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
-                                    IEEE80211_STYPE_PROBE_RESP ?
-                                    "PROBE RESPONSE" : "BEACON");
-               return;
-       }
-
-#ifdef ENABLE_DOT11D
-       // For Asus EeePc request,
-       // (1) if wireless adapter receive get any 802.11d country code in AP beacon,
-       //         wireless adapter should follow the country code.
-       // (2)  If there is no any country code in beacon,
-       //       then wireless adapter should do active scan from ch1~11 and
-       //       passive scan from ch12~14
-
-       if( !IsLegalChannel(ieee, network.channel) )
-               return;
-       if(ieee->bGlobalDomain)
-       {
-               if (WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == IEEE80211_STYPE_PROBE_RESP)
-               {
-                       // Case 1: Country code
-                       if(IS_COUNTRY_IE_VALID(ieee) )
-                       {
-                               if( !IsLegalChannel(ieee, network.channel) )
-                               {
-                                       printk("GetScanInfo(): For Country code, filter probe response at channel(%d).\n", network.channel);
-                                       return;
-                               }
-                       }
-                       // Case 2: No any country code.
-                       else
-                       {
-                               // Filter over channel ch12~14
-                               if(network.channel > 11)
-                               {
-                                       printk("GetScanInfo(): For Global Domain, filter probe response at channel(%d).\n", network.channel);
-                                       return;
-                               }
-                       }
-               }
-               else
-               {
-                       // Case 1: Country code
-                       if(IS_COUNTRY_IE_VALID(ieee) )
-                       {
-                               if( !IsLegalChannel(ieee, network.channel) )
-                               {
-                                       printk("GetScanInfo(): For Country code, filter beacon at channel(%d).\n",network.channel);
-                                       return;
-                               }
-                       }
-                       // Case 2: No any country code.
-                       else
-                       {
-                               // Filter over channel ch12~14
-                               if(network.channel > 14)
-                               {
-                                       printk("GetScanInfo(): For Global Domain, filter beacon at channel(%d).\n",network.channel);
-                                       return;
-                               }
-                       }
-               }
-       }
-#endif
-
-       /* The network parsed correctly -- so now we scan our known networks
-        * to see if we can find it in our list.
-        *
-        * NOTE:  This search is definitely not optimized.  Once its doing
-        *        the "right thing" we'll optimize it for efficiency if
-        *        necessary */
-
-       /* Search for this entry in the list and update it if it is
-        * already there. */
-
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if(is_same_network(&ieee->current_network, &network, ieee)) {
-               update_network(&ieee->current_network, &network);
-               if((ieee->current_network.mode == IEEE_N_24G || ieee->current_network.mode == IEEE_G)
-               && ieee->current_network.berp_info_valid){
-               if(ieee->current_network.erp_value& ERP_UseProtection)
-                       ieee->current_network.buseprotection = true;
-               else
-                       ieee->current_network.buseprotection = false;
-               }
-               if(is_beacon(beacon->header.frame_ctl))
-               {
-                       if(ieee->state == IEEE80211_LINKED)
-                               ieee->LinkDetectInfo.NumRecvBcnInPeriod++;
-               }
-               else //hidden AP
-                       network.flags = (~NETWORK_EMPTY_ESSID & network.flags)|(NETWORK_EMPTY_ESSID & ieee->current_network.flags);
-       }
-
-       list_for_each_entry(target, &ieee->network_list, list) {
-               if (is_same_network(target, &network, ieee))
-                       break;
-               if ((oldest == NULL) ||
-                   (target->last_scanned < oldest->last_scanned))
-                       oldest = target;
-       }
-
-       /* If we didn't find a match, then get a new network slot to initialize
-        * with this beacon's information */
-       if (&target->list == &ieee->network_list) {
-               if (list_empty(&ieee->network_free_list)) {
-                       /* If there are no more slots, expire the oldest */
-                       list_del(&oldest->list);
-                       target = oldest;
-                       IEEE80211_DEBUG_SCAN("Expired '%s' (%pM) from "
-                                            "network list.\n",
-                                            escape_essid(target->ssid,
-                                                         target->ssid_len),
-                                            target->bssid);
-               } else {
-                       /* Otherwise just pull from the free list */
-                       target = list_entry(ieee->network_free_list.next,
-                                           struct ieee80211_network, list);
-                       list_del(ieee->network_free_list.next);
-               }
-
-
-#ifdef CONFIG_IEEE80211_DEBUG
-               IEEE80211_DEBUG_SCAN("Adding '%s' (%pM) via %s.\n",
-                                    escape_essid(network.ssid,
-                                                 network.ssid_len),
-                                    network.bssid,
-                                    WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
-                                    IEEE80211_STYPE_PROBE_RESP ?
-                                    "PROBE RESPONSE" : "BEACON");
-#endif
-               memcpy(target, &network, sizeof(*target));
-               list_add_tail(&target->list, &ieee->network_list);
-       } else {
-               IEEE80211_DEBUG_SCAN("Updating '%s' (%pM) via %s.\n",
-                                    escape_essid(target->ssid,
-                                                 target->ssid_len),
-                                    target->bssid,
-                                    WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
-                                    IEEE80211_STYPE_PROBE_RESP ?
-                                    "PROBE RESPONSE" : "BEACON");
-
-               /* we have an entry and we are going to update it. But this entry may
-                * be already expired. In this case we do the same as we found a new
-                * net and call the new_net handler
-                */
-               renew = !time_after(target->last_scanned + ieee->scan_age, jiffies);
-               //YJ,add,080819,for hidden ap
-               if(is_beacon(beacon->header.frame_ctl) == 0)
-                       network.flags = (~NETWORK_EMPTY_ESSID & network.flags)|(NETWORK_EMPTY_ESSID & target->flags);
-               if(((network.flags & NETWORK_EMPTY_ESSID) == NETWORK_EMPTY_ESSID) \
-                   && (((network.ssid_len > 0) && (strncmp(target->ssid, network.ssid, network.ssid_len)))\
-                   ||((ieee->current_network.ssid_len == network.ssid_len)&&(strncmp(ieee->current_network.ssid, network.ssid, network.ssid_len) == 0)&&(ieee->state == IEEE80211_NOLINK))))
-                       renew = 1;
-               //YJ,add,080819,for hidden ap,end
-
-               update_network(target, &network);
-       }
-
-       spin_unlock_irqrestore(&ieee->lock, flags);
-       if (is_beacon(beacon->header.frame_ctl)&&is_same_network(&ieee->current_network, &network, ieee)&&\
-               (ieee->state == IEEE80211_LINKED)) {
-               if(ieee->handle_beacon != NULL) {
-                       ieee->handle_beacon(ieee, beacon, &ieee->current_network);
-               }
-       }
-}
-
-void ieee80211_rx_mgt(struct ieee80211_device *ieee,
-                     struct ieee80211_hdr_4addr *header,
-                     struct ieee80211_rx_stats *stats)
-{
-       if(WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_PROBE_RESP &&
-               WLAN_FC_GET_STYPE(header->frame_ctl) != IEEE80211_STYPE_BEACON)
-               ieee->last_rx_ps_time = jiffies;
-
-       switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
-
-       case IEEE80211_STYPE_BEACON:
-               IEEE80211_DEBUG_MGMT("received BEACON (%d)\n",
-                                    WLAN_FC_GET_STYPE(header->frame_ctl));
-               IEEE80211_DEBUG_SCAN("Beacon\n");
-               ieee80211_process_probe_response(
-                       ieee, (struct ieee80211_probe_response *)header, stats);
-
-               if(ieee->sta_sleep || (ieee->ps != IEEE80211_PS_DISABLED &&
-                                       ieee->iw_mode == IW_MODE_INFRA &&
-                                       ieee->state == IEEE80211_LINKED))
-               {
-                       tasklet_schedule(&ieee->ps_task);
-               }
-
-               break;
-
-       case IEEE80211_STYPE_PROBE_RESP:
-               IEEE80211_DEBUG_MGMT("received PROBE RESPONSE (%d)\n",
-                                    WLAN_FC_GET_STYPE(header->frame_ctl));
-               IEEE80211_DEBUG_SCAN("Probe response\n");
-               ieee80211_process_probe_response(
-                       ieee, (struct ieee80211_probe_response *)header, stats);
-               break;
-
-       }
-}
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac.c
deleted file mode 100644 (file)
index 60e9a09..0000000
+++ /dev/null
@@ -1,3278 +0,0 @@
-/* IEEE 802.11 SoftMAC layer
- * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
- *
- * Mostly extracted from the rtl8180-sa2400 driver for the
- * in-kernel generic ieee802.11 stack.
- *
- * Few lines might be stolen from other part of the ieee80211
- * stack. Copyright who own it's copyright
- *
- * WPA code stolen from the ipw2200 driver.
- * Copyright who own it's copyright.
- *
- * released under the GPL
- */
-
-
-#include "ieee80211.h"
-
-#include <linux/random.h>
-#include <linux/delay.h>
-#include <linux/slab.h>
-#include <asm/uaccess.h>
-#ifdef ENABLE_DOT11D
-#include "dot11d.h"
-#endif
-
-u8 rsn_authen_cipher_suite[16][4] = {
-       {0x00,0x0F,0xAC,0x00}, //Use group key, //Reserved
-       {0x00,0x0F,0xAC,0x01}, //WEP-40         //RSNA default
-       {0x00,0x0F,0xAC,0x02}, //TKIP           //NONE          //{used just as default}
-       {0x00,0x0F,0xAC,0x03}, //WRAP-historical
-       {0x00,0x0F,0xAC,0x04}, //CCMP
-       {0x00,0x0F,0xAC,0x05}, //WEP-104
-};
-
-short ieee80211_is_54g(struct ieee80211_network net)
-{
-       return ((net.rates_ex_len > 0) || (net.rates_len > 4));
-}
-
-short ieee80211_is_shortslot(struct ieee80211_network net)
-{
-       return (net.capability & WLAN_CAPABILITY_SHORT_SLOT);
-}
-
-/* returns the total length needed for pleacing the RATE MFIE
- * tag and the EXTENDED RATE MFIE tag if needed.
- * It encludes two bytes per tag for the tag itself and its len
- */
-unsigned int ieee80211_MFIE_rate_len(struct ieee80211_device *ieee)
-{
-       unsigned int rate_len = 0;
-
-       if (ieee->modulation & IEEE80211_CCK_MODULATION)
-               rate_len = IEEE80211_CCK_RATE_LEN + 2;
-
-       if (ieee->modulation & IEEE80211_OFDM_MODULATION)
-
-               rate_len += IEEE80211_OFDM_RATE_LEN + 2;
-
-       return rate_len;
-}
-
-/* pleace the MFIE rate, tag to the memory (double) poined.
- * Then it updates the pointer so that
- * it points after the new MFIE tag added.
- */
-void ieee80211_MFIE_Brate(struct ieee80211_device *ieee, u8 **tag_p)
-{
-       u8 *tag = *tag_p;
-
-       if (ieee->modulation & IEEE80211_CCK_MODULATION){
-               *tag++ = MFIE_TYPE_RATES;
-               *tag++ = 4;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB;
-       }
-
-       /* We may add an option for custom rates that specific HW might support */
-       *tag_p = tag;
-}
-
-void ieee80211_MFIE_Grate(struct ieee80211_device *ieee, u8 **tag_p)
-{
-       u8 *tag = *tag_p;
-
-               if (ieee->modulation & IEEE80211_OFDM_MODULATION){
-
-               *tag++ = MFIE_TYPE_RATES_EX;
-               *tag++ = 8;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_18MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_24MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB;
-               *tag++ = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB;
-
-       }
-
-       /* We may add an option for custom rates that specific HW might support */
-       *tag_p = tag;
-}
-
-
-void ieee80211_WMM_Info(struct ieee80211_device *ieee, u8 **tag_p) {
-       u8 *tag = *tag_p;
-
-       *tag++ = MFIE_TYPE_GENERIC; //0
-       *tag++ = 7;
-       *tag++ = 0x00;
-       *tag++ = 0x50;
-       *tag++ = 0xf2;
-       *tag++ = 0x02;//5
-       *tag++ = 0x00;
-       *tag++ = 0x01;
-#ifdef SUPPORT_USPD
-       if(ieee->current_network.wmm_info & 0x80) {
-               *tag++ = 0x0f|MAX_SP_Len;
-       } else {
-               *tag++ = MAX_SP_Len;
-       }
-#else
-       *tag++ = MAX_SP_Len;
-#endif
-       *tag_p = tag;
-}
-
-#ifdef THOMAS_TURBO
-void ieee80211_TURBO_Info(struct ieee80211_device *ieee, u8 **tag_p) {
-       u8 *tag = *tag_p;
-
-        *tag++ = MFIE_TYPE_GENERIC; //0
-        *tag++ = 7;
-        *tag++ = 0x00;
-        *tag++ = 0xe0;
-        *tag++ = 0x4c;
-        *tag++ = 0x01;//5
-        *tag++ = 0x02;
-        *tag++ = 0x11;
-       *tag++ = 0x00;
-
-       *tag_p = tag;
-       printk(KERN_ALERT "This is enable turbo mode IE process\n");
-}
-#endif
-
-void enqueue_mgmt(struct ieee80211_device *ieee, struct sk_buff *skb)
-{
-       int nh;
-       nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM;
-
-/*
- * if the queue is full but we have newer frames then
- * just overwrites the oldest.
- *
- * if (nh == ieee->mgmt_queue_tail)
- *             return -1;
- */
-       ieee->mgmt_queue_head = nh;
-       ieee->mgmt_queue_ring[nh] = skb;
-}
-
-struct sk_buff *dequeue_mgmt(struct ieee80211_device *ieee)
-{
-       struct sk_buff *ret;
-
-       if(ieee->mgmt_queue_tail == ieee->mgmt_queue_head)
-               return NULL;
-
-       ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail];
-
-       ieee->mgmt_queue_tail =
-               (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM;
-
-       return ret;
-}
-
-void init_mgmt_queue(struct ieee80211_device *ieee)
-{
-       ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0;
-}
-
-u8 MgntQuery_MgntFrameTxRate(struct ieee80211_device *ieee)
-{
-       PRT_HIGH_THROUGHPUT      pHTInfo = ieee->pHTInfo;
-       u8 rate;
-
-       // 2008/01/25 MH For broadcom, MGNT frame set as OFDM 6M.
-       if(pHTInfo->IOTAction & HT_IOT_ACT_MGNT_USE_CCK_6M)
-               rate = 0x0c;
-       else
-               rate = ieee->basic_rate & 0x7f;
-
-       if(rate == 0){
-               // 2005.01.26, by rcnjko.
-               if(ieee->mode == IEEE_A||
-                  ieee->mode== IEEE_N_5G||
-                  (ieee->mode== IEEE_N_24G&&!pHTInfo->bCurSuppCCK))
-                       rate = 0x0c;
-               else
-                       rate = 0x02;
-       }
-
-       return rate;
-}
-
-
-void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl);
-
-inline void softmac_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee)
-{
-       unsigned long flags;
-       short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
-       struct ieee80211_hdr_3addr  *header=
-               (struct ieee80211_hdr_3addr  *) skb->data;
-
-       cb_desc *tcb_desc = (cb_desc *)(skb->cb + 8);
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       /* called with 2nd param 0, no mgmt lock required */
-       ieee80211_sta_wakeup(ieee,0);
-
-       tcb_desc->queue_index = MGNT_QUEUE;
-       tcb_desc->data_rate = MgntQuery_MgntFrameTxRate(ieee);
-        tcb_desc->RATRIndex = 7;
-        tcb_desc->bTxDisableRateFallBack = 1;
-        tcb_desc->bTxUseDriverAssingedRate = 1;
-
-       if(single){
-               if(ieee->queue_stop){
-                       enqueue_mgmt(ieee,skb);
-               }else{
-                       header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4);
-
-                       if (ieee->seq_ctrl[0] == 0xFFF)
-                               ieee->seq_ctrl[0] = 0;
-                       else
-                               ieee->seq_ctrl[0]++;
-
-                       /* avoid watchdog triggers */
-                       ieee->softmac_data_hard_start_xmit(skb, ieee, ieee->basic_rate);
-               }
-
-               spin_unlock_irqrestore(&ieee->lock, flags);
-       }else{
-               spin_unlock_irqrestore(&ieee->lock, flags);
-               spin_lock(&ieee->mgmt_tx_lock);
-
-               header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-
-               if (ieee->seq_ctrl[0] == 0xFFF)
-                       ieee->seq_ctrl[0] = 0;
-               else
-                       ieee->seq_ctrl[0]++;
-
-               /* check wether the managed packet queued greater than 5 */
-               if(!ieee->check_nic_enough_desc(ieee, tcb_desc->queue_index)||
-                               (skb_queue_len(&ieee->skb_waitQ[tcb_desc->queue_index]) != 0)||
-                               (ieee->queue_stop) ) {
-                       /* insert the skb packet to the management queue */
-                       /* as for the completion function, it does not need
-                        * to check it any more.
-                        * */
-                       skb_queue_tail(&ieee->skb_waitQ[tcb_desc->queue_index], skb);
-               } else {
-                       ieee->softmac_hard_start_xmit(skb, ieee);
-               }
-               spin_unlock(&ieee->mgmt_tx_lock);
-       }
-}
-
-inline void softmac_ps_mgmt_xmit(struct sk_buff *skb, struct ieee80211_device *ieee)
-{
-
-       short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
-       struct ieee80211_hdr_3addr  *header =
-               (struct ieee80211_hdr_3addr  *) skb->data;
-        cb_desc *tcb_desc = (cb_desc *)(skb->cb + 8);
-
-       tcb_desc->queue_index = MGNT_QUEUE;
-       tcb_desc->data_rate = MgntQuery_MgntFrameTxRate(ieee);
-       tcb_desc->RATRIndex = 7;
-       tcb_desc->bTxDisableRateFallBack = 1;
-       tcb_desc->bTxUseDriverAssingedRate = 1;
-       if(single){
-
-               header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-
-               if (ieee->seq_ctrl[0] == 0xFFF)
-                       ieee->seq_ctrl[0] = 0;
-               else
-                       ieee->seq_ctrl[0]++;
-
-               /* avoid watchdog triggers */
-               ieee->softmac_data_hard_start_xmit(skb, ieee, ieee->basic_rate);
-
-       }else{
-
-               header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-
-               if (ieee->seq_ctrl[0] == 0xFFF)
-                       ieee->seq_ctrl[0] = 0;
-               else
-                       ieee->seq_ctrl[0]++;
-
-               ieee->softmac_hard_start_xmit(skb, ieee);
-
-       }
-}
-
-inline struct sk_buff *ieee80211_probe_req(struct ieee80211_device *ieee)
-{
-       unsigned int len,rate_len;
-       u8 *tag;
-       struct sk_buff *skb;
-       struct ieee80211_probe_request *req;
-
-       len = ieee->current_network.ssid_len;
-
-       rate_len = ieee80211_MFIE_rate_len(ieee);
-
-       skb = dev_alloc_skb(sizeof(struct ieee80211_probe_request) +
-                           2 + len + rate_len + ieee->tx_headroom);
-       if (!skb)
-               return NULL;
-
-       skb_reserve(skb, ieee->tx_headroom);
-
-       req = (struct ieee80211_probe_request *) skb_put(skb,sizeof(struct ieee80211_probe_request));
-       req->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_REQ);
-       req->header.duration_id = 0; //FIXME: is this OK ?
-
-       memset(req->header.addr1, 0xff, ETH_ALEN);
-       memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memset(req->header.addr3, 0xff, ETH_ALEN);
-
-       tag = (u8 *) skb_put(skb,len+2+rate_len);
-
-       *tag++ = MFIE_TYPE_SSID;
-       *tag++ = len;
-       memcpy(tag, ieee->current_network.ssid, len);
-       tag += len;
-
-       ieee80211_MFIE_Brate(ieee,&tag);
-       ieee80211_MFIE_Grate(ieee,&tag);
-       return skb;
-}
-
-struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee);
-void ieee80211_send_beacon(struct ieee80211_device *ieee)
-{
-       struct sk_buff *skb;
-       if(!ieee->ieee_up)
-               return;
-
-       skb = ieee80211_get_beacon_(ieee);
-
-       if (skb){
-               softmac_mgmt_xmit(skb, ieee);
-               ieee->softmac_stats.tx_beacons++;
-       }
-
-       if(ieee->beacon_txing && ieee->ieee_up){
-               mod_timer(&ieee->beacon_timer,jiffies+(MSECS(ieee->current_network.beacon_interval-5)));
-       }
-}
-
-
-void ieee80211_send_beacon_cb(unsigned long _ieee)
-{
-       struct ieee80211_device *ieee =
-               (struct ieee80211_device *) _ieee;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ieee->beacon_lock, flags);
-       ieee80211_send_beacon(ieee);
-       spin_unlock_irqrestore(&ieee->beacon_lock, flags);
-}
-
-
-void ieee80211_send_probe(struct ieee80211_device *ieee)
-{
-       struct sk_buff *skb;
-
-       skb = ieee80211_probe_req(ieee);
-       if (skb){
-               softmac_mgmt_xmit(skb, ieee);
-               ieee->softmac_stats.tx_probe_rq++;
-       }
-}
-
-void ieee80211_send_probe_requests(struct ieee80211_device *ieee)
-{
-       if (ieee->active_scan && (ieee->softmac_features & IEEE_SOFTMAC_PROBERQ)){
-               ieee80211_send_probe(ieee);
-               ieee80211_send_probe(ieee);
-       }
-}
-
-/* this performs syncro scan blocking the caller until all channels
- * in the allowed channel map has been checked.
- */
-void ieee80211_softmac_scan_syncro(struct ieee80211_device *ieee)
-{
-       short ch = 0;
-#ifdef ENABLE_DOT11D
-       u8 channel_map[MAX_CHANNEL_NUMBER+1];
-       memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1);
-#endif
-       down(&ieee->scan_sem);
-
-       while(1)
-       {
-
-               do{
-                       ch++;
-                       if (ch > MAX_CHANNEL_NUMBER)
-                               goto out; /* scan completed */
-#ifdef ENABLE_DOT11D
-               }while(!channel_map[ch]);
-#else
-               }while(!ieee->channel_map[ch]);
-#endif
-
-               /* this function can be called in two situations
-                * 1- We have switched to ad-hoc mode and we are
-                *    performing a complete syncro scan before conclude
-                *    there are no interesting cell and to create a
-                *    new one. In this case the link state is
-                *    IEEE80211_NOLINK until we found an interesting cell.
-                *    If so the ieee8021_new_net, called by the RX path
-                *    will set the state to IEEE80211_LINKED, so we stop
-                *    scanning
-                * 2- We are linked and the root uses run iwlist scan.
-                *    So we switch to IEEE80211_LINKED_SCANNING to remember
-                *    that we are still logically linked (not interested in
-                *    new network events, despite for updating the net list,
-                *    but we are temporarly 'unlinked' as the driver shall
-                *    not filter RX frames and the channel is changing.
-                * So the only situation in witch are interested is to check
-                * if the state become LINKED because of the #1 situation
-                */
-
-               if (ieee->state == IEEE80211_LINKED)
-                       goto out;
-               ieee->set_chan(ieee, ch);
-#ifdef ENABLE_DOT11D
-               if(channel_map[ch] == 1)
-#endif
-               ieee80211_send_probe_requests(ieee);
-
-               /* this prevent excessive time wait when we
-                * need to wait for a syncro scan to end..
-                */
-               if(ieee->state < IEEE80211_LINKED)
-                       ;
-               else
-               if (ieee->sync_scan_hurryup)
-                       goto out;
-
-
-               msleep_interruptible_rsl(IEEE80211_SOFTMAC_SCAN_TIME);
-
-       }
-out:
-       if(ieee->state < IEEE80211_LINKED){
-               ieee->actscanning = false;
-               up(&ieee->scan_sem);
-       }
-       else{
-       ieee->sync_scan_hurryup = 0;
-#ifdef ENABLE_DOT11D
-       if(IS_DOT11D_ENABLE(ieee))
-               DOT11D_ScanComplete(ieee);
-#endif
-       up(&ieee->scan_sem);
-}
-}
-
-
-void ieee80211_softmac_scan_wq(struct work_struct *work)
-{
-        struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-        struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, softmac_scan_wq);
-       static short watchdog = 0;
-       u8 last_channel = ieee->current_network.channel;
-#ifdef ENABLE_DOT11D
-       u8 channel_map[MAX_CHANNEL_NUMBER+1];
-       memcpy(channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1);
-#endif
-       if(!ieee->ieee_up)
-               return;
-       down(&ieee->scan_sem);
-       do{
-               ieee->current_network.channel =
-                       (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER;
-               if (watchdog++ > MAX_CHANNEL_NUMBER) {
-                       /* if current channel is not in channel map, set to default channel. */
-#ifdef ENABLE_DOT11D
-                       if (!channel_map[ieee->current_network.channel]) {
-#else
-                       if (!ieee->channel_map[ieee->current_network.channel]) {
-#endif
-                               ieee->current_network.channel = 6;
-                               goto out; /* no good chans */
-                       }
-               }
-#ifdef ENABLE_DOT11D
-        }while(!channel_map[ieee->current_network.channel]);
-#else
-       }while(!ieee->channel_map[ieee->current_network.channel]);
-#endif
-       if (ieee->scanning == 0 )
-               goto out;
-       ieee->set_chan(ieee, ieee->current_network.channel);
-#ifdef ENABLE_DOT11D
-       if(channel_map[ieee->current_network.channel] == 1)
-#endif
-       ieee80211_send_probe_requests(ieee);
-
-
-       queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, IEEE80211_SOFTMAC_SCAN_TIME);
-
-       up(&ieee->scan_sem);
-       return;
-out:
-#ifdef ENABLE_DOT11D
-       if(IS_DOT11D_ENABLE(ieee))
-               DOT11D_ScanComplete(ieee);
-#endif
-       ieee->current_network.channel = last_channel;
-        ieee->actscanning = false;
-       watchdog = 0;
-       ieee->scanning = 0;
-       up(&ieee->scan_sem);
-}
-
-void ieee80211_beacons_start(struct ieee80211_device *ieee)
-{
-       unsigned long flags;
-       spin_lock_irqsave(&ieee->beacon_lock,flags);
-
-       ieee->beacon_txing = 1;
-       ieee80211_send_beacon(ieee);
-
-       spin_unlock_irqrestore(&ieee->beacon_lock,flags);
-}
-
-void ieee80211_beacons_stop(struct ieee80211_device *ieee)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ieee->beacon_lock,flags);
-
-       ieee->beacon_txing = 0;
-       del_timer_sync(&ieee->beacon_timer);
-
-       spin_unlock_irqrestore(&ieee->beacon_lock,flags);
-
-}
-
-
-void ieee80211_stop_send_beacons(struct ieee80211_device *ieee)
-{
-       if(ieee->stop_send_beacons)
-               ieee->stop_send_beacons(ieee);
-       if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS)
-               ieee80211_beacons_stop(ieee);
-}
-
-
-void ieee80211_start_send_beacons(struct ieee80211_device *ieee)
-{
-       if(ieee->start_send_beacons)
-               ieee->start_send_beacons(ieee);
-       if(ieee->softmac_features & IEEE_SOFTMAC_BEACONS)
-               ieee80211_beacons_start(ieee);
-}
-
-
-void ieee80211_softmac_stop_scan(struct ieee80211_device *ieee)
-{
-       down(&ieee->scan_sem);
-
-       if (ieee->scanning == 1){
-               ieee->scanning = 0;
-
-               cancel_delayed_work(&ieee->softmac_scan_wq);
-       }
-
-       up(&ieee->scan_sem);
-}
-
-void ieee80211_stop_scan(struct ieee80211_device *ieee)
-{
-       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN)
-               ieee80211_softmac_stop_scan(ieee);
-       else
-               ieee->stop_scan(ieee);
-}
-
-/* called with ieee->lock held */
-void ieee80211_rtl_start_scan(struct ieee80211_device *ieee)
-{
-#ifdef ENABLE_IPS
-       if(ieee->ieee80211_ips_leave_wq != NULL)
-               ieee->ieee80211_ips_leave_wq(ieee);
-#endif
-
-#ifdef ENABLE_DOT11D
-       if(IS_DOT11D_ENABLE(ieee) )
-       {
-               if(IS_COUNTRY_IE_VALID(ieee))
-               {
-                       RESET_CIE_WATCHDOG(ieee);
-               }
-       }
-#endif
-       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){
-               if (ieee->scanning == 0){
-                       ieee->scanning = 1;
-                       queue_delayed_work(ieee->wq, &ieee->softmac_scan_wq, 0);
-               }
-       }else
-               ieee->start_scan(ieee);
-
-}
-
-/* called with wx_sem held */
-void ieee80211_start_scan_syncro(struct ieee80211_device *ieee)
-{
-#ifdef ENABLE_DOT11D
-       if(IS_DOT11D_ENABLE(ieee) )
-       {
-               if(IS_COUNTRY_IE_VALID(ieee))
-               {
-                       RESET_CIE_WATCHDOG(ieee);
-               }
-       }
-#endif
-       ieee->sync_scan_hurryup = 0;
-       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN)
-               ieee80211_softmac_scan_syncro(ieee);
-       else
-               ieee->scan_syncro(ieee);
-
-}
-
-inline struct sk_buff *ieee80211_authentication_req(struct ieee80211_network *beacon,
-       struct ieee80211_device *ieee, int challengelen)
-{
-       struct sk_buff *skb;
-       struct ieee80211_authentication *auth;
-       int len = sizeof(struct ieee80211_authentication) + challengelen + ieee->tx_headroom;
-
-
-       skb = dev_alloc_skb(len);
-       if (!skb) return NULL;
-
-       skb_reserve(skb, ieee->tx_headroom);
-       auth = (struct ieee80211_authentication *)
-               skb_put(skb, sizeof(struct ieee80211_authentication));
-
-       auth->header.frame_ctl = IEEE80211_STYPE_AUTH;
-       if (challengelen) auth->header.frame_ctl |= IEEE80211_FCTL_WEP;
-
-       auth->header.duration_id = 0x013a; //FIXME
-
-       memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN);
-       memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN);
-
-       if(ieee->auth_mode == 0)
-               auth->algorithm = WLAN_AUTH_OPEN;
-       else if(ieee->auth_mode == 1)
-               auth->algorithm = WLAN_AUTH_SHARED_KEY;
-       else if(ieee->auth_mode == 2)
-               auth->algorithm = WLAN_AUTH_OPEN;//0x80;
-       printk("=================>%s():auth->algorithm is %d\n",__FUNCTION__,auth->algorithm);
-       auth->transaction = cpu_to_le16(ieee->associate_seq);
-       ieee->associate_seq++;
-
-       auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS);
-
-       return skb;
-
-}
-
-
-static struct sk_buff* ieee80211_probe_resp(struct ieee80211_device *ieee, u8 *dest)
-{
-       u8 *tag;
-       int beacon_size;
-       struct ieee80211_probe_response *beacon_buf;
-       struct sk_buff *skb = NULL;
-       int encrypt;
-       int atim_len,erp_len;
-       struct ieee80211_crypt_data* crypt;
-
-       char *ssid = ieee->current_network.ssid;
-       int ssid_len = ieee->current_network.ssid_len;
-       int rate_len = ieee->current_network.rates_len+2;
-       int rate_ex_len = ieee->current_network.rates_ex_len;
-       int wpa_ie_len = ieee->wpa_ie_len;
-       u8 erpinfo_content = 0;
-
-       u8* tmp_ht_cap_buf;
-       u8 tmp_ht_cap_len=0;
-       u8* tmp_ht_info_buf;
-       u8 tmp_ht_info_len=0;
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-       u8* tmp_generic_ie_buf=NULL;
-       u8 tmp_generic_ie_len=0;
-
-       if(rate_ex_len > 0) rate_ex_len+=2;
-
-       if(ieee->current_network.capability & WLAN_CAPABILITY_IBSS)
-               atim_len = 4;
-       else
-               atim_len = 0;
-
-       if(ieee80211_is_54g(ieee->current_network))
-               erp_len = 3;
-       else
-               erp_len = 0;
-
-       crypt = ieee->crypt[ieee->tx_keyidx];
-
-
-       encrypt = ieee->host_encrypt && crypt && crypt->ops &&
-               ((0 == strcmp(crypt->ops->name, "WEP") || wpa_ie_len));
-       //HT ralated element
-
-       tmp_ht_cap_buf =(u8*) &(ieee->pHTInfo->SelfHTCap);
-       tmp_ht_cap_len = sizeof(ieee->pHTInfo->SelfHTCap);
-       tmp_ht_info_buf =(u8*) &(ieee->pHTInfo->SelfHTInfo);
-       tmp_ht_info_len = sizeof(ieee->pHTInfo->SelfHTInfo);
-       HTConstructCapabilityElement(ieee, tmp_ht_cap_buf, &tmp_ht_cap_len,encrypt);
-       HTConstructInfoElement(ieee,tmp_ht_info_buf,&tmp_ht_info_len, encrypt);
-
-
-        if(pHTInfo->bRegRT2RTAggregation)
-        {
-               tmp_generic_ie_buf = ieee->pHTInfo->szRT2RTAggBuffer;
-               tmp_generic_ie_len = sizeof(ieee->pHTInfo->szRT2RTAggBuffer);
-               HTConstructRT2RTAggElement(ieee, tmp_generic_ie_buf, &tmp_generic_ie_len);
-        }
-
-       beacon_size = sizeof(struct ieee80211_probe_response)+2+
-               ssid_len
-               +3 //channel
-               +rate_len
-               +rate_ex_len
-               +atim_len
-               +erp_len
-                +wpa_ie_len
-               +ieee->tx_headroom;
-       skb = dev_alloc_skb(beacon_size);
-       if (!skb)
-               return NULL;
-       skb_reserve(skb, ieee->tx_headroom);
-       beacon_buf = (struct ieee80211_probe_response*) skb_put(skb, (beacon_size - ieee->tx_headroom));
-       memcpy (beacon_buf->header.addr1, dest,ETH_ALEN);
-       memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN);
-
-       beacon_buf->header.duration_id = 0; //FIXME
-       beacon_buf->beacon_interval =
-               cpu_to_le16(ieee->current_network.beacon_interval);
-       beacon_buf->capability =
-               cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS);
-       beacon_buf->capability |=
-               cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE); //add short preamble here
-
-       if(ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT))
-               beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
-
-       crypt = ieee->crypt[ieee->tx_keyidx];
-       if (encrypt)
-               beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-
-
-       beacon_buf->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_PROBE_RESP);
-       beacon_buf->info_element[0].id = MFIE_TYPE_SSID;
-       beacon_buf->info_element[0].len = ssid_len;
-
-       tag = (u8*) beacon_buf->info_element[0].data;
-
-       memcpy(tag, ssid, ssid_len);
-
-       tag += ssid_len;
-
-       *(tag++) = MFIE_TYPE_RATES;
-       *(tag++) = rate_len-2;
-       memcpy(tag,ieee->current_network.rates,rate_len-2);
-       tag+=rate_len-2;
-
-       *(tag++) = MFIE_TYPE_DS_SET;
-       *(tag++) = 1;
-       *(tag++) = ieee->current_network.channel;
-
-       if(atim_len){
-       u16 val16;
-               *(tag++) = MFIE_TYPE_IBSS_SET;
-               *(tag++) = 2;
-                val16 = cpu_to_le16(ieee->current_network.atim_window);
-               memcpy((u8 *)tag, (u8 *)&val16, 2);
-               tag+=2;
-       }
-
-       if(erp_len){
-               *(tag++) = MFIE_TYPE_ERP;
-               *(tag++) = 1;
-               *(tag++) = erpinfo_content;
-       }
-       if(rate_ex_len){
-               *(tag++) = MFIE_TYPE_RATES_EX;
-               *(tag++) = rate_ex_len-2;
-               memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2);
-               tag+=rate_ex_len-2;
-       }
-
-       if (wpa_ie_len)
-       {
-               if (ieee->iw_mode == IW_MODE_ADHOC)
-               {//as Windows will set pairwise key same as the group key which is not allowed in Linux, so set this for IOT issue. WB 2008.07.07
-                       memcpy(&ieee->wpa_ie[14], &ieee->wpa_ie[8], 4);
-               }
-               memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
-               tag += wpa_ie_len;
-       }
-
-       return skb;
-}
-
-
-struct sk_buff* ieee80211_assoc_resp(struct ieee80211_device *ieee, u8 *dest)
-{
-       struct sk_buff *skb;
-       u8* tag;
-
-       struct ieee80211_crypt_data* crypt;
-       struct ieee80211_assoc_response_frame *assoc;
-       short encrypt;
-
-       unsigned int rate_len = ieee80211_MFIE_rate_len(ieee);
-       int len = sizeof(struct ieee80211_assoc_response_frame) + rate_len + ieee->tx_headroom;
-
-       skb = dev_alloc_skb(len);
-
-       if (!skb)
-               return NULL;
-
-       skb_reserve(skb, ieee->tx_headroom);
-
-       assoc = (struct ieee80211_assoc_response_frame *)
-               skb_put(skb,sizeof(struct ieee80211_assoc_response_frame));
-
-       assoc->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_ASSOC_RESP);
-       memcpy(assoc->header.addr1, dest,ETH_ALEN);
-       memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ?
-               WLAN_CAPABILITY_BSS : WLAN_CAPABILITY_IBSS);
-
-
-       if(ieee->short_slot)
-               assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
-
-       if (ieee->host_encrypt)
-               crypt = ieee->crypt[ieee->tx_keyidx];
-       else crypt = NULL;
-
-       encrypt = ( crypt && crypt->ops);
-
-       if (encrypt)
-               assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-
-       assoc->status = 0;
-       assoc->aid = cpu_to_le16(ieee->assoc_id);
-       if (ieee->assoc_id == 0x2007) ieee->assoc_id=0;
-       else ieee->assoc_id++;
-
-       tag = (u8*) skb_put(skb, rate_len);
-
-       ieee80211_MFIE_Brate(ieee, &tag);
-       ieee80211_MFIE_Grate(ieee, &tag);
-
-       return skb;
-}
-
-struct sk_buff* ieee80211_auth_resp(struct ieee80211_device *ieee,int status, u8 *dest)
-{
-       struct sk_buff *skb;
-       struct ieee80211_authentication *auth;
-       int len = ieee->tx_headroom + sizeof(struct ieee80211_authentication)+1;
-
-       skb = dev_alloc_skb(len);
-
-       if (!skb)
-               return NULL;
-
-       skb->len = sizeof(struct ieee80211_authentication);
-
-       auth = (struct ieee80211_authentication *)skb->data;
-
-       auth->status = cpu_to_le16(status);
-       auth->transaction = cpu_to_le16(2);
-       auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN);
-
-       memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(auth->header.addr1, dest, ETH_ALEN);
-       auth->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_AUTH);
-       return skb;
-
-
-}
-
-struct sk_buff* ieee80211_null_func(struct ieee80211_device *ieee,short pwr)
-{
-       struct sk_buff *skb;
-       struct ieee80211_hdr_3addr* hdr;
-
-       skb = dev_alloc_skb(sizeof(struct ieee80211_hdr_3addr));
-
-       if (!skb)
-               return NULL;
-
-       hdr = (struct ieee80211_hdr_3addr*)skb_put(skb,sizeof(struct ieee80211_hdr_3addr));
-
-       memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN);
-       memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN);
-
-       hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_DATA |
-               IEEE80211_STYPE_NULLFUNC | IEEE80211_FCTL_TODS |
-               (pwr ? IEEE80211_FCTL_PM:0));
-
-       return skb;
-
-
-}
-
-struct sk_buff* ieee80211_pspoll_func(struct ieee80211_device *ieee)
-{
-       struct sk_buff *skb;
-       struct ieee80211_pspoll_hdr* hdr;
-
-#ifdef USB_USE_ALIGNMENT
-        u32 Tmpaddr=0;
-        int alignment=0;
-        skb = dev_alloc_skb(sizeof(struct ieee80211_pspoll_hdr) + ieee->tx_headroom + USB_512B_ALIGNMENT_SIZE);
-#else
-       skb = dev_alloc_skb(sizeof(struct ieee80211_pspoll_hdr)+ieee->tx_headroom);
-#endif
-       if (!skb)
-               return NULL;
-
-#ifdef USB_USE_ALIGNMENT
-        Tmpaddr = (u32)skb->data;
-        alignment = Tmpaddr & 0x1ff;
-        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
-#endif
-       skb_reserve(skb, ieee->tx_headroom);
-
-       hdr = (struct ieee80211_pspoll_hdr*)skb_put(skb,sizeof(struct ieee80211_pspoll_hdr));
-
-       memcpy(hdr->bssid, ieee->current_network.bssid, ETH_ALEN);
-       memcpy(hdr->ta, ieee->dev->dev_addr, ETH_ALEN);
-
-       hdr->aid = cpu_to_le16(ieee->assoc_id | 0xc000);
-       hdr->frame_ctl = cpu_to_le16(IEEE80211_FTYPE_CTL |IEEE80211_STYPE_PSPOLL | IEEE80211_FCTL_PM);
-
-       return skb;
-
-}
-
-
-void ieee80211_resp_to_assoc_rq(struct ieee80211_device *ieee, u8* dest)
-{
-       struct sk_buff *buf = ieee80211_assoc_resp(ieee, dest);
-
-       if (buf)
-               softmac_mgmt_xmit(buf, ieee);
-}
-
-
-void ieee80211_resp_to_auth(struct ieee80211_device *ieee, int s, u8* dest)
-{
-       struct sk_buff *buf = ieee80211_auth_resp(ieee, s, dest);
-
-       if (buf)
-               softmac_mgmt_xmit(buf, ieee);
-}
-
-
-void ieee80211_resp_to_probe(struct ieee80211_device *ieee, u8 *dest)
-{
-
-
-       struct sk_buff *buf = ieee80211_probe_resp(ieee, dest);
-       if (buf)
-               softmac_mgmt_xmit(buf, ieee);
-}
-
-
-inline struct sk_buff *ieee80211_association_req(struct ieee80211_network *beacon,struct ieee80211_device *ieee)
-{
-       struct sk_buff *skb;
-       struct ieee80211_assoc_request_frame *hdr;
-       u8 *tag;
-       u8* ht_cap_buf = NULL;
-       u8 ht_cap_len=0;
-       u8* realtek_ie_buf=NULL;
-       u8 realtek_ie_len=0;
-       int wpa_ie_len= ieee->wpa_ie_len;
-       unsigned int ckip_ie_len=0;
-       unsigned int ccxrm_ie_len=0;
-       unsigned int cxvernum_ie_len=0;
-       struct ieee80211_crypt_data* crypt;
-       int encrypt;
-
-       unsigned int rate_len = ieee80211_MFIE_rate_len(ieee);
-       unsigned int wmm_info_len = beacon->qos_data.supported?9:0;
-#ifdef THOMAS_TURBO
-       unsigned int turbo_info_len = beacon->Turbo_Enable?9:0;
-#endif
-
-       int len = 0;
-
-       crypt = ieee->crypt[ieee->tx_keyidx];
-       encrypt = ieee->host_encrypt && crypt && crypt->ops && ((0 == strcmp(crypt->ops->name,"WEP") || wpa_ie_len));
-
-       //Include High Throuput capability && Realtek proprietary
-       if(ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT)
-       {
-               ht_cap_buf = (u8*)&(ieee->pHTInfo->SelfHTCap);
-               ht_cap_len = sizeof(ieee->pHTInfo->SelfHTCap);
-               HTConstructCapabilityElement(ieee, ht_cap_buf, &ht_cap_len, encrypt);
-               if(ieee->pHTInfo->bCurrentRT2RTAggregation)
-               {
-                       realtek_ie_buf = ieee->pHTInfo->szRT2RTAggBuffer;
-                       realtek_ie_len = sizeof( ieee->pHTInfo->szRT2RTAggBuffer);
-                       HTConstructRT2RTAggElement(ieee, realtek_ie_buf, &realtek_ie_len);
-
-               }
-       }
-       if(ieee->qos_support){
-               wmm_info_len = beacon->qos_data.supported?9:0;
-       }
-
-
-       if(beacon->bCkipSupported)
-       {
-               ckip_ie_len = 30+2;
-       }
-       if(beacon->bCcxRmEnable)
-       {
-               ccxrm_ie_len = 6+2;
-       }
-       if( beacon->BssCcxVerNumber >= 2 )
-       {
-               cxvernum_ie_len = 5+2;
-       }
-#ifdef THOMAS_TURBO
-       len = sizeof(struct ieee80211_assoc_request_frame)+ 2
-               + beacon->ssid_len//essid tagged val
-               + rate_len//rates tagged val
-               + wpa_ie_len
-               + wmm_info_len
-               + turbo_info_len
-                + ht_cap_len
-               + realtek_ie_len
-               + ckip_ie_len
-               + ccxrm_ie_len
-               + cxvernum_ie_len
-               + ieee->tx_headroom;
-#else
-       len = sizeof(struct ieee80211_assoc_request_frame)+ 2
-               + beacon->ssid_len//essid tagged val
-               + rate_len//rates tagged val
-               + wpa_ie_len
-               + wmm_info_len
-                + ht_cap_len
-               + realtek_ie_len
-               + ckip_ie_len
-               + ccxrm_ie_len
-               + cxvernum_ie_len
-               + ieee->tx_headroom;
-#endif
-
-       skb = dev_alloc_skb(len);
-
-       if (!skb)
-               return NULL;
-
-       skb_reserve(skb, ieee->tx_headroom);
-
-       hdr = (struct ieee80211_assoc_request_frame *)
-               skb_put(skb, sizeof(struct ieee80211_assoc_request_frame)+2);
-
-
-       hdr->header.frame_ctl = IEEE80211_STYPE_ASSOC_REQ;
-       hdr->header.duration_id= 37; //FIXME
-       memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN);
-       memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN);
-
-       memcpy(ieee->ap_mac_addr, beacon->bssid, ETH_ALEN);//for HW security, John
-
-       hdr->capability = cpu_to_le16(WLAN_CAPABILITY_BSS);
-       if (beacon->capability & WLAN_CAPABILITY_PRIVACY )
-               hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
-
-       if (beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
-               hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE); //add short_preamble here
-
-       if(ieee->short_slot)
-               hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT);
-       if (wmm_info_len) //QOS
-       hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_QOS);
-
-       hdr->listen_interval = 0xa; //FIXME
-
-       hdr->info_element[0].id = MFIE_TYPE_SSID;
-
-       hdr->info_element[0].len = beacon->ssid_len;
-       tag = skb_put(skb, beacon->ssid_len);
-       memcpy(tag, beacon->ssid, beacon->ssid_len);
-
-       tag = skb_put(skb, rate_len);
-
-       ieee80211_MFIE_Brate(ieee, &tag);
-       ieee80211_MFIE_Grate(ieee, &tag);
-       // For CCX 1 S13, CKIP. Added by Annie, 2006-08-14.
-       if( beacon->bCkipSupported )
-       {
-               static u8       AironetIeOui[] = {0x00, 0x01, 0x66}; // "4500-client"
-               u8      CcxAironetBuf[30];
-               OCTET_STRING    osCcxAironetIE;
-
-               memset(CcxAironetBuf, 0,30);
-               osCcxAironetIE.Octet = CcxAironetBuf;
-               osCcxAironetIE.Length = sizeof(CcxAironetBuf);
-               //
-               // Ref. CCX test plan v3.61, 3.2.3.1 step 13.
-               // We want to make the device type as "4500-client". 060926, by CCW.
-               //
-               memcpy(osCcxAironetIE.Octet, AironetIeOui, sizeof(AironetIeOui));
-
-               // CCX1 spec V1.13, A01.1 CKIP Negotiation (page23):
-               // "The CKIP negotiation is started with the associate request from the client to the access point,
-               //  containing an Aironet element with both the MIC and KP bits set."
-               osCcxAironetIE.Octet[IE_CISCO_FLAG_POSITION] |=  (SUPPORT_CKIP_PK|SUPPORT_CKIP_MIC) ;
-               tag = skb_put(skb, ckip_ie_len);
-               *tag++ = MFIE_TYPE_AIRONET;
-               *tag++ = osCcxAironetIE.Length;
-               memcpy(tag,osCcxAironetIE.Octet,osCcxAironetIE.Length);
-               tag += osCcxAironetIE.Length;
-       }
-
-       if(beacon->bCcxRmEnable)
-       {
-               static u8 CcxRmCapBuf[] = {0x00, 0x40, 0x96, 0x01, 0x01, 0x00};
-               OCTET_STRING osCcxRmCap;
-
-               osCcxRmCap.Octet = CcxRmCapBuf;
-               osCcxRmCap.Length = sizeof(CcxRmCapBuf);
-               tag = skb_put(skb,ccxrm_ie_len);
-               *tag++ = MFIE_TYPE_GENERIC;
-               *tag++ = osCcxRmCap.Length;
-               memcpy(tag,osCcxRmCap.Octet,osCcxRmCap.Length);
-               tag += osCcxRmCap.Length;
-       }
-
-       if( beacon->BssCcxVerNumber >= 2 )
-       {
-               u8                      CcxVerNumBuf[] = {0x00, 0x40, 0x96, 0x03, 0x00};
-               OCTET_STRING    osCcxVerNum;
-               CcxVerNumBuf[4] = beacon->BssCcxVerNumber;
-               osCcxVerNum.Octet = CcxVerNumBuf;
-               osCcxVerNum.Length = sizeof(CcxVerNumBuf);
-               tag = skb_put(skb,cxvernum_ie_len);
-               *tag++ = MFIE_TYPE_GENERIC;
-               *tag++ = osCcxVerNum.Length;
-               memcpy(tag,osCcxVerNum.Octet,osCcxVerNum.Length);
-               tag += osCcxVerNum.Length;
-       }
-        //HT cap element
-       if(ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT){
-               if(ieee->pHTInfo->ePeerHTSpecVer != HT_SPEC_VER_EWC)
-               {
-                       tag = skb_put(skb, ht_cap_len);
-                       *tag++ = MFIE_TYPE_HT_CAP;
-                       *tag++ = ht_cap_len - 2;
-                       memcpy(tag, ht_cap_buf,ht_cap_len -2);
-                       tag += ht_cap_len -2;
-               }
-       }
-
-
-       //choose what wpa_supplicant gives to associate.
-       tag = skb_put(skb, wpa_ie_len);
-       if (wpa_ie_len){
-               memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
-       }
-
-       tag = skb_put(skb,wmm_info_len);
-       if(wmm_info_len) {
-         ieee80211_WMM_Info(ieee, &tag);
-       }
-#ifdef THOMAS_TURBO
-       tag = skb_put(skb,turbo_info_len);
-        if(turbo_info_len) {
-                ieee80211_TURBO_Info(ieee, &tag);
-        }
-#endif
-
-       if(ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT){
-               if(ieee->pHTInfo->ePeerHTSpecVer == HT_SPEC_VER_EWC)
-               {
-                       tag = skb_put(skb, ht_cap_len);
-                       *tag++ = MFIE_TYPE_GENERIC;
-                       *tag++ = ht_cap_len - 2;
-                       memcpy(tag, ht_cap_buf,ht_cap_len - 2);
-                       tag += ht_cap_len -2;
-               }
-
-               if(ieee->pHTInfo->bCurrentRT2RTAggregation){
-                       tag = skb_put(skb, realtek_ie_len);
-                       *tag++ = MFIE_TYPE_GENERIC;
-                       *tag++ = realtek_ie_len - 2;
-                       memcpy(tag, realtek_ie_buf,realtek_ie_len -2 );
-               }
-       }
-       return skb;
-}
-
-void ieee80211_associate_abort(struct ieee80211_device *ieee)
-{
-
-       unsigned long flags;
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       ieee->associate_seq++;
-
-       /* don't scan, and avoid to have the RX path possibily
-        * try again to associate. Even do not react to AUTH or
-        * ASSOC response. Just wait for the retry wq to be scheduled.
-        * Here we will check if there are good nets to associate
-        * with, so we retry or just get back to NO_LINK and scanning
-        */
-       if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING){
-               IEEE80211_DEBUG_MGMT("Authentication failed\n");
-               ieee->softmac_stats.no_auth_rs++;
-       }else{
-               IEEE80211_DEBUG_MGMT("Association failed\n");
-               ieee->softmac_stats.no_ass_rs++;
-       }
-
-       ieee->state = IEEE80211_ASSOCIATING_RETRY;
-
-       queue_delayed_work(ieee->wq, &ieee->associate_retry_wq, \
-                           IEEE80211_SOFTMAC_ASSOC_RETRY_TIME);
-       spin_unlock_irqrestore(&ieee->lock, flags);
-}
-
-void ieee80211_associate_abort_cb(unsigned long dev)
-{
-       ieee80211_associate_abort((struct ieee80211_device *) dev);
-}
-
-
-void ieee80211_associate_step1(struct ieee80211_device *ieee)
-{
-       struct ieee80211_network *beacon = &ieee->current_network;
-       struct sk_buff *skb;
-
-       IEEE80211_DEBUG_MGMT("Stopping scan\n");
-
-       ieee->softmac_stats.tx_auth_rq++;
-       skb=ieee80211_authentication_req(beacon, ieee, 0);
-
-       if (!skb)
-               ieee80211_associate_abort(ieee);
-       else{
-               ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATING ;
-               IEEE80211_DEBUG_MGMT("Sending authentication request\n");
-               softmac_mgmt_xmit(skb, ieee);
-               //BUGON when you try to add_timer twice, using mod_timer may be better, john0709
-               if(!timer_pending(&ieee->associate_timer)){
-                       ieee->associate_timer.expires = jiffies + (HZ / 2);
-                       add_timer(&ieee->associate_timer);
-               }
-       }
-}
-
-void ieee80211_rtl_auth_challenge(struct ieee80211_device *ieee, u8 *challenge, int chlen)
-{
-       u8 *c;
-       struct sk_buff *skb;
-       struct ieee80211_network *beacon = &ieee->current_network;
-
-       ieee->associate_seq++;
-       ieee->softmac_stats.tx_auth_rq++;
-
-       skb = ieee80211_authentication_req(beacon, ieee, chlen+2);
-       if (!skb)
-               ieee80211_associate_abort(ieee);
-       else{
-               c = skb_put(skb, chlen+2);
-               *(c++) = MFIE_TYPE_CHALLENGE;
-               *(c++) = chlen;
-               memcpy(c, challenge, chlen);
-
-               IEEE80211_DEBUG_MGMT("Sending authentication challenge response\n");
-
-               ieee80211_encrypt_fragment(ieee, skb, sizeof(struct ieee80211_hdr_3addr  ));
-
-               softmac_mgmt_xmit(skb, ieee);
-               mod_timer(&ieee->associate_timer, jiffies + (HZ/2));
-       }
-       kfree(challenge);
-}
-
-void ieee80211_associate_step2(struct ieee80211_device *ieee)
-{
-       struct sk_buff* skb;
-       struct ieee80211_network *beacon = &ieee->current_network;
-
-       del_timer_sync(&ieee->associate_timer);
-
-       IEEE80211_DEBUG_MGMT("Sending association request\n");
-
-       ieee->softmac_stats.tx_ass_rq++;
-       skb=ieee80211_association_req(beacon, ieee);
-       if (!skb)
-               ieee80211_associate_abort(ieee);
-       else{
-               softmac_mgmt_xmit(skb, ieee);
-               mod_timer(&ieee->associate_timer, jiffies + (HZ/2));
-       }
-}
-void ieee80211_associate_complete_wq(struct work_struct *work)
-{
-        struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_complete_wq);
-       printk(KERN_INFO "Associated successfully\n");
-       ieee->is_roaming = false;
-       if(ieee80211_is_54g(ieee->current_network) &&
-               (ieee->modulation & IEEE80211_OFDM_MODULATION)){
-
-               ieee->rate = 108;
-               printk(KERN_INFO"Using G rates:%d\n", ieee->rate);
-       }else{
-               ieee->rate = 22;
-               printk(KERN_INFO"Using B rates:%d\n", ieee->rate);
-       }
-       if (ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT)
-       {
-               printk("Successfully associated, ht enabled\n");
-               HTOnAssocRsp(ieee);
-       }
-       else
-       {
-               printk("Successfully associated, ht not enabled(%d, %d)\n", ieee->pHTInfo->bCurrentHTSupport, ieee->pHTInfo->bEnableHT);
-               memset(ieee->dot11HTOperationalRateSet, 0, 16);
-       }
-       ieee->LinkDetectInfo.SlotNum = 2 * (1 + ieee->current_network.beacon_interval/500);
-       // To prevent the immediately calling watch_dog after association.
-       if(ieee->LinkDetectInfo.NumRecvBcnInPeriod==0||ieee->LinkDetectInfo.NumRecvDataInPeriod==0 )
-       {
-               ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1;
-               ieee->LinkDetectInfo.NumRecvDataInPeriod= 1;
-       }
-       ieee->link_change(ieee);
-       if(ieee->is_silent_reset == 0){
-               printk("============>normal associate\n");
-       notify_wx_assoc_event(ieee);
-       }
-       else if(ieee->is_silent_reset == 1)
-       {
-               printk("==================>silent reset associate\n");
-               ieee->is_silent_reset = 0;
-       }
-
-       if (ieee->data_hard_resume)
-               ieee->data_hard_resume(ieee);
-       netif_carrier_on(ieee->dev);
-}
-
-void ieee80211_associate_complete(struct ieee80211_device *ieee)
-{
-       del_timer_sync(&ieee->associate_timer);
-
-       ieee->state = IEEE80211_LINKED;
-       queue_work(ieee->wq, &ieee->associate_complete_wq);
-}
-
-void ieee80211_associate_procedure_wq(struct work_struct *work)
-{
-        struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, associate_procedure_wq);
-       ieee->sync_scan_hurryup = 1;
-#ifdef ENABLE_IPS
-       if(ieee->ieee80211_ips_leave != NULL)
-               ieee->ieee80211_ips_leave(ieee);
-#endif
-
-       down(&ieee->wx_sem);
-
-       if (ieee->data_hard_stop)
-               ieee->data_hard_stop(ieee);
-
-       ieee80211_stop_scan(ieee);
-       printk("===>%s(), chan:%d\n", __FUNCTION__, ieee->current_network.channel);
-       HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
-
-       ieee->associate_seq = 1;
-       ieee80211_associate_step1(ieee);
-
-       up(&ieee->wx_sem);
-}
-
-inline void ieee80211_softmac_new_net(struct ieee80211_device *ieee, struct ieee80211_network *net)
-{
-       u8 tmp_ssid[IW_ESSID_MAX_SIZE+1];
-       int tmp_ssid_len = 0;
-
-       short apset,ssidset,ssidbroad,apmatch,ssidmatch;
-
-       /* we are interested in new new only if we are not associated
-        * and we are not associating / authenticating
-        */
-       if (ieee->state != IEEE80211_NOLINK)
-               return;
-
-       if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_BSS))
-               return;
-
-       if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS))
-               return;
-
-
-       if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC){
-               /* if the user specified the AP MAC, we need also the essid
-                * This could be obtained by beacons or, if the network does not
-                * broadcast it, it can be put manually.
-                */
-               apset = ieee->wap_set;
-               ssidset = ieee->ssid_set;
-               ssidbroad =  !(net->ssid_len == 0 || net->ssid[0]== '\0');
-               apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0);
-               ssidmatch = (ieee->current_network.ssid_len == net->ssid_len)&&\
-                               (!strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len));
-
-
-               if (    /* if the user set the AP check if match.
-                        * if the network does not broadcast essid we check the user supplyed ANY essid
-                        * if the network does broadcast and the user does not set essid it is OK
-                        * if the network does broadcast and the user did set essid chech if essid match
-                        */
-                       ( apset && apmatch &&
-                               ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) ) ||
-                       /* if the ap is not set, check that the user set the bssid
-                        * and the network does bradcast and that those two bssid matches
-                        */
-                       (!apset && ssidset && ssidbroad && ssidmatch)
-                       ){
-                               /* if the essid is hidden replace it with the
-                               * essid provided by the user.
-                               */
-                               if (!ssidbroad){
-                                       strncpy(tmp_ssid, ieee->current_network.ssid, IW_ESSID_MAX_SIZE);
-                                       tmp_ssid_len = ieee->current_network.ssid_len;
-                               }
-                               memcpy(&ieee->current_network, net, sizeof(struct ieee80211_network));
-
-                               if (!ssidbroad){
-                                       strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE);
-                                       ieee->current_network.ssid_len = tmp_ssid_len;
-                               }
-                               printk(KERN_INFO"Linking with %s,channel:%d, qos:%d, myHT:%d, networkHT:%d\n",ieee->current_network.ssid,ieee->current_network.channel, ieee->current_network.qos_data.supported, ieee->pHTInfo->bEnableHT, ieee->current_network.bssht.bdSupportHT);
-
-                               HTResetIOTSetting(ieee->pHTInfo);
-                               if (ieee->iw_mode == IW_MODE_INFRA){
-                                       /* Join the network for the first time */
-                                       ieee->AsocRetryCount = 0;
-                                       //for HT by amy 080514
-                                       if((ieee->current_network.qos_data.supported == 1) &&
-                                          ieee->current_network.bssht.bdSupportHT)
-/*WB, 2008.09.09:bCurrentHTSupport and bEnableHT two flags are going to put together to check whether we are in HT now, so needn't to check bEnableHT flags here. That's is to say we will set to HT support whenever joined AP has the ability to support HT. And whether we are in HT or not, please check bCurrentHTSupport&&bEnableHT now please.*/
-                                       {
-                                               HTResetSelfAndSavePeerSetting(ieee, &(ieee->current_network));
-                                       }
-                                       else
-                                       {
-                                               ieee->pHTInfo->bCurrentHTSupport = false;
-                                       }
-
-                                       ieee->state = IEEE80211_ASSOCIATING;
-                                       queue_work(ieee->wq, &ieee->associate_procedure_wq);
-                               }else{
-                                       if(ieee80211_is_54g(ieee->current_network) &&
-                                               (ieee->modulation & IEEE80211_OFDM_MODULATION)){
-                                               ieee->rate = 108;
-                                               ieee->SetWirelessMode(ieee, IEEE_G);
-                                               printk(KERN_INFO"Using G rates\n");
-                                       }else{
-                                               ieee->rate = 22;
-                                               ieee->SetWirelessMode(ieee, IEEE_B);
-                                               printk(KERN_INFO"Using B rates\n");
-                                       }
-                                       memset(ieee->dot11HTOperationalRateSet, 0, 16);
-                                       ieee->state = IEEE80211_LINKED;
-                               }
-
-               }
-       }
-
-}
-
-void ieee80211_softmac_check_all_nets(struct ieee80211_device *ieee)
-{
-       unsigned long flags;
-       struct ieee80211_network *target;
-
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       list_for_each_entry(target, &ieee->network_list, list) {
-
-               /* if the state become different that NOLINK means
-                * we had found what we are searching for
-                */
-
-               if (ieee->state != IEEE80211_NOLINK)
-                       break;
-
-               if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies))
-               ieee80211_softmac_new_net(ieee, target);
-       }
-
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-}
-
-
-static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen)
-{
-       struct ieee80211_authentication *a;
-       u8 *t;
-       if (skb->len <  (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){
-               IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len);
-               return 0xcafe;
-       }
-       *challenge = NULL;
-       a = (struct ieee80211_authentication*) skb->data;
-       if(skb->len > (sizeof(struct ieee80211_authentication) +3)){
-               t = skb->data + sizeof(struct ieee80211_authentication);
-
-               if(*(t++) == MFIE_TYPE_CHALLENGE){
-                       *chlen = *(t++);
-                       *challenge = kmemdup(t, *chlen, GFP_ATOMIC);
-                       if (!*challenge)
-                               return -ENOMEM;
-               }
-       }
-
-       return cpu_to_le16(a->status);
-
-}
-
-
-int auth_rq_parse(struct sk_buff *skb,u8* dest)
-{
-       struct ieee80211_authentication *a;
-
-       if (skb->len <  (sizeof(struct ieee80211_authentication)-sizeof(struct ieee80211_info_element))){
-               IEEE80211_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len);
-               return -1;
-       }
-       a = (struct ieee80211_authentication*) skb->data;
-
-       memcpy(dest,a->header.addr2, ETH_ALEN);
-
-       if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN)
-               return  WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG;
-
-       return WLAN_STATUS_SUCCESS;
-}
-
-static short probe_rq_parse(struct ieee80211_device *ieee, struct sk_buff *skb, u8 *src)
-{
-       u8 *tag;
-       u8 *skbend;
-       u8 *ssid=NULL;
-       u8 ssidlen = 0;
-
-       struct ieee80211_hdr_3addr   *header =
-               (struct ieee80211_hdr_3addr   *) skb->data;
-
-       if (skb->len < sizeof (struct ieee80211_hdr_3addr  ))
-               return -1; /* corrupted */
-
-       memcpy(src,header->addr2, ETH_ALEN);
-
-       skbend = (u8*)skb->data + skb->len;
-
-       tag = skb->data + sizeof (struct ieee80211_hdr_3addr  );
-
-       while (tag+1 < skbend){
-               if (*tag == 0){
-                       ssid = tag+2;
-                       ssidlen = *(tag+1);
-                       break;
-               }
-               tag++; /* point to the len field */
-               tag = tag + *(tag); /* point to the last data byte of the tag */
-               tag++; /* point to the next tag */
-       }
-
-       if (ssidlen == 0) return 1;
-
-       if (!ssid) return 1; /* ssid not found in tagged param */
-       return (!strncmp(ssid, ieee->current_network.ssid, ssidlen));
-
-}
-
-int assoc_rq_parse(struct sk_buff *skb,u8* dest)
-{
-       struct ieee80211_assoc_request_frame *a;
-
-       if (skb->len < (sizeof(struct ieee80211_assoc_request_frame) -
-               sizeof(struct ieee80211_info_element))) {
-
-               IEEE80211_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len);
-               return -1;
-       }
-
-       a = (struct ieee80211_assoc_request_frame*) skb->data;
-
-       memcpy(dest,a->header.addr2,ETH_ALEN);
-
-       return 0;
-}
-
-static inline u16 assoc_parse(struct ieee80211_device *ieee, struct sk_buff *skb, int *aid)
-{
-       struct ieee80211_assoc_response_frame *response_head;
-       u16 status_code;
-
-       if (skb->len <  sizeof(struct ieee80211_assoc_response_frame)){
-               IEEE80211_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len);
-               return 0xcafe;
-       }
-
-       response_head = (struct ieee80211_assoc_response_frame*) skb->data;
-       *aid = le16_to_cpu(response_head->aid) & 0x3fff;
-
-       status_code = le16_to_cpu(response_head->status);
-       if((status_code==WLAN_STATUS_ASSOC_DENIED_RATES || \
-          status_code==WLAN_STATUS_CAPS_UNSUPPORTED)&&
-          ((ieee->mode == IEEE_G) &&
-           (ieee->current_network.mode == IEEE_N_24G) &&
-            (ieee->AsocRetryCount++ < (RT_ASOC_RETRY_LIMIT-1)))) {
-                 ieee->pHTInfo->IOTAction |= HT_IOT_ACT_PURE_N_MODE;
-       }else {
-                ieee->AsocRetryCount = 0;
-       }
-
-       return le16_to_cpu(response_head->status);
-}
-
-static inline void
-ieee80211_rx_probe_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
-{
-       u8 dest[ETH_ALEN];
-
-       ieee->softmac_stats.rx_probe_rq++;
-       if (probe_rq_parse(ieee, skb, dest)){
-               ieee->softmac_stats.tx_probe_rs++;
-               ieee80211_resp_to_probe(ieee, dest);
-       }
-}
-
-static inline void
-ieee80211_rx_auth_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
-{
-       u8 dest[ETH_ALEN];
-       int status;
-       ieee->softmac_stats.rx_auth_rq++;
-
-       status = auth_rq_parse(skb, dest);
-       if (status != -1) {
-               ieee80211_resp_to_auth(ieee, status, dest);
-       }
-}
-
-static inline void
-ieee80211_rx_assoc_rq(struct ieee80211_device *ieee, struct sk_buff *skb)
-{
-       u8 dest[ETH_ALEN];
-
-       ieee->softmac_stats.rx_ass_rq++;
-       if (assoc_rq_parse(skb,dest) != -1){
-               ieee80211_resp_to_assoc_rq(ieee, dest);
-       }
-
-       printk(KERN_INFO"New client associated: %pM\n", dest);
-}
-
-
-
-void ieee80211_sta_ps_send_null_frame(struct ieee80211_device *ieee, short pwr)
-{
-
-       struct sk_buff *buf = ieee80211_null_func(ieee, pwr);
-
-       if (buf)
-               softmac_ps_mgmt_xmit(buf, ieee);
-
-}
-
-void ieee80211_sta_ps_send_pspoll_frame(struct ieee80211_device *ieee)
-{
-
-       struct sk_buff *buf = ieee80211_pspoll_func(ieee);
-
-       if (buf)
-               softmac_ps_mgmt_xmit(buf, ieee);
-
-}
-
-short ieee80211_sta_ps_sleep(struct ieee80211_device *ieee, u32 *time_h, u32 *time_l)
-{
-       int timeout = ieee->ps_timeout;
-       u8 dtim;
-
-       if(ieee->LPSDelayCnt)
-       {
-               ieee->LPSDelayCnt --;
-               return 0;
-       }
-
-       dtim = ieee->current_network.dtim_data;
-       if(!(dtim & IEEE80211_DTIM_VALID))
-               return 0;
-       timeout = ieee->current_network.beacon_interval; //should we use ps_timeout value or beacon_interval
-       ieee->current_network.dtim_data = IEEE80211_DTIM_INVALID;
-       /* there's no need to nofity AP that I find you buffered with broadcast packet */
-       if(dtim & (IEEE80211_DTIM_UCAST & ieee->ps))
-               return 2;
-
-       if(!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))){
-               return 0;
-       }
-       if(!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))){
-               return 0;
-       }
-       if((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) &&
-               (ieee->mgmt_queue_tail != ieee->mgmt_queue_head))
-               return 0;
-
-       if(time_l){
-               if(ieee->bAwakePktSent == true) {
-                       ieee->LPSAwakeIntvl = 1;//tx wake one beacon
-               } else {
-                       u8              MaxPeriod = 1;
-
-                       if(ieee->LPSAwakeIntvl == 0)
-                               ieee->LPSAwakeIntvl = 1;
-                       if(ieee->RegMaxLPSAwakeIntvl == 0) // Default (0x0 - eFastPs, 0xFF -DTIM, 0xNN - 0xNN * BeaconIntvl)
-                               MaxPeriod = 1; // 1 Beacon interval
-                       else if(ieee->RegMaxLPSAwakeIntvl == 0xFF) // DTIM
-                               MaxPeriod = ieee->current_network.dtim_period;
-                       else
-                               MaxPeriod = ieee->RegMaxLPSAwakeIntvl;
-                       ieee->LPSAwakeIntvl = (ieee->LPSAwakeIntvl >= MaxPeriod) ? MaxPeriod : (ieee->LPSAwakeIntvl + 1);
-               }
-               {
-                       u8 LPSAwakeIntvl_tmp = 0;
-                       u8 period = ieee->current_network.dtim_period;
-                       u8 count = ieee->current_network.tim.tim_count;
-                       if(count == 0 ) {
-                               if(ieee->LPSAwakeIntvl > period)
-                                       LPSAwakeIntvl_tmp = period + (ieee->LPSAwakeIntvl - period) -((ieee->LPSAwakeIntvl-period)%period);
-                               else
-                                       LPSAwakeIntvl_tmp = ieee->LPSAwakeIntvl;
-
-                       } else {
-                               if(ieee->LPSAwakeIntvl > ieee->current_network.tim.tim_count)
-                                       LPSAwakeIntvl_tmp = count + (ieee->LPSAwakeIntvl - count) -((ieee->LPSAwakeIntvl-count)%period);
-                               else
-                                       LPSAwakeIntvl_tmp = ieee->LPSAwakeIntvl;
-                       }
-
-               *time_l = ieee->current_network.last_dtim_sta_time[0]
-                       + MSECS(ieee->current_network.beacon_interval * LPSAwakeIntvl_tmp);
-       }
-       }
-
-       if(time_h){
-               *time_h = ieee->current_network.last_dtim_sta_time[1];
-               if(time_l && *time_l < ieee->current_network.last_dtim_sta_time[0])
-                       *time_h += 1;
-       }
-
-       return 1;
-
-
-}
-
-inline void ieee80211_sta_ps(struct ieee80211_device *ieee)
-{
-
-       u32 th,tl;
-       short sleep;
-       unsigned long flags;
-
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if((ieee->ps == IEEE80211_PS_DISABLED ||
-               ieee->iw_mode != IW_MODE_INFRA ||
-               ieee->state != IEEE80211_LINKED)){
-
-       //      #warning CHECK_LOCK_HERE
-               printk("=====>%s(): no need to ps,wake up!! ieee->ps is %d,ieee->iw_mode is %d,ieee->state is %d\n",
-                       __FUNCTION__,ieee->ps,ieee->iw_mode,ieee->state);
-               spin_lock(&ieee->mgmt_tx_lock);
-
-               ieee80211_sta_wakeup(ieee, 1);
-
-               spin_unlock(&ieee->mgmt_tx_lock);
-       }
-
-       sleep = ieee80211_sta_ps_sleep(ieee,&th, &tl);
-       /* 2 wake, 1 sleep, 0 do nothing */
-       if(sleep == 0)//it is not time out or dtim is not valid
-       {
-               goto out;
-       }
-       if(sleep == 1){
-               if(ieee->sta_sleep == 1){
-                       ieee->enter_sleep_state(ieee, th, tl);
-               }
-
-               else if(ieee->sta_sleep == 0){
-                       spin_lock(&ieee->mgmt_tx_lock);
-
-                       if (ieee->ps_is_queue_empty(ieee)) {
-                               ieee->sta_sleep = 2;
-                               ieee->ack_tx_to_ieee = 1;
-                               ieee80211_sta_ps_send_null_frame(ieee,1);
-                               ieee->ps_th = th;
-                               ieee->ps_tl = tl;
-                       }
-                       spin_unlock(&ieee->mgmt_tx_lock);
-
-               }
-
-               ieee->bAwakePktSent = false;//after null to power save we set it to false. not listen every beacon.
-
-       }else if(sleep == 2){
-               spin_lock(&ieee->mgmt_tx_lock);
-
-               ieee80211_sta_wakeup(ieee,1);
-
-               spin_unlock(&ieee->mgmt_tx_lock);
-       }
-
-out:
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-}
-
-void ieee80211_sta_wakeup(struct ieee80211_device *ieee, short nl)
-{
-       if(ieee->sta_sleep == 0){
-               if(nl){
-                       if(ieee->pHTInfo->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)
-                       {
-                               ieee->ack_tx_to_ieee = 1;
-                               ieee80211_sta_ps_send_null_frame(ieee, 0);
-                       }
-                       else
-                       {
-                               ieee->ack_tx_to_ieee = 1;
-                               ieee80211_sta_ps_send_pspoll_frame(ieee);
-                       }
-               }
-               return;
-
-       }
-
-       if(ieee->sta_sleep == 1)
-               ieee->sta_wake_up(ieee);
-       if(nl){
-
-                       if(ieee->pHTInfo->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)
-                       {
-                               ieee->ack_tx_to_ieee = 1;
-                               ieee80211_sta_ps_send_null_frame(ieee, 0);
-                       }
-                       else
-                       {
-                               ieee->ack_tx_to_ieee = 1;
-                       ieee->polling = true;
-                               //ieee80211_sta_ps_send_null_frame(ieee, 0);
-                               ieee80211_sta_ps_send_pspoll_frame(ieee);
-                       }
-
-       } else {
-               ieee->sta_sleep = 0;
-               ieee->polling = false;
-       }
-}
-
-void ieee80211_ps_tx_ack(struct ieee80211_device *ieee, short success)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if(ieee->sta_sleep == 2){
-               /* Null frame with PS bit set */
-               if(success){
-                       ieee->sta_sleep = 1;
-                       ieee->enter_sleep_state(ieee, ieee->ps_th, ieee->ps_tl);
-               }
-       } else {/* 21112005 - tx again null without PS bit if lost */
-
-               if((ieee->sta_sleep == 0) && !success){
-                       spin_lock(&ieee->mgmt_tx_lock);
-                       //ieee80211_sta_ps_send_null_frame(ieee, 0);
-                       if(ieee->pHTInfo->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)
-                       {
-                               ieee80211_sta_ps_send_null_frame(ieee, 0);
-                       }
-                       else
-                       {
-                               ieee80211_sta_ps_send_pspoll_frame(ieee);
-                       }
-                       spin_unlock(&ieee->mgmt_tx_lock);
-               }
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-}
-
-void ieee80211_process_action(struct ieee80211_device* ieee, struct sk_buff* skb)
-{
-       struct ieee80211_hdr* header = (struct ieee80211_hdr*)skb->data;
-       u8* act = ieee80211_get_payload(header);
-       u8 tmp = 0;
-
-       if (act == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "error to get payload of action frame\n");
-               return;
-       }
-       tmp = *act;
-       act ++;
-       switch (tmp)
-       {
-               case ACT_CAT_BA:
-                       if (*act == ACT_ADDBAREQ)
-                       ieee80211_rx_ADDBAReq(ieee, skb);
-                       else if (*act == ACT_ADDBARSP)
-                       ieee80211_rx_ADDBARsp(ieee, skb);
-                       else if (*act == ACT_DELBA)
-                       ieee80211_rx_DELBA(ieee, skb);
-                       break;
-               default:
-                       break;
-       }
-       return;
-
-}
-inline int
-ieee80211_rx_frame_softmac(struct ieee80211_device *ieee, struct sk_buff *skb,
-                       struct ieee80211_rx_stats *rx_stats, u16 type,
-                       u16 stype)
-{
-       struct ieee80211_hdr_3addr *header = (struct ieee80211_hdr_3addr *) skb->data;
-       u16 errcode;
-       u8* challenge;
-       int chlen=0;
-       int aid;
-       struct ieee80211_assoc_response_frame *assoc_resp;
-       bool bSupportNmode = true, bHalfSupportNmode = false; //default support N mode, disable halfNmode
-
-       if(!ieee->proto_started)
-               return 0;
-
-       switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
-
-               case IEEE80211_STYPE_ASSOC_RESP:
-               case IEEE80211_STYPE_REASSOC_RESP:
-
-                       IEEE80211_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n",
-                                       WLAN_FC_GET_STYPE(header->frame_ctl));
-                       if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
-                               ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATED &&
-                               ieee->iw_mode == IW_MODE_INFRA){
-                               struct ieee80211_network network_resp;
-                               struct ieee80211_network *network = &network_resp;
-
-                               if (0 == (errcode=assoc_parse(ieee,skb, &aid))){
-                                       ieee->state=IEEE80211_LINKED;
-                                       ieee->assoc_id = aid;
-                                       ieee->softmac_stats.rx_ass_ok++;
-                                       /* station support qos */
-                                       /* Let the register setting defaultly with Legacy station */
-                                       if(ieee->qos_support) {
-                                               assoc_resp = (struct ieee80211_assoc_response_frame*)skb->data;
-                                               memset(network, 0, sizeof(*network));
-                                               if (ieee80211_parse_info_param(ieee,assoc_resp->info_element,\
-                                                                       rx_stats->len - sizeof(*assoc_resp),\
-                                                                       network,rx_stats)){
-                                                       return 1;
-                                               }
-                                               else
-                                               {       //filling the PeerHTCap. //maybe not necessary as we can get its info from current_network.
-                                                       memcpy(ieee->pHTInfo->PeerHTCapBuf, network->bssht.bdHTCapBuf, network->bssht.bdHTCapLen);
-                                                       memcpy(ieee->pHTInfo->PeerHTInfoBuf, network->bssht.bdHTInfoBuf, network->bssht.bdHTInfoLen);
-                                               }
-                                               if (ieee->handle_assoc_response != NULL)
-                                                       ieee->handle_assoc_response(ieee, (struct ieee80211_assoc_response_frame*)header, network);
-                                       }
-                                       ieee80211_associate_complete(ieee);
-                               } else {
-                                       /* aid could not been allocated */
-                                       ieee->softmac_stats.rx_ass_err++;
-                                       printk(
-                                               "Association response status code 0x%x\n",
-                                               errcode);
-                                       IEEE80211_DEBUG_MGMT(
-                                               "Association response status code 0x%x\n",
-                                               errcode);
-                                       if(ieee->AsocRetryCount < RT_ASOC_RETRY_LIMIT) {
-                                               queue_work(ieee->wq, &ieee->associate_procedure_wq);
-                                       } else {
-                                               ieee80211_associate_abort(ieee);
-                                       }
-                               }
-                       }
-                       break;
-
-               case IEEE80211_STYPE_ASSOC_REQ:
-               case IEEE80211_STYPE_REASSOC_REQ:
-
-                       if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
-                               ieee->iw_mode == IW_MODE_MASTER)
-
-                               ieee80211_rx_assoc_rq(ieee, skb);
-                       break;
-
-               case IEEE80211_STYPE_AUTH:
-
-                       if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){
-                               if (ieee->state == IEEE80211_ASSOCIATING_AUTHENTICATING &&
-                               ieee->iw_mode == IW_MODE_INFRA){
-
-                                               IEEE80211_DEBUG_MGMT("Received authentication response");
-
-                                               if (0 == (errcode=auth_parse(skb, &challenge, &chlen))){
-                                                       if(ieee->open_wep || !challenge){
-                                                               ieee->state = IEEE80211_ASSOCIATING_AUTHENTICATED;
-                                                               ieee->softmac_stats.rx_auth_rs_ok++;
-                                                               if(!(ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE))
-                                                               {
-                                                                       if (!ieee->GetNmodeSupportBySecCfg(ieee))
-                                                                       {
-                                                                               // WEP or TKIP encryption
-                                                                               if(IsHTHalfNmodeAPs(ieee))
-                                                                               {
-                                                                                       bSupportNmode = true;
-                                                                                       bHalfSupportNmode = true;
-                                                                               }
-                                                                               else
-                                                                               {
-                                                                                       bSupportNmode = false;
-                                                                                       bHalfSupportNmode = false;
-                                                                               }
-                                                                       printk("==========>to link with AP using SEC(%d, %d)\n", bSupportNmode, bHalfSupportNmode);
-                                                                       }
-                                                               }
-                                                               /* Dummy wirless mode setting to avoid encryption issue */
-                                                               if(bSupportNmode) {
-                                                                       //N mode setting
-                                                                       ieee->SetWirelessMode(ieee,
-                                                                                       ieee->current_network.mode);
-                                                               }else{
-                                                                       //b/g mode setting
-                                                                       /*TODO*/
-                                                                       ieee->SetWirelessMode(ieee, IEEE_G);
-                                                               }
-
-                                                               if (ieee->current_network.mode == IEEE_N_24G && bHalfSupportNmode == true)
-                                                               {
-                                                                       printk("===============>entern half N mode\n");
-                                                                       ieee->bHalfWirelessN24GMode = true;
-                                                               }
-                                                               else
-                                                                       ieee->bHalfWirelessN24GMode = false;
-
-                                                               ieee80211_associate_step2(ieee);
-                                                       }else{
-                                                               ieee80211_rtl_auth_challenge(ieee, challenge, chlen);
-                                                       }
-                                               }else{
-                                                       ieee->softmac_stats.rx_auth_rs_err++;
-                                                       IEEE80211_DEBUG_MGMT("Authentication respose status code 0x%x",errcode);
-
-                                                       printk("Authentication respose status code 0x%x",errcode);
-                                                       ieee80211_associate_abort(ieee);
-                                               }
-
-                                       }else if (ieee->iw_mode == IW_MODE_MASTER){
-                                               ieee80211_rx_auth_rq(ieee, skb);
-                                       }
-                               }
-                       break;
-
-               case IEEE80211_STYPE_PROBE_REQ:
-
-                       if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) &&
-                               ((ieee->iw_mode == IW_MODE_ADHOC ||
-                               ieee->iw_mode == IW_MODE_MASTER) &&
-                               ieee->state == IEEE80211_LINKED)){
-                               ieee80211_rx_probe_rq(ieee, skb);
-                       }
-                       break;
-
-               case IEEE80211_STYPE_DISASSOC:
-               case IEEE80211_STYPE_DEAUTH:
-                       /* FIXME for now repeat all the association procedure
-                       * both for disassociation and deauthentication
-                       */
-                       if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
-                               ieee->state == IEEE80211_LINKED &&
-                               ieee->iw_mode == IW_MODE_INFRA){
-
-                               ieee->state = IEEE80211_ASSOCIATING;
-                               ieee->softmac_stats.reassoc++;
-                               ieee->is_roaming = true;
-                               ieee80211_disassociate(ieee);
-                               RemovePeerTS(ieee, header->addr2);
-                               queue_work(ieee->wq, &ieee->associate_procedure_wq);
-                       }
-                       break;
-               case IEEE80211_STYPE_MANAGE_ACT:
-                       ieee80211_process_action(ieee,skb);
-                       break;
-               default:
-                       return -1;
-                       break;
-       }
-
-       return 0;
-}
-
-/* following are for a simpler TX queue management.
- * Instead of using netif_[stop/wake]_queue the driver
- * will uses these two function (plus a reset one), that
- * will internally uses the kernel netif_* and takes
- * care of the ieee802.11 fragmentation.
- * So the driver receives a fragment per time and might
- * call the stop function when it want without take care
- * to have enough room to TX an entire packet.
- * This might be useful if each fragment need it's own
- * descriptor, thus just keep a total free memory > than
- * the max fragmentation threshold is not enough.. If the
- * ieee802.11 stack passed a TXB struct then you needed
- * to keep N free descriptors where
- * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD
- * In this way you need just one and the 802.11 stack
- * will take care of buffering fragments and pass them to
- * to the driver later, when it wakes the queue.
- */
-void ieee80211_softmac_xmit(struct ieee80211_txb *txb, struct ieee80211_device *ieee)
-{
-
-       unsigned int queue_index = txb->queue_index;
-       unsigned long flags;
-       int  i;
-       cb_desc *tcb_desc = NULL;
-
-       spin_lock_irqsave(&ieee->lock,flags);
-
-       /* called with 2nd parm 0, no tx mgmt lock required */
-       ieee80211_sta_wakeup(ieee,0);
-
-       /* update the tx status */
-       tcb_desc = (cb_desc *)(txb->fragments[0]->cb + MAX_DEV_ADDR_SIZE);
-       if(tcb_desc->bMulticast) {
-               ieee->stats.multicast++;
-       }
-
-       /* if xmit available, just xmit it immediately, else just insert it to the wait queue */
-       for(i = 0; i < txb->nr_frags; i++) {
-#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
-               if ((skb_queue_len(&ieee->skb_drv_aggQ[queue_index]) != 0) ||
-#else
-               if ((skb_queue_len(&ieee->skb_waitQ[queue_index]) != 0) ||
-#endif
-               (!ieee->check_nic_enough_desc(ieee, queue_index))||
-                    (ieee->queue_stop)) {
-                       /* insert the skb packet to the wait queue */
-                       /* as for the completion function, it does not need
-                        * to check it any more.
-                        * */
-#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
-                       skb_queue_tail(&ieee->skb_drv_aggQ[queue_index], txb->fragments[i]);
-#else
-                       skb_queue_tail(&ieee->skb_waitQ[queue_index], txb->fragments[i]);
-#endif
-               }else{
-                       ieee->softmac_data_hard_start_xmit(
-                                       txb->fragments[i],
-                                       ieee, ieee->rate);
-               }
-       }
-
-       ieee80211_txb_free(txb);
-
-       spin_unlock_irqrestore(&ieee->lock,flags);
-
-}
-
-/* called with ieee->lock acquired */
-void ieee80211_resume_tx(struct ieee80211_device *ieee)
-{
-       int i;
-       for(i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) {
-
-               if (ieee->queue_stop){
-                       ieee->tx_pending.frag = i;
-                       return;
-               }else{
-
-                       ieee->softmac_data_hard_start_xmit(
-                               ieee->tx_pending.txb->fragments[i],
-                               ieee, ieee->rate);
-                       ieee->stats.tx_packets++;
-               }
-       }
-
-
-       ieee80211_txb_free(ieee->tx_pending.txb);
-       ieee->tx_pending.txb = NULL;
-}
-
-
-void ieee80211_reset_queue(struct ieee80211_device *ieee)
-{
-       unsigned long flags;
-
-       spin_lock_irqsave(&ieee->lock,flags);
-       init_mgmt_queue(ieee);
-       if (ieee->tx_pending.txb){
-               ieee80211_txb_free(ieee->tx_pending.txb);
-               ieee->tx_pending.txb = NULL;
-       }
-       ieee->queue_stop = 0;
-       spin_unlock_irqrestore(&ieee->lock,flags);
-
-}
-
-void ieee80211_rtl_wake_queue(struct ieee80211_device *ieee)
-{
-
-       unsigned long flags;
-       struct sk_buff *skb;
-       struct ieee80211_hdr_3addr  *header;
-
-       spin_lock_irqsave(&ieee->lock,flags);
-       if (! ieee->queue_stop) goto exit;
-
-       ieee->queue_stop = 0;
-
-       if(ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){
-               while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){
-
-                       header = (struct ieee80211_hdr_3addr  *) skb->data;
-
-                       header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-
-                       if (ieee->seq_ctrl[0] == 0xFFF)
-                               ieee->seq_ctrl[0] = 0;
-                       else
-                               ieee->seq_ctrl[0]++;
-
-                       ieee->softmac_data_hard_start_xmit(skb, ieee, ieee->basic_rate);
-               }
-       }
-       if (!ieee->queue_stop && ieee->tx_pending.txb)
-               ieee80211_resume_tx(ieee);
-
-       if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){
-               ieee->softmac_stats.swtxawake++;
-               netif_wake_queue(ieee->dev);
-       }
-
-exit :
-       spin_unlock_irqrestore(&ieee->lock,flags);
-}
-
-
-void ieee80211_rtl_stop_queue(struct ieee80211_device *ieee)
-{
-       if (! netif_queue_stopped(ieee->dev)){
-               netif_stop_queue(ieee->dev);
-               ieee->softmac_stats.swtxstop++;
-       }
-       ieee->queue_stop = 1;
-}
-
-
-inline void ieee80211_randomize_cell(struct ieee80211_device *ieee)
-{
-
-       get_random_bytes(ieee->current_network.bssid, ETH_ALEN);
-
-       /* an IBSS cell address must have the two less significant
-        * bits of the first byte = 2
-        */
-       ieee->current_network.bssid[0] &= ~0x01;
-       ieee->current_network.bssid[0] |= 0x02;
-}
-
-/* called in user context only */
-void ieee80211_start_master_bss(struct ieee80211_device *ieee)
-{
-       ieee->assoc_id = 1;
-
-       if (ieee->current_network.ssid_len == 0){
-               strncpy(ieee->current_network.ssid,
-                       IEEE80211_DEFAULT_TX_ESSID,
-                       IW_ESSID_MAX_SIZE);
-
-               ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID);
-               ieee->ssid_set = 1;
-       }
-
-       memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN);
-
-       ieee->set_chan(ieee, ieee->current_network.channel);
-       ieee->state = IEEE80211_LINKED;
-       ieee->link_change(ieee);
-       notify_wx_assoc_event(ieee);
-
-       if (ieee->data_hard_resume)
-               ieee->data_hard_resume(ieee);
-
-       netif_carrier_on(ieee->dev);
-}
-
-void ieee80211_start_monitor_mode(struct ieee80211_device *ieee)
-{
-       if(ieee->raw_tx){
-
-               if (ieee->data_hard_resume)
-                       ieee->data_hard_resume(ieee);
-
-               netif_carrier_on(ieee->dev);
-       }
-}
-void ieee80211_start_ibss_wq(struct work_struct *work)
-{
-
-        struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-        struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, start_ibss_wq);
-       /* iwconfig mode ad-hoc will schedule this and return
-        * on the other hand this will block further iwconfig SET
-        * operations because of the wx_sem hold.
-        * Anyway some most set operations set a flag to speed-up
-        * (abort) this wq (when syncro scanning) before sleeping
-        * on the semaphore
-        */
-       if(!ieee->proto_started){
-               printk("==========oh driver down return\n");
-               return;
-       }
-       down(&ieee->wx_sem);
-
-       if (ieee->current_network.ssid_len == 0){
-               strcpy(ieee->current_network.ssid,IEEE80211_DEFAULT_TX_ESSID);
-               ieee->current_network.ssid_len = strlen(IEEE80211_DEFAULT_TX_ESSID);
-               ieee->ssid_set = 1;
-       }
-
-       ieee->state = IEEE80211_NOLINK;
-       /* check if we have this cell in our network list */
-       ieee80211_softmac_check_all_nets(ieee);
-
-
-#ifdef ENABLE_DOT11D //if creating an ad-hoc, set its channel to 10 temporarily--this is the requirement for ASUS, not 11D, so disable 11d.
-       if (ieee->state == IEEE80211_NOLINK)
-               ieee->current_network.channel = 6;
-#endif
-       /* if not then the state is not linked. Maybe the user swithced to
-        * ad-hoc mode just after being in monitor mode, or just after
-        * being very few time in managed mode (so the card have had no
-        * time to scan all the chans..) or we have just run up the iface
-        * after setting ad-hoc mode. So we have to give another try..
-        * Here, in ibss mode, should be safe to do this without extra care
-        * (in bss mode we had to make sure no-one tryed to associate when
-        * we had just checked the ieee->state and we was going to start the
-        * scan) beacause in ibss mode the ieee80211_new_net function, when
-        * finds a good net, just set the ieee->state to IEEE80211_LINKED,
-        * so, at worst, we waste a bit of time to initiate an unneeded syncro
-        * scan, that will stop at the first round because it sees the state
-        * associated.
-        */
-       if (ieee->state == IEEE80211_NOLINK)
-               ieee80211_start_scan_syncro(ieee);
-
-       /* the network definitively is not here.. create a new cell */
-       if (ieee->state == IEEE80211_NOLINK){
-               printk("creating new IBSS cell\n");
-               if(!ieee->wap_set)
-                       ieee80211_randomize_cell(ieee);
-
-               if(ieee->modulation & IEEE80211_CCK_MODULATION){
-
-                       ieee->current_network.rates_len = 4;
-
-                       ieee->current_network.rates[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_1MB;
-                       ieee->current_network.rates[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_2MB;
-                       ieee->current_network.rates[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_5MB;
-                       ieee->current_network.rates[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_CCK_RATE_11MB;
-
-               }else
-                       ieee->current_network.rates_len = 0;
-
-               if(ieee->modulation & IEEE80211_OFDM_MODULATION){
-                       ieee->current_network.rates_ex_len = 8;
-
-                       ieee->current_network.rates_ex[0] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_6MB;
-                       ieee->current_network.rates_ex[1] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_9MB;
-                       ieee->current_network.rates_ex[2] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_12MB;
-                       ieee->current_network.rates_ex[3] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_18MB;
-                       ieee->current_network.rates_ex[4] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_24MB;
-                       ieee->current_network.rates_ex[5] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_36MB;
-                       ieee->current_network.rates_ex[6] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_48MB;
-                       ieee->current_network.rates_ex[7] = IEEE80211_BASIC_RATE_MASK | IEEE80211_OFDM_RATE_54MB;
-
-                       ieee->rate = 108;
-               }else{
-                       ieee->current_network.rates_ex_len = 0;
-                       ieee->rate = 22;
-               }
-
-               // By default, WMM function will be disabled in IBSS mode
-               ieee->current_network.QoS_Enable = 0;
-               ieee->SetWirelessMode(ieee, IEEE_G);
-               ieee->current_network.atim_window = 0;
-               ieee->current_network.capability = WLAN_CAPABILITY_IBSS;
-               if(ieee->short_slot)
-                       ieee->current_network.capability |= WLAN_CAPABILITY_SHORT_SLOT;
-
-       }
-
-       ieee->state = IEEE80211_LINKED;
-
-       ieee->set_chan(ieee, ieee->current_network.channel);
-       ieee->link_change(ieee);
-
-       notify_wx_assoc_event(ieee);
-
-       ieee80211_start_send_beacons(ieee);
-
-       if (ieee->data_hard_resume)
-               ieee->data_hard_resume(ieee);
-       netif_carrier_on(ieee->dev);
-
-       up(&ieee->wx_sem);
-}
-
-inline void ieee80211_start_ibss(struct ieee80211_device *ieee)
-{
-       queue_delayed_work(ieee->wq, &ieee->start_ibss_wq, 150);
-}
-
-/* this is called only in user context, with wx_sem held */
-void ieee80211_start_bss(struct ieee80211_device *ieee)
-{
-       unsigned long flags;
-#ifdef ENABLE_DOT11D
-       //
-       // Ref: 802.11d 11.1.3.3
-       // STA shall not start a BSS unless properly formed Beacon frame including a Country IE.
-       //
-       if(IS_DOT11D_ENABLE(ieee) && !IS_COUNTRY_IE_VALID(ieee))
-       {
-               if(! ieee->bGlobalDomain)
-               {
-                       return;
-               }
-       }
-#endif
-       /* check if we have already found the net we
-        * are interested in (if any).
-        * if not (we are disassociated and we are not
-        * in associating / authenticating phase) start the background scanning.
-        */
-       ieee80211_softmac_check_all_nets(ieee);
-
-       /* ensure no-one start an associating process (thus setting
-        * the ieee->state to ieee80211_ASSOCIATING) while we
-        * have just cheked it and we are going to enable scan.
-        * The ieee80211_new_net function is always called with
-        * lock held (from both ieee80211_softmac_check_all_nets and
-        * the rx path), so we cannot be in the middle of such function
-        */
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if (ieee->state == IEEE80211_NOLINK){
-#ifdef ENABLE_IPS
-               if(ieee->ieee80211_ips_leave_wq != NULL)
-                       ieee->ieee80211_ips_leave_wq(ieee);
-#endif
-               ieee->actscanning = true;
-               ieee80211_rtl_start_scan(ieee);
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-}
-
-/* called only in userspace context */
-void ieee80211_disassociate(struct ieee80211_device *ieee)
-{
-
-
-       netif_carrier_off(ieee->dev);
-       if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)
-                       ieee80211_reset_queue(ieee);
-
-       if (ieee->data_hard_stop)
-               ieee->data_hard_stop(ieee);
-#ifdef ENABLE_DOT11D
-       if(IS_DOT11D_ENABLE(ieee))
-               Dot11d_Reset(ieee);
-#endif
-       ieee->is_set_key = false;
-       ieee->link_change(ieee);
-       if (ieee->state == IEEE80211_LINKED ||
-           ieee->state == IEEE80211_ASSOCIATING) {
-               ieee->state = IEEE80211_NOLINK;
-               notify_wx_assoc_event(ieee);
-       }
-
-       ieee->state = IEEE80211_NOLINK;
-
-}
-void ieee80211_associate_retry_wq(struct work_struct *work)
-{
-        struct delayed_work *dwork = container_of(work, struct delayed_work, work);
-        struct ieee80211_device *ieee = container_of(dwork, struct ieee80211_device, associate_retry_wq);
-       unsigned long flags;
-
-       down(&ieee->wx_sem);
-       if(!ieee->proto_started)
-               goto exit;
-
-       if(ieee->state != IEEE80211_ASSOCIATING_RETRY)
-               goto exit;
-
-       /* until we do not set the state to IEEE80211_NOLINK
-       * there are no possibility to have someone else trying
-       * to start an association procdure (we get here with
-       * ieee->state = IEEE80211_ASSOCIATING).
-       * When we set the state to IEEE80211_NOLINK it is possible
-       * that the RX path run an attempt to associate, but
-       * both ieee80211_softmac_check_all_nets and the
-       * RX path works with ieee->lock held so there are no
-       * problems. If we are still disassociated then start a scan.
-       * the lock here is necessary to ensure no one try to start
-       * an association procedure when we have just checked the
-       * state and we are going to start the scan.
-       */
-       ieee->beinretry = true;
-       ieee->state = IEEE80211_NOLINK;
-
-       ieee80211_softmac_check_all_nets(ieee);
-
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if(ieee->state == IEEE80211_NOLINK)
-       {
-               ieee->is_roaming= false;
-               ieee->actscanning = true;
-               ieee80211_rtl_start_scan(ieee);
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-       ieee->beinretry = false;
-exit:
-       up(&ieee->wx_sem);
-}
-
-struct sk_buff *ieee80211_get_beacon_(struct ieee80211_device *ieee)
-{
-       u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff};
-
-       struct sk_buff *skb;
-       struct ieee80211_probe_response *b;
-
-       skb = ieee80211_probe_resp(ieee, broadcast_addr);
-
-       if (!skb)
-               return NULL;
-
-       b = (struct ieee80211_probe_response *) skb->data;
-       b->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_BEACON);
-
-       return skb;
-
-}
-
-struct sk_buff *ieee80211_get_beacon(struct ieee80211_device *ieee)
-{
-       struct sk_buff *skb;
-       struct ieee80211_probe_response *b;
-
-       skb = ieee80211_get_beacon_(ieee);
-       if(!skb)
-               return NULL;
-
-       b = (struct ieee80211_probe_response *) skb->data;
-       b->header.seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
-
-       if (ieee->seq_ctrl[0] == 0xFFF)
-               ieee->seq_ctrl[0] = 0;
-       else
-               ieee->seq_ctrl[0]++;
-
-       return skb;
-}
-
-void ieee80211_softmac_stop_protocol(struct ieee80211_device *ieee, u8 shutdown)
-{
-       ieee->sync_scan_hurryup = 1;
-       down(&ieee->wx_sem);
-       ieee80211_stop_protocol(ieee, shutdown);
-       up(&ieee->wx_sem);
-}
-
-
-void ieee80211_stop_protocol(struct ieee80211_device *ieee, u8 shutdown)
-{
-       if (!ieee->proto_started)
-               return;
-
-       if(shutdown)
-               ieee->proto_started = 0;
-       ieee->proto_stoppping = 1;
-
-       ieee80211_stop_send_beacons(ieee);
-       del_timer_sync(&ieee->associate_timer);
-       cancel_delayed_work(&ieee->associate_retry_wq);
-       cancel_delayed_work(&ieee->start_ibss_wq);
-       ieee80211_stop_scan(ieee);
-
-       ieee80211_disassociate(ieee);
-       RemoveAllTS(ieee); //added as we disconnect from the previous BSS, Remove all TS
-
-       ieee->proto_stoppping = 0;
-}
-
-void ieee80211_softmac_start_protocol(struct ieee80211_device *ieee)
-{
-       ieee->sync_scan_hurryup = 0;
-       down(&ieee->wx_sem);
-       ieee80211_start_protocol(ieee);
-       up(&ieee->wx_sem);
-}
-
-void ieee80211_start_protocol(struct ieee80211_device *ieee)
-{
-       short ch = 0;
-       int i = 0;
-       if (ieee->proto_started)
-               return;
-
-       ieee->proto_started = 1;
-
-       if (ieee->current_network.channel == 0){
-               do{
-                       ch++;
-                       if (ch > MAX_CHANNEL_NUMBER)
-                               return; /* no channel found */
-#ifdef ENABLE_DOT11D
-               }while(!GET_DOT11D_INFO(ieee)->channel_map[ch]);
-#else
-               }while(!ieee->channel_map[ch]);
-#endif
-               ieee->current_network.channel = ch;
-       }
-
-       if (ieee->current_network.beacon_interval == 0)
-               ieee->current_network.beacon_interval = 100;
-
-               for(i = 0; i < 17; i++) {
-         ieee->last_rxseq_num[i] = -1;
-         ieee->last_rxfrag_num[i] = -1;
-         ieee->last_packet_time[i] = 0;
-       }
-
-       ieee->init_wmmparam_flag = 0;//reinitialize AC_xx_PARAM registers.
-
-       ieee->state = IEEE80211_NOLINK;
-
-
-       /* if the user set the MAC of the ad-hoc cell and then
-        * switch to managed mode, shall we  make sure that association
-        * attempts does not fail just because the user provide the essid
-        * and the nic is still checking for the AP MAC ??
-        */
-       if (ieee->iw_mode == IW_MODE_INFRA)
-               ieee80211_start_bss(ieee);
-
-       else if (ieee->iw_mode == IW_MODE_ADHOC)
-               ieee80211_start_ibss(ieee);
-
-       else if (ieee->iw_mode == IW_MODE_MASTER)
-               ieee80211_start_master_bss(ieee);
-
-       else if(ieee->iw_mode == IW_MODE_MONITOR)
-               ieee80211_start_monitor_mode(ieee);
-}
-
-
-#define DRV_NAME  "Ieee80211"
-void ieee80211_softmac_init(struct ieee80211_device *ieee)
-{
-       int i;
-       memset(&ieee->current_network, 0, sizeof(struct ieee80211_network));
-
-       ieee->state = IEEE80211_NOLINK;
-       ieee->sync_scan_hurryup = 0;
-       for(i = 0; i < 5; i++) {
-         ieee->seq_ctrl[i] = 0;
-       }
-#ifdef ENABLE_DOT11D
-       ieee->pDot11dInfo = kzalloc(sizeof(RT_DOT11D_INFO), GFP_ATOMIC);
-       if (!ieee->pDot11dInfo)
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc memory for DOT11D\n");
-#endif
-       //added for  AP roaming
-       ieee->LinkDetectInfo.SlotNum = 2;
-       ieee->LinkDetectInfo.NumRecvBcnInPeriod=0;
-        ieee->LinkDetectInfo.NumRecvDataInPeriod=0;
-
-       ieee->assoc_id = 0;
-       ieee->queue_stop = 0;
-       ieee->scanning = 0;
-       ieee->softmac_features = 0; //so IEEE2100-like driver are happy
-       ieee->wap_set = 0;
-       ieee->ssid_set = 0;
-       ieee->proto_started = 0;
-       ieee->basic_rate = IEEE80211_DEFAULT_BASIC_RATE;
-       ieee->rate = 22;
-       ieee->ps = IEEE80211_PS_DISABLED;
-       ieee->sta_sleep = 0;
-       ieee->Regdot11HTOperationalRateSet[0]= 0xff;//support MCS 0~7
-       ieee->Regdot11HTOperationalRateSet[1]= 0xff;//support MCS 8~15
-       ieee->Regdot11HTOperationalRateSet[4]= 0x01;
-       //added by amy
-       ieee->actscanning = false;
-       ieee->beinretry = false;
-       ieee->is_set_key = false;
-       init_mgmt_queue(ieee);
-
-       ieee->sta_edca_param[0] = 0x0000A403;
-       ieee->sta_edca_param[1] = 0x0000A427;
-       ieee->sta_edca_param[2] = 0x005E4342;
-       ieee->sta_edca_param[3] = 0x002F3262;
-       ieee->aggregation = true;
-       ieee->enable_rx_imm_BA = 1;
-       ieee->tx_pending.txb = NULL;
-
-       init_timer(&ieee->associate_timer);
-       ieee->associate_timer.data = (unsigned long)ieee;
-       ieee->associate_timer.function = ieee80211_associate_abort_cb;
-
-       init_timer(&ieee->beacon_timer);
-       ieee->beacon_timer.data = (unsigned long) ieee;
-       ieee->beacon_timer.function = ieee80211_send_beacon_cb;
-
-       ieee->wq = create_workqueue(DRV_NAME);
-
-        INIT_DELAYED_WORK(&ieee->start_ibss_wq,ieee80211_start_ibss_wq);
-        INIT_WORK(&ieee->associate_complete_wq, ieee80211_associate_complete_wq);
-        INIT_WORK(&ieee->associate_procedure_wq, ieee80211_associate_procedure_wq);
-        INIT_DELAYED_WORK(&ieee->softmac_scan_wq,ieee80211_softmac_scan_wq);
-        INIT_DELAYED_WORK(&ieee->associate_retry_wq, ieee80211_associate_retry_wq);
-        INIT_WORK(&ieee->wx_sync_scan_wq,ieee80211_wx_sync_scan_wq);
-
-       sema_init(&ieee->wx_sem, 1);
-       sema_init(&ieee->scan_sem, 1);
-#ifdef ENABLE_IPS
-       sema_init(&ieee->ips_sem,1);
-#endif
-       spin_lock_init(&ieee->mgmt_tx_lock);
-       spin_lock_init(&ieee->beacon_lock);
-
-       tasklet_init(&ieee->ps_task,
-            (void(*)(unsigned long)) ieee80211_sta_ps,
-            (unsigned long)ieee);
-
-}
-
-void ieee80211_softmac_free(struct ieee80211_device *ieee)
-{
-       down(&ieee->wx_sem);
-#ifdef ENABLE_DOT11D
-       kfree(ieee->pDot11dInfo);
-       ieee->pDot11dInfo = NULL;
-#endif
-       del_timer_sync(&ieee->associate_timer);
-
-       cancel_delayed_work(&ieee->associate_retry_wq);
-       destroy_workqueue(ieee->wq);
-
-       up(&ieee->wx_sem);
-}
-
-/********************************************************
- * Start of WPA code.                                   *
- * this is stolen from the ipw2200 driver               *
- ********************************************************/
-
-
-static int ieee80211_wpa_enable(struct ieee80211_device *ieee, int value)
-{
-       /* This is called when wpa_supplicant loads and closes the driver
-        * interface. */
-       printk("%s WPA\n",value ? "enabling" : "disabling");
-       ieee->wpa_enabled = value;
-       return 0;
-}
-
-
-void ieee80211_wpa_assoc_frame(struct ieee80211_device *ieee, char *wpa_ie, int wpa_ie_len)
-{
-       /* make sure WPA is enabled */
-       ieee80211_wpa_enable(ieee, 1);
-
-       ieee80211_disassociate(ieee);
-}
-
-
-static int ieee80211_wpa_mlme(struct ieee80211_device *ieee, int command, int reason)
-{
-
-       int ret = 0;
-
-       switch (command) {
-       case IEEE_MLME_STA_DEAUTH:
-               // silently ignore
-               break;
-
-       case IEEE_MLME_STA_DISASSOC:
-               ieee80211_disassociate(ieee);
-               break;
-
-       default:
-               printk("Unknown MLME request: %d\n", command);
-               ret = -EOPNOTSUPP;
-       }
-
-       return ret;
-}
-
-
-static int ieee80211_wpa_set_wpa_ie(struct ieee80211_device *ieee,
-                             struct ieee_param *param, int plen)
-{
-       u8 *buf;
-
-       if (param->u.wpa_ie.len > MAX_WPA_IE_LEN ||
-           (param->u.wpa_ie.len && param->u.wpa_ie.data == NULL))
-               return -EINVAL;
-
-       if (param->u.wpa_ie.len) {
-               buf = kmemdup(param->u.wpa_ie.data, param->u.wpa_ie.len,
-                             GFP_KERNEL);
-               if (buf == NULL)
-                       return -ENOMEM;
-
-               kfree(ieee->wpa_ie);
-               ieee->wpa_ie = buf;
-               ieee->wpa_ie_len = param->u.wpa_ie.len;
-       } else {
-               kfree(ieee->wpa_ie);
-               ieee->wpa_ie = NULL;
-               ieee->wpa_ie_len = 0;
-       }
-
-       ieee80211_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len);
-       return 0;
-}
-
-#define AUTH_ALG_OPEN_SYSTEM                   0x1
-#define AUTH_ALG_SHARED_KEY                    0x2
-
-static int ieee80211_wpa_set_auth_algs(struct ieee80211_device *ieee, int value)
-{
-
-       struct ieee80211_security sec = {
-               .flags = SEC_AUTH_MODE,
-       };
-       int ret = 0;
-
-       if (value & AUTH_ALG_SHARED_KEY) {
-               sec.auth_mode = WLAN_AUTH_SHARED_KEY;
-               ieee->open_wep = 0;
-               ieee->auth_mode = 1;
-       } else if (value & AUTH_ALG_OPEN_SYSTEM){
-               sec.auth_mode = WLAN_AUTH_OPEN;
-               ieee->open_wep = 1;
-               ieee->auth_mode = 0;
-       }
-       else if (value & IW_AUTH_ALG_LEAP){
-               sec.auth_mode = WLAN_AUTH_LEAP;
-               ieee->open_wep = 1;
-               ieee->auth_mode = 2;
-       }
-
-
-       if (ieee->set_security)
-               ieee->set_security(ieee, &sec);
-
-       return ret;
-}
-
-static int ieee80211_wpa_set_param(struct ieee80211_device *ieee, u8 name, u32 value)
-{
-       int ret=0;
-       unsigned long flags;
-
-       switch (name) {
-       case IEEE_PARAM_WPA_ENABLED:
-               ret = ieee80211_wpa_enable(ieee, value);
-               break;
-
-       case IEEE_PARAM_TKIP_COUNTERMEASURES:
-               ieee->tkip_countermeasures=value;
-               break;
-
-       case IEEE_PARAM_DROP_UNENCRYPTED: {
-               /* HACK:
-                *
-                * wpa_supplicant calls set_wpa_enabled when the driver
-                * is loaded and unloaded, regardless of if WPA is being
-                * used.  No other calls are made which can be used to
-                * determine if encryption will be used or not prior to
-                * association being expected.  If encryption is not being
-                * used, drop_unencrypted is set to false, else true -- we
-                * can use this to determine if the CAP_PRIVACY_ON bit should
-                * be set.
-                */
-               struct ieee80211_security sec = {
-                       .flags = SEC_ENABLED,
-                       .enabled = value,
-               };
-               ieee->drop_unencrypted = value;
-               /* We only change SEC_LEVEL for open mode. Others
-                * are set by ipw_wpa_set_encryption.
-                */
-               if (!value) {
-                       sec.flags |= SEC_LEVEL;
-                       sec.level = SEC_LEVEL_0;
-               }
-               else {
-                       sec.flags |= SEC_LEVEL;
-                       sec.level = SEC_LEVEL_1;
-               }
-               if (ieee->set_security)
-                       ieee->set_security(ieee, &sec);
-               break;
-       }
-
-       case IEEE_PARAM_PRIVACY_INVOKED:
-               ieee->privacy_invoked=value;
-               break;
-
-       case IEEE_PARAM_AUTH_ALGS:
-               ret = ieee80211_wpa_set_auth_algs(ieee, value);
-               break;
-
-       case IEEE_PARAM_IEEE_802_1X:
-               ieee->ieee802_1x=value;
-               break;
-       case IEEE_PARAM_WPAX_SELECT:
-               // added for WPA2 mixed mode
-               spin_lock_irqsave(&ieee->wpax_suitlist_lock,flags);
-               ieee->wpax_type_set = 1;
-               ieee->wpax_type_notify = value;
-               spin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags);
-               break;
-
-       default:
-               printk("Unknown WPA param: %d\n",name);
-               ret = -EOPNOTSUPP;
-       }
-
-       return ret;
-}
-
-/* implementation borrowed from hostap driver */
-
-static int ieee80211_wpa_set_encryption(struct ieee80211_device *ieee,
-                                 struct ieee_param *param, int param_len)
-{
-       int ret = 0;
-
-       struct ieee80211_crypto_ops *ops;
-       struct ieee80211_crypt_data **crypt;
-
-       struct ieee80211_security sec = {
-               .flags = 0,
-       };
-
-       param->u.crypt.err = 0;
-       param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
-
-       if (param_len !=
-           (int) ((char *) param->u.crypt.key - (char *) param) +
-           param->u.crypt.key_len) {
-               printk("Len mismatch %d, %d\n", param_len,
-                              param->u.crypt.key_len);
-               return -EINVAL;
-       }
-       if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
-           param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
-           param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
-               if (param->u.crypt.idx >= WEP_KEYS)
-                       return -EINVAL;
-               crypt = &ieee->crypt[param->u.crypt.idx];
-       } else {
-               return -EINVAL;
-       }
-
-       if (strcmp(param->u.crypt.alg, "none") == 0) {
-               if (crypt) {
-                       sec.enabled = 0;
-                       // FIXME FIXME
-                       //sec.encrypt = 0;
-                       sec.level = SEC_LEVEL_0;
-                       sec.flags |= SEC_ENABLED | SEC_LEVEL;
-                       ieee80211_crypt_delayed_deinit(ieee, crypt);
-               }
-               goto done;
-       }
-       sec.enabled = 1;
-// FIXME FIXME
-//     sec.encrypt = 1;
-       sec.flags |= SEC_ENABLED;
-
-       /* IPW HW cannot build TKIP MIC, host decryption still needed. */
-       if (!(ieee->host_encrypt || ieee->host_decrypt) &&
-           strcmp(param->u.crypt.alg, "TKIP"))
-               goto skip_host_crypt;
-
-       ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-       if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0)
-               ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-               /* set WEP40 first, it will be modified according to WEP104 or
-                * WEP40 at other place */
-       else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0)
-               ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-       else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0)
-               ops = ieee80211_get_crypto_ops(param->u.crypt.alg);
-       if (ops == NULL) {
-               printk("unknown crypto alg '%s'\n", param->u.crypt.alg);
-               param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG;
-               ret = -EINVAL;
-               goto done;
-       }
-
-       if (*crypt == NULL || (*crypt)->ops != ops) {
-               struct ieee80211_crypt_data *new_crypt;
-
-               ieee80211_crypt_delayed_deinit(ieee, crypt);
-
-               new_crypt = kmalloc(sizeof(*new_crypt), GFP_KERNEL);
-               if (new_crypt == NULL) {
-                       ret = -ENOMEM;
-                       goto done;
-               }
-               memset(new_crypt, 0, sizeof(struct ieee80211_crypt_data));
-               new_crypt->ops = ops;
-               if (new_crypt->ops)
-                       new_crypt->priv =
-                               new_crypt->ops->init(param->u.crypt.idx);
-
-               if (new_crypt->priv == NULL) {
-                       kfree(new_crypt);
-                       param->u.crypt.err = IEEE_CRYPT_ERR_CRYPT_INIT_FAILED;
-                       ret = -EINVAL;
-                       goto done;
-               }
-
-               *crypt = new_crypt;
-       }
-
-       if (param->u.crypt.key_len > 0 && (*crypt)->ops->set_key &&
-           (*crypt)->ops->set_key(param->u.crypt.key,
-                                  param->u.crypt.key_len, param->u.crypt.seq,
-                                  (*crypt)->priv) < 0) {
-               printk("key setting failed\n");
-               param->u.crypt.err = IEEE_CRYPT_ERR_KEY_SET_FAILED;
-               ret = -EINVAL;
-               goto done;
-       }
-
- skip_host_crypt:
-       if (param->u.crypt.set_tx) {
-               ieee->tx_keyidx = param->u.crypt.idx;
-               sec.active_key = param->u.crypt.idx;
-               sec.flags |= SEC_ACTIVE_KEY;
-       } else
-               sec.flags &= ~SEC_ACTIVE_KEY;
-
-       if (param->u.crypt.alg != NULL) {
-               memcpy(sec.keys[param->u.crypt.idx],
-                      param->u.crypt.key,
-                      param->u.crypt.key_len);
-               sec.key_sizes[param->u.crypt.idx] = param->u.crypt.key_len;
-               sec.flags |= (1 << param->u.crypt.idx);
-
-               if (strcmp(param->u.crypt.alg, "WEP") == 0) {
-                       sec.flags |= SEC_LEVEL;
-                       sec.level = SEC_LEVEL_1;
-               } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
-                       sec.flags |= SEC_LEVEL;
-                       sec.level = SEC_LEVEL_2;
-               } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
-                       sec.flags |= SEC_LEVEL;
-                       sec.level = SEC_LEVEL_3;
-               }
-       }
- done:
-       if (ieee->set_security)
-               ieee->set_security(ieee, &sec);
-
-       /* Do not reset port if card is in Managed mode since resetting will
-        * generate new IEEE 802.11 authentication which may end up in looping
-        * with IEEE 802.1X.  If your hardware requires a reset after WEP
-        * configuration (for example... Prism2), implement the reset_port in
-        * the callbacks structures used to initialize the 802.11 stack. */
-       if (ieee->reset_on_keychange &&
-           ieee->iw_mode != IW_MODE_INFRA &&
-           ieee->reset_port &&
-           ieee->reset_port(ieee)) {
-               printk("reset_port failed\n");
-               param->u.crypt.err = IEEE_CRYPT_ERR_CARD_CONF_FAILED;
-               return -EINVAL;
-       }
-
-       return ret;
-}
-
-inline struct sk_buff *ieee80211_disassociate_skb(
-                                                       struct ieee80211_network *beacon,
-                                                       struct ieee80211_device *ieee,
-                                                       u8      asRsn)
-{
-       struct sk_buff *skb;
-       struct ieee80211_disassoc *disass;
-
-       skb = dev_alloc_skb(sizeof(struct ieee80211_disassoc));
-       if (!skb)
-               return NULL;
-
-       disass = (struct ieee80211_disassoc *) skb_put(skb,sizeof(struct ieee80211_disassoc));
-       disass->header.frame_ctl = cpu_to_le16(IEEE80211_STYPE_DISASSOC);
-       disass->header.duration_id = 0;
-
-       memcpy(disass->header.addr1, beacon->bssid, ETH_ALEN);
-       memcpy(disass->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(disass->header.addr3, beacon->bssid, ETH_ALEN);
-
-       disass->reason = asRsn;
-       return skb;
-}
-
-
-void
-SendDisassociation(
-               struct ieee80211_device *ieee,
-               u8*                                     asSta,
-               u8                                              asRsn
-)
-{
-               struct ieee80211_network *beacon = &ieee->current_network;
-               struct sk_buff *skb;
-               skb = ieee80211_disassociate_skb(beacon,ieee,asRsn);
-               if (skb){
-                               softmac_mgmt_xmit(skb, ieee);
-                               //dev_kfree_skb_any(skb);//edit by thomas
-               }
-}
-
-int ieee80211_wpa_supplicant_ioctl(struct ieee80211_device *ieee, struct iw_point *p)
-{
-       struct ieee_param *param;
-       int ret=0;
-
-       down(&ieee->wx_sem);
-       //IEEE_DEBUG_INFO("wpa_supplicant: len=%d\n", p->length);
-
-       if (p->length < sizeof(struct ieee_param) || !p->pointer){
-               ret = -EINVAL;
-               goto out;
-       }
-
-       param = kmalloc(p->length, GFP_KERNEL);
-       if (param == NULL){
-               ret = -ENOMEM;
-               goto out;
-       }
-       if (copy_from_user(param, p->pointer, p->length)) {
-               kfree(param);
-               ret = -EFAULT;
-               goto out;
-       }
-
-       switch (param->cmd) {
-
-       case IEEE_CMD_SET_WPA_PARAM:
-               ret = ieee80211_wpa_set_param(ieee, param->u.wpa_param.name,
-                                       param->u.wpa_param.value);
-               break;
-
-       case IEEE_CMD_SET_WPA_IE:
-               ret = ieee80211_wpa_set_wpa_ie(ieee, param, p->length);
-               break;
-
-       case IEEE_CMD_SET_ENCRYPTION:
-               ret = ieee80211_wpa_set_encryption(ieee, param, p->length);
-               break;
-
-       case IEEE_CMD_MLME:
-               ret = ieee80211_wpa_mlme(ieee, param->u.mlme.command,
-                                  param->u.mlme.reason_code);
-               break;
-
-       default:
-               printk("Unknown WPA supplicant request: %d\n",param->cmd);
-               ret = -EOPNOTSUPP;
-               break;
-       }
-
-       if (ret == 0 && copy_to_user(p->pointer, param, p->length))
-               ret = -EFAULT;
-
-       kfree(param);
-out:
-       up(&ieee->wx_sem);
-
-       return ret;
-}
-
-void notify_wx_assoc_event(struct ieee80211_device *ieee)
-{
-       union iwreq_data wrqu;
-       wrqu.ap_addr.sa_family = ARPHRD_ETHER;
-       if (ieee->state == IEEE80211_LINKED)
-               memcpy(wrqu.ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN);
-       else
-               memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
-       wireless_send_event(ieee->dev, SIOCGIWAP, &wrqu, NULL);
-}
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_softmac_wx.c
deleted file mode 100644 (file)
index d8a068e..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-/* IEEE 802.11 SoftMAC layer
- * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
- *
- * Mostly extracted from the rtl8180-sa2400 driver for the
- * in-kernel generic ieee802.11 stack.
- *
- * Some pieces of code might be stolen from ipw2100 driver
- * copyright of who own it's copyright ;-)
- *
- * PS wx handler mostly stolen from hostap, copyright who
- * own it's copyright ;-)
- *
- * released under the GPL
- */
-
-
-#include "ieee80211.h"
-#ifdef ENABLE_DOT11D
-#include "dot11d.h"
-#endif
-/* FIXME: add A freqs */
-
-const long ieee80211_wlan_frequencies[] = {
-       2412, 2417, 2422, 2427,
-       2432, 2437, 2442, 2447,
-       2452, 2457, 2462, 2467,
-       2472, 2484
-};
-
-
-int ieee80211_wx_set_freq(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b)
-{
-       int ret;
-       struct iw_freq *fwrq = & wrqu->freq;
-
-       down(&ieee->wx_sem);
-
-       if(ieee->iw_mode == IW_MODE_INFRA){
-               ret = -EOPNOTSUPP;
-               goto out;
-       }
-
-       /* if setting by freq convert to channel */
-       if (fwrq->e == 1) {
-               if ((fwrq->m >= (int) 2.412e8 &&
-                    fwrq->m <= (int) 2.487e8)) {
-                       int f = fwrq->m / 100000;
-                       int c = 0;
-
-                       while ((c < 14) && (f != ieee80211_wlan_frequencies[c]))
-                               c++;
-
-                       /* hack to fall through */
-                       fwrq->e = 0;
-                       fwrq->m = c + 1;
-               }
-       }
-
-       if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){
-               ret = -EOPNOTSUPP;
-               goto out;
-
-       }else { /* Set the channel */
-
-#ifdef ENABLE_DOT11D
-               if (!(GET_DOT11D_INFO(ieee)->channel_map)[fwrq->m]) {
-                       ret = -EINVAL;
-                       goto out;
-               }
-#endif
-               ieee->current_network.channel = fwrq->m;
-               ieee->set_chan(ieee, ieee->current_network.channel);
-
-               if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER)
-                       if(ieee->state == IEEE80211_LINKED){
-
-                       ieee80211_stop_send_beacons(ieee);
-                       ieee80211_start_send_beacons(ieee);
-                       }
-       }
-
-       ret = 0;
-out:
-       up(&ieee->wx_sem);
-       return ret;
-}
-
-
-int ieee80211_wx_get_freq(struct ieee80211_device *ieee,
-                            struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b)
-{
-       struct iw_freq *fwrq = & wrqu->freq;
-
-       if (ieee->current_network.channel == 0)
-               return -1;
-       //NM 0.7.0 will not accept channel any more.
-       fwrq->m = ieee80211_wlan_frequencies[ieee->current_network.channel-1] * 100000;
-       fwrq->e = 1;
-
-       return 0;
-}
-
-int ieee80211_wx_get_wap(struct ieee80211_device *ieee,
-                           struct iw_request_info *info,
-                           union iwreq_data *wrqu, char *extra)
-{
-       unsigned long flags;
-       wrqu->ap_addr.sa_family = ARPHRD_ETHER;
-
-       if (ieee->iw_mode == IW_MODE_MONITOR)
-               return -1;
-
-       /* We want avoid to give to the user inconsistent infos*/
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if (ieee->state != IEEE80211_LINKED &&
-               ieee->state != IEEE80211_LINKED_SCANNING &&
-               ieee->wap_set == 0)
-
-               memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
-       else
-               memcpy(wrqu->ap_addr.sa_data,
-                      ieee->current_network.bssid, ETH_ALEN);
-
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-       return 0;
-}
-
-
-int ieee80211_wx_set_wap(struct ieee80211_device *ieee,
-                        struct iw_request_info *info,
-                        union iwreq_data *awrq,
-                        char *extra)
-{
-
-       int ret = 0;
-       u8 zero[] = {0,0,0,0,0,0};
-       unsigned long flags;
-
-       short ifup = ieee->proto_started;//dev->flags & IFF_UP;
-       struct sockaddr *temp = (struct sockaddr *)awrq;
-
-       ieee->sync_scan_hurryup = 1;
-
-       down(&ieee->wx_sem);
-       /* use ifconfig hw ether */
-       if (ieee->iw_mode == IW_MODE_MASTER){
-               ret = -1;
-               goto out;
-       }
-
-       if (temp->sa_family != ARPHRD_ETHER){
-               ret = -EINVAL;
-               goto out;
-       }
-
-       if (ifup)
-               ieee80211_stop_protocol(ieee,true);
-
-       /* just to avoid to give inconsistent infos in the
-        * get wx method. not really needed otherwise
-        */
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN);
-       ieee->wap_set = memcmp(temp->sa_data, zero,ETH_ALEN)!=0;
-
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-       if (ifup)
-               ieee80211_start_protocol(ieee);
-out:
-       up(&ieee->wx_sem);
-       return ret;
-}
-
- int ieee80211_wx_get_essid(struct ieee80211_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b)
-{
-       int len,ret = 0;
-       unsigned long flags;
-
-       if (ieee->iw_mode == IW_MODE_MONITOR)
-               return -1;
-
-       /* We want avoid to give to the user inconsistent infos*/
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if (ieee->current_network.ssid[0] == '\0' ||
-               ieee->current_network.ssid_len == 0){
-               ret = -1;
-               goto out;
-       }
-
-       if (ieee->state != IEEE80211_LINKED &&
-               ieee->state != IEEE80211_LINKED_SCANNING &&
-               ieee->ssid_set == 0){
-               ret = -1;
-               goto out;
-       }
-       len = ieee->current_network.ssid_len;
-       wrqu->essid.length = len;
-       strncpy(b,ieee->current_network.ssid,len);
-       wrqu->essid.flags = 1;
-
-out:
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-       return ret;
-
-}
-
-int ieee80211_wx_set_rate(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra)
-{
-
-       u32 target_rate = wrqu->bitrate.value;
-
-       ieee->rate = target_rate/100000;
-       //FIXME: we might want to limit rate also in management protocols.
-       return 0;
-}
-
-
-
-int ieee80211_wx_get_rate(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra)
-{
-       u32 tmp_rate;
-       tmp_rate = TxCountToDataRate(ieee, ieee->softmac_stats.CurrentShowTxate);
-
-       wrqu->bitrate.value = tmp_rate * 500000;
-
-       return 0;
-}
-
-
-int ieee80211_wx_set_rts(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra)
-{
-       if (wrqu->rts.disabled || !wrqu->rts.fixed)
-               ieee->rts = DEFAULT_RTS_THRESHOLD;
-       else
-       {
-               if (wrqu->rts.value < MIN_RTS_THRESHOLD ||
-                               wrqu->rts.value > MAX_RTS_THRESHOLD)
-                       return -EINVAL;
-               ieee->rts = wrqu->rts.value;
-       }
-       return 0;
-}
-
-int ieee80211_wx_get_rts(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra)
-{
-       wrqu->rts.value = ieee->rts;
-       wrqu->rts.fixed = 0;    /* no auto select */
-       wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);
-       return 0;
-}
-int ieee80211_wx_set_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b)
-{
-
-       ieee->sync_scan_hurryup = 1;
-
-       down(&ieee->wx_sem);
-
-       if (wrqu->mode == ieee->iw_mode)
-               goto out;
-
-       if (wrqu->mode == IW_MODE_MONITOR){
-
-               ieee->dev->type = ARPHRD_IEEE80211;
-       }else{
-               ieee->dev->type = ARPHRD_ETHER;
-       }
-
-       if (!ieee->proto_started){
-               ieee->iw_mode = wrqu->mode;
-       }else{
-               ieee80211_stop_protocol(ieee,true);
-               ieee->iw_mode = wrqu->mode;
-               ieee80211_start_protocol(ieee);
-       }
-
-out:
-       up(&ieee->wx_sem);
-       return 0;
-}
-
-void ieee80211_wx_sync_scan_wq(struct work_struct *work)
-{
-        struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, wx_sync_scan_wq);
-       short chan;
-       HT_EXTCHNL_OFFSET chan_offset=0;
-       HT_CHANNEL_WIDTH bandwidth=0;
-       int b40M = 0;
-       static int count = 0;
-       chan = ieee->current_network.channel;
-
-#ifdef ENABLE_LPS
-       if (ieee->LeisurePSLeave) {
-               ieee->LeisurePSLeave(ieee);
-       }
-
-       /* notify AP to be in PS mode */
-       ieee80211_sta_ps_send_null_frame(ieee, 1);
-       ieee80211_sta_ps_send_null_frame(ieee, 1);
-#endif
-
-       if (ieee->data_hard_stop)
-               ieee->data_hard_stop(ieee);
-
-       ieee80211_stop_send_beacons(ieee);
-
-       ieee->state = IEEE80211_LINKED_SCANNING;
-       ieee->link_change(ieee);
-       ieee->InitialGainHandler(ieee, IG_Backup);
-       if (ieee->pHTInfo->bCurrentHTSupport && ieee->pHTInfo->bEnableHT && ieee->pHTInfo->bCurBW40MHz) {
-               b40M = 1;
-               chan_offset = ieee->pHTInfo->CurSTAExtChnlOffset;
-               bandwidth = (HT_CHANNEL_WIDTH)ieee->pHTInfo->bCurBW40MHz;
-               printk("Scan in 40M, force to 20M first:%d, %d\n", chan_offset, bandwidth);
-               ieee->SetBWModeHandler(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
-               }
-       ieee80211_start_scan_syncro(ieee);
-       if (b40M) {
-               printk("Scan in 20M, back to 40M\n");
-               if (chan_offset == HT_EXTCHNL_OFFSET_UPPER)
-                       ieee->set_chan(ieee, chan + 2);
-               else if (chan_offset == HT_EXTCHNL_OFFSET_LOWER)
-                       ieee->set_chan(ieee, chan - 2);
-               else
-                       ieee->set_chan(ieee, chan);
-               ieee->SetBWModeHandler(ieee, bandwidth, chan_offset);
-       } else {
-               ieee->set_chan(ieee, chan);
-       }
-
-       ieee->InitialGainHandler(ieee, IG_Restore);
-       ieee->state = IEEE80211_LINKED;
-       ieee->link_change(ieee);
-
-#ifdef ENABLE_LPS
-       /* Notify AP that I wake up again */
-       ieee80211_sta_ps_send_null_frame(ieee, 0);
-#endif
-
-       // To prevent the immediately calling watch_dog after scan.
-       if(ieee->LinkDetectInfo.NumRecvBcnInPeriod==0||ieee->LinkDetectInfo.NumRecvDataInPeriod==0 )
-       {
-               ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1;
-               ieee->LinkDetectInfo.NumRecvDataInPeriod= 1;
-       }
-       if (ieee->data_hard_resume)
-               ieee->data_hard_resume(ieee);
-
-       if(ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER)
-               ieee80211_start_send_beacons(ieee);
-
-       count = 0;
-       up(&ieee->wx_sem);
-
-}
-
-int ieee80211_wx_set_scan(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b)
-{
-       int ret = 0;
-
-       down(&ieee->wx_sem);
-
-       if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){
-               ret = -1;
-               goto out;
-       }
-
-       if ( ieee->state == IEEE80211_LINKED){
-               queue_work(ieee->wq, &ieee->wx_sync_scan_wq);
-               /* intentionally forget to up sem */
-               return 0;
-       }
-
-out:
-       up(&ieee->wx_sem);
-       return ret;
-}
-
-int ieee80211_wx_set_essid(struct ieee80211_device *ieee,
-                             struct iw_request_info *a,
-                             union iwreq_data *wrqu, char *extra)
-{
-
-       int ret=0,len;
-       short proto_started;
-       unsigned long flags;
-
-       ieee->sync_scan_hurryup = 1;
-       down(&ieee->wx_sem);
-
-       proto_started = ieee->proto_started;
-
-       if (wrqu->essid.length > IW_ESSID_MAX_SIZE){
-               ret= -E2BIG;
-               goto out;
-       }
-
-       if (ieee->iw_mode == IW_MODE_MONITOR){
-               ret= -1;
-               goto out;
-       }
-
-       if(proto_started){
-               ieee80211_stop_protocol(ieee,true);
-       }
-
-
-       /* this is just to be sure that the GET wx callback
-        * has consisten infos. not needed otherwise
-        */
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       if (wrqu->essid.flags && wrqu->essid.length) {
-               //first flush current network.ssid
-               len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE;
-               strncpy(ieee->current_network.ssid, extra, len+1);
-               ieee->current_network.ssid_len = len+1;
-               ieee->ssid_set = 1;
-       }
-       else{
-               ieee->ssid_set = 0;
-               ieee->current_network.ssid[0] = '\0';
-               ieee->current_network.ssid_len = 0;
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-
-       if (proto_started)
-               ieee80211_start_protocol(ieee);
-out:
-       up(&ieee->wx_sem);
-       return ret;
-}
-
- int ieee80211_wx_get_mode(struct ieee80211_device *ieee, struct iw_request_info *a,
-                            union iwreq_data *wrqu, char *b)
-{
-
-       wrqu->mode = ieee->iw_mode;
-       return 0;
-}
-
- int ieee80211_wx_set_rawtx(struct ieee80211_device *ieee,
-                              struct iw_request_info *info,
-                              union iwreq_data *wrqu, char *extra)
-{
-
-       int *parms = (int *)extra;
-       int enable = (parms[0] > 0);
-       short prev = ieee->raw_tx;
-
-       down(&ieee->wx_sem);
-
-       if(enable)
-               ieee->raw_tx = 1;
-       else
-               ieee->raw_tx = 0;
-
-       printk(KERN_INFO"raw TX is %s\n",
-             ieee->raw_tx ? "enabled" : "disabled");
-
-       if(ieee->iw_mode == IW_MODE_MONITOR)
-       {
-               if(prev == 0 && ieee->raw_tx){
-                       if (ieee->data_hard_resume)
-                               ieee->data_hard_resume(ieee);
-
-                       netif_carrier_on(ieee->dev);
-               }
-
-               if(prev && ieee->raw_tx == 1)
-                       netif_carrier_off(ieee->dev);
-       }
-
-       up(&ieee->wx_sem);
-
-       return 0;
-}
-
-int ieee80211_wx_get_name(struct ieee80211_device *ieee,
-                            struct iw_request_info *info,
-                            union iwreq_data *wrqu, char *extra)
-{
-       strcpy(wrqu->name, "802.11");
-       if(ieee->modulation & IEEE80211_CCK_MODULATION)
-               strcat(wrqu->name, "b");
-       if(ieee->modulation & IEEE80211_OFDM_MODULATION)
-               strcat(wrqu->name, "g");
-       if (ieee->mode & (IEEE_N_24G | IEEE_N_5G))
-               strcat(wrqu->name, "n");
-       return 0;
-}
-
-
-/* this is mostly stolen from hostap */
-int ieee80211_wx_set_power(struct ieee80211_device *ieee,
-                                struct iw_request_info *info,
-                                union iwreq_data *wrqu, char *extra)
-{
-       int ret = 0;
-
-       if(
-               (!ieee->sta_wake_up) ||
-               (!ieee->enter_sleep_state) ||
-               (!ieee->ps_is_queue_empty)){
-
-               return -1;
-       }
-
-       down(&ieee->wx_sem);
-
-       if (wrqu->power.disabled){
-               ieee->ps = IEEE80211_PS_DISABLED;
-               goto exit;
-       }
-       if (wrqu->power.flags & IW_POWER_TIMEOUT) {
-               ieee->ps_timeout = wrqu->power.value / 1000;
-       }
-
-       if (wrqu->power.flags & IW_POWER_PERIOD) {
-               ieee->ps_period = wrqu->power.value / 1000;
-       }
-       switch (wrqu->power.flags & IW_POWER_MODE) {
-       case IW_POWER_UNICAST_R:
-               ieee->ps = IEEE80211_PS_UNICAST;
-               break;
-       case IW_POWER_MULTICAST_R:
-               ieee->ps = IEEE80211_PS_MBCAST;
-               break;
-       case IW_POWER_ALL_R:
-               ieee->ps = IEEE80211_PS_UNICAST | IEEE80211_PS_MBCAST;
-               break;
-
-       case IW_POWER_ON:
-               break;
-
-       default:
-               ret = -EINVAL;
-               goto exit;
-
-       }
-exit:
-       up(&ieee->wx_sem);
-       return ret;
-
-}
-
-/* this is stolen from hostap */
-int ieee80211_wx_get_power(struct ieee80211_device *ieee,
-                                struct iw_request_info *info,
-                                union iwreq_data *wrqu, char *extra)
-{
-       int ret =0;
-
-       down(&ieee->wx_sem);
-
-       if(ieee->ps == IEEE80211_PS_DISABLED){
-               wrqu->power.disabled = 1;
-               goto exit;
-       }
-
-       wrqu->power.disabled = 0;
-
-       if ((wrqu->power.flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
-               wrqu->power.flags = IW_POWER_TIMEOUT;
-               wrqu->power.value = ieee->ps_timeout * 1000;
-       } else {
-               wrqu->power.flags = IW_POWER_PERIOD;
-               wrqu->power.value = ieee->ps_period * 1000;
-       }
-
-       if ((ieee->ps & (IEEE80211_PS_MBCAST | IEEE80211_PS_UNICAST)) == (IEEE80211_PS_MBCAST | IEEE80211_PS_UNICAST))
-               wrqu->power.flags |= IW_POWER_ALL_R;
-       else if (ieee->ps & IEEE80211_PS_MBCAST)
-               wrqu->power.flags |= IW_POWER_MULTICAST_R;
-       else
-               wrqu->power.flags |= IW_POWER_UNICAST_R;
-
-exit:
-       up(&ieee->wx_sem);
-       return ret;
-
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_tx.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_tx.c
deleted file mode 100644 (file)
index 424dd48..0000000
+++ /dev/null
@@ -1,955 +0,0 @@
-/******************************************************************************
-
-  Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of version 2 of the GNU General Public License as
-  published by the Free Software Foundation.
-
-  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.
-
-  The full GNU General Public License is included in this distribution in the
-  file called LICENSE.
-
-  Contact Information:
-  James P. Ketrenos <ipw2100-admin@linux.intel.com>
-  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-******************************************************************************
-
-  Few modifications for Realtek's Wi-Fi drivers by
-  Andrea Merello <andreamrl@tiscali.it>
-
-  A special thanks goes to Realtek for their support !
-
-******************************************************************************/
-
-#include <linux/compiler.h>
-#include <linux/errno.h>
-#include <linux/if_arp.h>
-#include <linux/in6.h>
-#include <linux/in.h>
-#include <linux/ip.h>
-#include <linux/kernel.h>
-#include <linux/module.h>
-#include <linux/netdevice.h>
-#include <linux/pci.h>
-#include <linux/proc_fs.h>
-#include <linux/skbuff.h>
-#include <linux/slab.h>
-#include <linux/tcp.h>
-#include <linux/types.h>
-#include <linux/wireless.h>
-#include <linux/etherdevice.h>
-#include <asm/uaccess.h>
-#include <linux/if_vlan.h>
-
-#include "ieee80211.h"
-
-
-/*
-
-
-802.11 Data Frame
-
-
-802.11 frame_contorl for data frames - 2 bytes
-     ,-----------------------------------------------------------------------------------------.
-bits | 0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  a  |  b  |  c  |  d  |  e   |
-     |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
-val  | 0  |  0  |  0  |  1  |  x  |  0  |  0  |  0  |  1  |  0  |  x  |  x  |  x  |  x  |  x   |
-     |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
-desc | ^-ver-^  |  ^type-^  |  ^-----subtype-----^  | to  |from |more |retry| pwr |more |wep   |
-     |          |           | x=0 data,x=1 data+ack | DS  | DS  |frag |     | mgm |data |      |
-     '-----------------------------------------------------------------------------------------'
-                                                   /\
-                                                    |
-802.11 Data Frame                                   |
-           ,--------- 'ctrl' expands to >-----------'
-          |
-      ,--'---,-------------------------------------------------------------.
-Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
-      |------|------|---------|---------|---------|------|---------|------|
-Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  Frame  |  fcs |
-      |      | tion | (BSSID) |         |         | ence |  data   |      |
-      `--------------------------------------------------|         |------'
-Total: 28 non-data bytes                                 `----.----'
-                                                              |
-       .- 'Frame data' expands to <---------------------------'
-       |
-       V
-      ,---------------------------------------------------.
-Bytes |  1   |  1   |    1    |    3     |  2   |  0-2304 |
-      |------|------|---------|----------|------|---------|
-Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP      |
-      | DSAP | SSAP |         |          |      | Packet  |
-      | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8|      |         |
-      `-----------------------------------------|         |
-Total: 8 non-data bytes                         `----.----'
-                                                     |
-       .- 'IP Packet' expands, if WEP enabled, to <--'
-       |
-       V
-      ,-----------------------.
-Bytes |  4  |   0-2296  |  4  |
-      |-----|-----------|-----|
-Desc. | IV  | Encrypted | ICV |
-      |     | IP Packet |     |
-      `-----------------------'
-Total: 8 non-data bytes
-
-
-802.3 Ethernet Data Frame
-
-      ,-----------------------------------------.
-Bytes |   6   |   6   |  2   |  Variable |   4  |
-      |-------|-------|------|-----------|------|
-Desc. | Dest. | Source| Type | IP Packet |  fcs |
-      |  MAC  |  MAC  |      |           |      |
-      `-----------------------------------------'
-Total: 18 non-data bytes
-
-In the event that fragmentation is required, the incoming payload is split into
-N parts of size ieee->fts.  The first fragment contains the SNAP header and the
-remaining packets are just data.
-
-If encryption is enabled, each fragment payload size is reduced by enough space
-to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
-So if you have 1500 bytes of payload with ieee->fts set to 500 without
-encryption it will take 3 frames.  With WEP it will take 4 frames as the
-payload of each frame is reduced to 492 bytes.
-
-* SKB visualization
-*
-*  ,- skb->data
-* |
-* |    ETHERNET HEADER        ,-<-- PAYLOAD
-* |                           |     14 bytes from skb->data
-* |  2 bytes for Type --> ,T. |     (sizeof ethhdr)
-* |                       | | |
-* |,-Dest.--. ,--Src.---. | | |
-* |  6 bytes| | 6 bytes | | | |
-* v         | |         | | | |
-* 0         | v       1 | v | v           2
-* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
-*     ^     | ^         | ^ |
-*     |     | |         | | |
-*     |     | |         | `T' <---- 2 bytes for Type
-*     |     | |         |
-*     |     | '---SNAP--' <-------- 6 bytes for SNAP
-*     |     |
-*     `-IV--' <-------------------- 4 bytes for IV (WEP)
-*
-*      SNAP HEADER
-*
-*/
-
-static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
-static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
-
-static inline int ieee80211_put_snap(u8 *data, u16 h_proto)
-{
-       struct ieee80211_snap_hdr *snap;
-       u8 *oui;
-
-       snap = (struct ieee80211_snap_hdr *)data;
-       snap->dsap = 0xaa;
-       snap->ssap = 0xaa;
-       snap->ctrl = 0x03;
-
-       if (h_proto == 0x8137 || h_proto == 0x80f3)
-               oui = P802_1H_OUI;
-       else
-               oui = RFC1042_OUI;
-       snap->oui[0] = oui[0];
-       snap->oui[1] = oui[1];
-       snap->oui[2] = oui[2];
-
-       *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
-
-       return SNAP_SIZE + sizeof(u16);
-}
-
-int ieee80211_encrypt_fragment(
-       struct ieee80211_device *ieee,
-       struct sk_buff *frag,
-       int hdr_len)
-{
-       struct ieee80211_crypt_data* crypt = ieee->crypt[ieee->tx_keyidx];
-       int res;
-
-       if (!(crypt && crypt->ops))
-       {
-               printk("=========>%s(), crypt is null\n", __FUNCTION__);
-               return -1;
-       }
-#ifdef CONFIG_IEEE80211_CRYPT_TKIP
-       struct ieee80211_hdr *header;
-
-       if (ieee->tkip_countermeasures &&
-           crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) {
-               header = (struct ieee80211_hdr *) frag->data;
-               if (net_ratelimit()) {
-                       printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
-                              "TX packet to %pM\n",
-                              ieee->dev->name, header->addr1);
-               }
-               return -1;
-       }
-#endif
-       /* To encrypt, frame format is:
-        * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
-
-       // PR: FIXME: Copied from hostap. Check fragmentation/MSDU/MPDU encryption.
-       /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
-        * call both MSDU and MPDU encryption functions from here. */
-       atomic_inc(&crypt->refcnt);
-       res = 0;
-       if (crypt->ops->encrypt_msdu)
-               res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv);
-       if (res == 0 && crypt->ops->encrypt_mpdu)
-               res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
-
-       atomic_dec(&crypt->refcnt);
-       if (res < 0) {
-               printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
-                      ieee->dev->name, frag->len);
-               ieee->ieee_stats.tx_discards++;
-               return -1;
-       }
-
-       return 0;
-}
-
-
-void ieee80211_txb_free(struct ieee80211_txb *txb) {
-       if (unlikely(!txb))
-               return;
-       kfree(txb);
-}
-
-struct ieee80211_txb *ieee80211_alloc_txb(int nr_frags, int txb_size,
-                                         int gfp_mask)
-{
-       struct ieee80211_txb *txb;
-       int i;
-       txb = kmalloc(
-               sizeof(struct ieee80211_txb) + (sizeof(u8*) * nr_frags),
-               gfp_mask);
-       if (!txb)
-               return NULL;
-
-       memset(txb, 0, sizeof(struct ieee80211_txb));
-       txb->nr_frags = nr_frags;
-       txb->frag_size = txb_size;
-
-       for (i = 0; i < nr_frags; i++) {
-               txb->fragments[i] = dev_alloc_skb(txb_size);
-               if (unlikely(!txb->fragments[i])) {
-                       i--;
-                       break;
-               }
-               memset(txb->fragments[i]->cb, 0, sizeof(txb->fragments[i]->cb));
-       }
-       if (unlikely(i != nr_frags)) {
-               while (i >= 0)
-                       dev_kfree_skb_any(txb->fragments[i--]);
-               kfree(txb);
-               return NULL;
-       }
-       return txb;
-}
-
-// Classify the to-be send data packet
-// Need to acquire the sent queue index.
-static int
-ieee80211_classify(struct sk_buff *skb, struct ieee80211_network *network)
-{
-       struct ethhdr *eth;
-       struct iphdr *ip;
-       eth = (struct ethhdr *)skb->data;
-       if (eth->h_proto != htons(ETH_P_IP))
-               return 0;
-
-       ip = ip_hdr(skb);
-       switch (ip->tos & 0xfc) {
-               case 0x20:
-                       return 2;
-               case 0x40:
-                       return 1;
-               case 0x60:
-                       return 3;
-               case 0x80:
-                       return 4;
-               case 0xa0:
-                       return 5;
-               case 0xc0:
-                       return 6;
-               case 0xe0:
-                       return 7;
-               default:
-                       return 0;
-       }
-}
-
-#define SN_LESS(a, b)          (((a-b)&0x800)!=0)
-void ieee80211_tx_query_agg_cap(struct ieee80211_device* ieee, struct sk_buff* skb, cb_desc* tcb_desc)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-       PTX_TS_RECORD                   pTxTs = NULL;
-       struct ieee80211_hdr_1addr* hdr = (struct ieee80211_hdr_1addr*)skb->data;
-
-       if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
-               return;
-       if (!IsQoSDataFrame(skb->data))
-               return;
-
-       if (is_multicast_ether_addr(hdr->addr1) || is_broadcast_ether_addr(hdr->addr1))
-               return;
-       //check packet and mode later
-#ifdef TO_DO_LIST
-       if(pTcb->PacketLength >= 4096)
-               return;
-       // For RTL819X, if pairwisekey = wep/tkip, we don't aggrregation.
-       if(!Adapter->HalFunc.GetNmodeSupportBySecCfgHandler(Adapter))
-               return;
-#endif
-
-        if(tcb_desc->bdhcp)// || ieee->CntAfterLink<2)
-        {
-                return;
-        }
-
-
-#if 1
-       if (!ieee->GetNmodeSupportBySecCfg(ieee))
-       {
-               return;
-       }
-#endif
-       if(pHTInfo->bCurrentAMPDUEnable)
-       {
-               if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTxTs), hdr->addr1, skb->priority, TX_DIR, true))
-               {
-                       printk("===>can't get TS\n");
-                       return;
-               }
-               if (pTxTs->TxAdmittedBARecord.bValid == false)
-               {
-                       //as some AP will refuse our action frame until key handshake has been finished. WB
-                       if (ieee->wpa_ie_len && (ieee->pairwise_key_type == KEY_TYPE_NA))
-                       ;
-                       else
-                       TsStartAddBaProcess(ieee, pTxTs);
-                       goto FORCED_AGG_SETTING;
-               }
-               else if (pTxTs->bUsingBa == false)
-               {
-                       if (SN_LESS(pTxTs->TxAdmittedBARecord.BaStartSeqCtrl.field.SeqNum, (pTxTs->TxCurSeq+1)%4096))
-                               pTxTs->bUsingBa = true;
-                       else
-                               goto FORCED_AGG_SETTING;
-               }
-
-               if (ieee->iw_mode == IW_MODE_INFRA)
-               {
-                       tcb_desc->bAMPDUEnable = true;
-                       tcb_desc->ampdu_factor = pHTInfo->CurrentAMPDUFactor;
-                       tcb_desc->ampdu_density = pHTInfo->CurrentMPDUDensity;
-               }
-       }
-FORCED_AGG_SETTING:
-       switch(pHTInfo->ForcedAMPDUMode )
-       {
-               case HT_AGG_AUTO:
-                       break;
-
-               case HT_AGG_FORCE_ENABLE:
-                       tcb_desc->bAMPDUEnable = true;
-                       tcb_desc->ampdu_density = pHTInfo->ForcedMPDUDensity;
-                       tcb_desc->ampdu_factor = pHTInfo->ForcedAMPDUFactor;
-                       break;
-
-               case HT_AGG_FORCE_DISABLE:
-                       tcb_desc->bAMPDUEnable = false;
-                       tcb_desc->ampdu_density = 0;
-                       tcb_desc->ampdu_factor = 0;
-                       break;
-
-       }
-               return;
-}
-
-extern void ieee80211_qurey_ShortPreambleMode(struct ieee80211_device* ieee, cb_desc* tcb_desc)
-{
-       tcb_desc->bUseShortPreamble = false;
-       if (tcb_desc->data_rate == 2)
-       {//// 1M can only use Long Preamble. 11B spec
-               return;
-       }
-       else if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
-       {
-               tcb_desc->bUseShortPreamble = true;
-       }
-       return;
-}
-extern void
-ieee80211_query_HTCapShortGI(struct ieee80211_device *ieee, cb_desc *tcb_desc)
-{
-       PRT_HIGH_THROUGHPUT             pHTInfo = ieee->pHTInfo;
-
-       tcb_desc->bUseShortGI           = false;
-
-       if(!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
-               return;
-
-       if(pHTInfo->bForcedShortGI)
-       {
-               tcb_desc->bUseShortGI = true;
-               return;
-       }
-
-       if((pHTInfo->bCurBW40MHz==true) && pHTInfo->bCurShortGI40MHz)
-               tcb_desc->bUseShortGI = true;
-       else if((pHTInfo->bCurBW40MHz==false) && pHTInfo->bCurShortGI20MHz)
-               tcb_desc->bUseShortGI = true;
-}
-
-void ieee80211_query_BandwidthMode(struct ieee80211_device* ieee, cb_desc *tcb_desc)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-
-       tcb_desc->bPacketBW = false;
-
-       if(!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
-               return;
-
-       if(tcb_desc->bMulticast || tcb_desc->bBroadcast)
-               return;
-
-       if((tcb_desc->data_rate & 0x80)==0) // If using legacy rate, it shall use 20MHz channel.
-               return;
-       //BandWidthAutoSwitch is for auto switch to 20 or 40 in long distance
-       if(pHTInfo->bCurBW40MHz && pHTInfo->bCurTxBW40MHz && !ieee->bandwidth_auto_switch.bforced_tx20Mhz)
-               tcb_desc->bPacketBW = true;
-       return;
-}
-
-void ieee80211_query_protectionmode(struct ieee80211_device* ieee, cb_desc* tcb_desc, struct sk_buff* skb)
-{
-       // Common Settings
-       tcb_desc->bRTSSTBC                      = false;
-       tcb_desc->bRTSUseShortGI                = false; // Since protection frames are always sent by legacy rate, ShortGI will never be used.
-       tcb_desc->bCTSEnable                    = false; // Most of protection using RTS/CTS
-       tcb_desc->RTSSC                         = 0;            // 20MHz: Don't care;  40MHz: Duplicate.
-       tcb_desc->bRTSBW                        = false; // RTS frame bandwidth is always 20MHz
-
-       if(tcb_desc->bBroadcast || tcb_desc->bMulticast)//only unicast frame will use rts/cts
-               return;
-
-       if (is_broadcast_ether_addr(skb->data+16))  //check addr3 as infrastructure add3 is DA.
-               return;
-
-       if (ieee->mode < IEEE_N_24G) //b, g mode
-       {
-                       // (1) RTS_Threshold is compared to the MPDU, not MSDU.
-                       // (2) If there are more than one frag in  this MSDU, only the first frag uses protection frame.
-                       //              Other fragments are protected by previous fragment.
-                       //              So we only need to check the length of first fragment.
-               if (skb->len > ieee->rts)
-               {
-                       tcb_desc->bRTSEnable = true;
-                       tcb_desc->rts_rate = MGN_24M;
-               }
-               else if (ieee->current_network.buseprotection)
-               {
-                       // Use CTS-to-SELF in protection mode.
-                       tcb_desc->bRTSEnable = true;
-                       tcb_desc->bCTSEnable = true;
-                       tcb_desc->rts_rate = MGN_24M;
-               }
-               //otherwise return;
-               return;
-       }
-       else
-       {// 11n High throughput case.
-               PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
-               while (true)
-               {
-                       //check ERP protection
-                       if (ieee->current_network.buseprotection)
-                       {// CTS-to-SELF
-                               tcb_desc->bRTSEnable = true;
-                               tcb_desc->bCTSEnable = true;
-                               tcb_desc->rts_rate = MGN_24M;
-                               break;
-                       }
-                       //check HT op mode
-                       if(pHTInfo->bCurrentHTSupport  && pHTInfo->bEnableHT)
-                       {
-                               u8 HTOpMode = pHTInfo->CurrentOpMode;
-                               if((pHTInfo->bCurBW40MHz && (HTOpMode == 2 || HTOpMode == 3)) ||
-                                                       (!pHTInfo->bCurBW40MHz && HTOpMode == 3) )
-                               {
-                                       tcb_desc->rts_rate = MGN_24M; // Rate is 24Mbps.
-                                       tcb_desc->bRTSEnable = true;
-                                       break;
-                               }
-                       }
-                       //check rts
-                       if (skb->len > ieee->rts)
-                       {
-                               tcb_desc->rts_rate = MGN_24M; // Rate is 24Mbps.
-                               tcb_desc->bRTSEnable = true;
-                               break;
-                       }
-                       //to do list: check MIMO power save condition.
-                       //check AMPDU aggregation for TXOP
-                       if(tcb_desc->bAMPDUEnable)
-                       {
-                               tcb_desc->rts_rate = MGN_24M; // Rate is 24Mbps.
-                               // According to 8190 design, firmware sends CF-End only if RTS/CTS is enabled. However, it degrads
-                               // throughput around 10M, so we disable of this mechanism. 2007.08.03 by Emily
-                               tcb_desc->bRTSEnable = false;
-                               break;
-                       }
-                       //check IOT action
-                       if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
-                       {
-                               tcb_desc->bCTSEnable    = true;
-                               tcb_desc->rts_rate  =   MGN_24M;
-                               tcb_desc->bRTSEnable = true;
-                               break;
-                       }
-                       // Totally no protection case!!
-                       goto NO_PROTECTION;
-               }
-               }
-       // For test , CTS replace with RTS
-       if( 0 )
-       {
-               tcb_desc->bCTSEnable    = true;
-               tcb_desc->rts_rate = MGN_24M;
-               tcb_desc->bRTSEnable    = true;
-       }
-       if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
-               tcb_desc->bUseShortPreamble = true;
-       if (ieee->mode == IW_MODE_MASTER)
-                       goto NO_PROTECTION;
-       return;
-NO_PROTECTION:
-       tcb_desc->bRTSEnable    = false;
-       tcb_desc->bCTSEnable    = false;
-       tcb_desc->rts_rate              = 0;
-       tcb_desc->RTSSC         = 0;
-       tcb_desc->bRTSBW                = false;
-}
-
-
-void ieee80211_txrate_selectmode(struct ieee80211_device* ieee, cb_desc* tcb_desc)
-{
-#ifdef TO_DO_LIST
-       if(!IsDataFrame(pFrame))
-       {
-               pTcb->bTxDisableRateFallBack = TRUE;
-               pTcb->bTxUseDriverAssingedRate = TRUE;
-               pTcb->RATRIndex = 7;
-               return;
-       }
-
-       if(pMgntInfo->ForcedDataRate!= 0)
-       {
-               pTcb->bTxDisableRateFallBack = TRUE;
-               pTcb->bTxUseDriverAssingedRate = TRUE;
-               return;
-       }
-#endif
-       if(ieee->bTxDisableRateFallBack)
-               tcb_desc->bTxDisableRateFallBack = true;
-
-       if(ieee->bTxUseDriverAssingedRate)
-               tcb_desc->bTxUseDriverAssingedRate = true;
-       if(!tcb_desc->bTxDisableRateFallBack || !tcb_desc->bTxUseDriverAssingedRate)
-       {
-               if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
-                       tcb_desc->RATRIndex = 0;
-       }
-}
-
-void ieee80211_query_seqnum(struct ieee80211_device*ieee, struct sk_buff* skb, u8* dst)
-{
-       if (is_multicast_ether_addr(dst) || is_broadcast_ether_addr(dst))
-               return;
-       if (IsQoSDataFrame(skb->data)) //we deal qos data only
-       {
-               PTX_TS_RECORD pTS = NULL;
-               if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTS), dst, skb->priority, TX_DIR, true))
-               {
-                       return;
-               }
-               pTS->TxCurSeq = (pTS->TxCurSeq+1)%4096;
-       }
-}
-
-int ieee80211_rtl_xmit(struct sk_buff *skb, struct net_device *dev)
-{
-       struct ieee80211_device *ieee = netdev_priv(dev);
-       struct ieee80211_txb *txb = NULL;
-       struct ieee80211_hdr_3addrqos *frag_hdr;
-       int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
-       unsigned long flags;
-       struct net_device_stats *stats = &ieee->stats;
-       int ether_type = 0, encrypt;
-       int bytes, fc, qos_ctl = 0, hdr_len;
-       struct sk_buff *skb_frag;
-       struct ieee80211_hdr_3addrqos header = { /* Ensure zero initialized */
-               .duration_id = 0,
-               .seq_ctl = 0,
-               .qos_ctl = 0
-       };
-       u8 dest[ETH_ALEN], src[ETH_ALEN];
-       int qos_actived = ieee->current_network.qos_data.active;
-
-       struct ieee80211_crypt_data* crypt;
-       bool    bdhcp =false;
-
-       cb_desc *tcb_desc;
-
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       /* If there is no driver handler to take the TXB, dont' bother
-        * creating it... */
-       if ((!ieee->hard_start_xmit && !(ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE))||
-          ((!ieee->softmac_data_hard_start_xmit && (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)))) {
-               printk(KERN_WARNING "%s: No xmit handler.\n",
-                      ieee->dev->name);
-               goto success;
-       }
-
-
-       if(likely(ieee->raw_tx == 0)){
-               if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
-                       printk(KERN_WARNING "%s: skb too small (%d).\n",
-                       ieee->dev->name, skb->len);
-                       goto success;
-               }
-
-               memset(skb->cb, 0, sizeof(skb->cb));
-               ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
-
-               crypt = ieee->crypt[ieee->tx_keyidx];
-
-               encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
-                       ieee->host_encrypt && crypt && crypt->ops;
-
-               if (!encrypt && ieee->ieee802_1x &&
-               ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
-                       stats->tx_dropped++;
-                       goto success;
-               }
-       #ifdef CONFIG_IEEE80211_DEBUG
-               if (crypt && !encrypt && ether_type == ETH_P_PAE) {
-                       struct eapol *eap = (struct eapol *)(skb->data +
-                               sizeof(struct ethhdr) - SNAP_SIZE - sizeof(u16));
-                       IEEE80211_DEBUG_EAP("TX: IEEE 802.11 EAPOL frame: %s\n",
-                               eap_get_type(eap->type));
-               }
-       #endif
-
-               // The following is for DHCP and ARP packet, we use cck1M to tx these packets and let LPS awake some time
-               // to prevent DHCP protocol fail
-               if (skb->len > 282){//MINIMUM_DHCP_PACKET_SIZE) {
-                       if (ETH_P_IP == ether_type) {// IP header
-                               const struct iphdr *ip = (struct iphdr *)((u8 *)skb->data+14);
-                               if (IPPROTO_UDP == ip->protocol) {//FIXME windows is 11 but here UDP in linux kernel is 17.
-                                       struct udphdr *udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
-                                       if(((((u8 *)udp)[1] == 68) && (((u8 *)udp)[3] == 67)) ||
-                                                       ((((u8 *)udp)[1] == 67) && (((u8 *)udp)[3] == 68))) {
-                                               // 68 : UDP BOOTP client
-                                               // 67 : UDP BOOTP server
-                                               printk("DHCP pkt src port:%d, dest port:%d!!\n", ((u8 *)udp)[1],((u8 *)udp)[3]);
-
-                                               bdhcp = true;
-#ifdef _RTL8192_EXT_PATCH_
-                                               ieee->LPSDelayCnt = 100;//pPSC->LPSAwakeIntvl*2; //AMY,090701
-#else
-                                               ieee->LPSDelayCnt = 100;//pPSC->LPSAwakeIntvl*2;
-#endif
-                                       }
-                               }
-                               }else if(ETH_P_ARP == ether_type){// IP ARP packet
-                                       printk("=================>DHCP Protocol start tx ARP pkt!!\n");
-                                       bdhcp = true;
-                                       ieee->LPSDelayCnt = ieee->current_network.tim.tim_count;
-
-                               }
-                       }
-
-               /* Save source and destination addresses */
-               memcpy(&dest, skb->data, ETH_ALEN);
-               memcpy(&src, skb->data+ETH_ALEN, ETH_ALEN);
-
-                /* Advance the SKB to the start of the payload */
-                skb_pull(skb, sizeof(struct ethhdr));
-
-                /* Determine total amount of storage required for TXB packets */
-                bytes = skb->len + SNAP_SIZE + sizeof(u16);
-
-               if (encrypt)
-                       fc = IEEE80211_FTYPE_DATA | IEEE80211_FCTL_WEP;
-               else
-
-                        fc = IEEE80211_FTYPE_DATA;
-
-               if(qos_actived)
-                       fc |= IEEE80211_STYPE_QOS_DATA;
-               else
-                       fc |= IEEE80211_STYPE_DATA;
-
-               if (ieee->iw_mode == IW_MODE_INFRA) {
-                       fc |= IEEE80211_FCTL_TODS;
-                       /* To DS: Addr1 = BSSID, Addr2 = SA,
-                       Addr3 = DA */
-                       memcpy(&header.addr1, ieee->current_network.bssid, ETH_ALEN);
-                       memcpy(&header.addr2, &src, ETH_ALEN);
-                       memcpy(&header.addr3, &dest, ETH_ALEN);
-               } else if (ieee->iw_mode == IW_MODE_ADHOC) {
-                       /* not From/To DS: Addr1 = DA, Addr2 = SA,
-                       Addr3 = BSSID */
-                       memcpy(&header.addr1, dest, ETH_ALEN);
-                       memcpy(&header.addr2, src, ETH_ALEN);
-                       memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN);
-               }
-
-                header.frame_ctl = cpu_to_le16(fc);
-
-               /* Determine fragmentation size based on destination (multicast
-               * and broadcast are not fragmented) */
-               if (is_multicast_ether_addr(header.addr1) ||
-               is_broadcast_ether_addr(header.addr1)) {
-                       frag_size = MAX_FRAG_THRESHOLD;
-                       qos_ctl |= QOS_CTL_NOTCONTAIN_ACK;
-               }
-               else {
-                       frag_size = ieee->fts;//default:392
-                       qos_ctl = 0;
-               }
-
-               if(qos_actived)
-               {
-                       hdr_len = IEEE80211_3ADDR_LEN + 2;
-
-                       skb->priority = ieee80211_classify(skb, &ieee->current_network);
-                       qos_ctl |= skb->priority; //set in the ieee80211_classify
-                       header.qos_ctl = cpu_to_le16(qos_ctl & IEEE80211_QOS_TID);
-               } else {
-                       hdr_len = IEEE80211_3ADDR_LEN;
-               }
-               /* Determine amount of payload per fragment.  Regardless of if
-               * this stack is providing the full 802.11 header, one will
-               * eventually be affixed to this fragment -- so we must account for
-               * it when determining the amount of payload space. */
-               bytes_per_frag = frag_size - hdr_len;
-               if (ieee->config &
-               (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
-                       bytes_per_frag -= IEEE80211_FCS_LEN;
-
-               /* Each fragment may need to have room for encryption pre/postfix */
-               if (encrypt)
-                       bytes_per_frag -= crypt->ops->extra_prefix_len +
-                               crypt->ops->extra_postfix_len;
-
-               /* Number of fragments is the total bytes_per_frag /
-               * payload_per_fragment */
-               nr_frags = bytes / bytes_per_frag;
-               bytes_last_frag = bytes % bytes_per_frag;
-               if (bytes_last_frag)
-                       nr_frags++;
-               else
-                       bytes_last_frag = bytes_per_frag;
-
-               /* When we allocate the TXB we allocate enough space for the reserve
-               * and full fragment bytes (bytes_per_frag doesn't include prefix,
-               * postfix, header, FCS, etc.) */
-               txb = ieee80211_alloc_txb(nr_frags, frag_size + ieee->tx_headroom, GFP_ATOMIC);
-               if (unlikely(!txb)) {
-                       printk(KERN_WARNING "%s: Could not allocate TXB\n",
-                       ieee->dev->name);
-                       goto failed;
-               }
-               txb->encrypted = encrypt;
-               txb->payload_size = bytes;
-
-               if(qos_actived)
-               {
-                       txb->queue_index = UP2AC(skb->priority);
-               } else {
-                       txb->queue_index = WME_AC_BK;
-               }
-
-
-
-               for (i = 0; i < nr_frags; i++) {
-                       skb_frag = txb->fragments[i];
-                       tcb_desc = (cb_desc *)(skb_frag->cb + MAX_DEV_ADDR_SIZE);
-                       if(qos_actived){
-                               skb_frag->priority = skb->priority;//UP2AC(skb->priority);
-                               tcb_desc->queue_index =  UP2AC(skb->priority);
-                       } else {
-                               skb_frag->priority = WME_AC_BK;
-                               tcb_desc->queue_index = WME_AC_BK;
-                       }
-                       skb_reserve(skb_frag, ieee->tx_headroom);
-
-                       if (encrypt){
-                               if (ieee->hwsec_active)
-                                       tcb_desc->bHwSec = 1;
-                               else
-                                       tcb_desc->bHwSec = 0;
-                               skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
-                       }
-                       else
-                       {
-                               tcb_desc->bHwSec = 0;
-                       }
-                       frag_hdr = (struct ieee80211_hdr_3addrqos *)skb_put(skb_frag, hdr_len);
-                       memcpy(frag_hdr, &header, hdr_len);
-
-                       /* If this is not the last fragment, then add the MOREFRAGS
-                       * bit to the frame control */
-                       if (i != nr_frags - 1) {
-                               frag_hdr->frame_ctl = cpu_to_le16(
-                                       fc | IEEE80211_FCTL_MOREFRAGS);
-                               bytes = bytes_per_frag;
-
-                       } else {
-                               /* The last fragment takes the remaining length */
-                               bytes = bytes_last_frag;
-                       }
-
-                       if(qos_actived)
-                       {
-                               // add 1 only indicate to corresponding seq number control 2006/7/12
-                               frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[UP2AC(skb->priority)+1]<<4 | i);
-                       } else {
-                               frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | i);
-                       }
-
-                       /* Put a SNAP header on the first fragment */
-                       if (i == 0) {
-                               ieee80211_put_snap(
-                                       skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
-                                       ether_type);
-                               bytes -= SNAP_SIZE + sizeof(u16);
-                       }
-
-                       memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
-
-                       /* Advance the SKB... */
-                       skb_pull(skb, bytes);
-
-                       /* Encryption routine will move the header forward in order
-                       * to insert the IV between the header and the payload */
-                       if (encrypt)
-                               ieee80211_encrypt_fragment(ieee, skb_frag, hdr_len);
-                       if (ieee->config &
-                       (CFG_IEEE80211_COMPUTE_FCS | CFG_IEEE80211_RESERVE_FCS))
-                               skb_put(skb_frag, 4);
-               }
-
-               if(qos_actived)
-               {
-                 if (ieee->seq_ctrl[UP2AC(skb->priority) + 1] == 0xFFF)
-                       ieee->seq_ctrl[UP2AC(skb->priority) + 1] = 0;
-                 else
-                       ieee->seq_ctrl[UP2AC(skb->priority) + 1]++;
-               } else {
-                 if (ieee->seq_ctrl[0] == 0xFFF)
-                       ieee->seq_ctrl[0] = 0;
-                 else
-                       ieee->seq_ctrl[0]++;
-               }
-       }else{
-               if (unlikely(skb->len < sizeof(struct ieee80211_hdr_3addr))) {
-                       printk(KERN_WARNING "%s: skb too small (%d).\n",
-                       ieee->dev->name, skb->len);
-                       goto success;
-               }
-
-               txb = ieee80211_alloc_txb(1, skb->len, GFP_ATOMIC);
-               if(!txb){
-                       printk(KERN_WARNING "%s: Could not allocate TXB\n",
-                       ieee->dev->name);
-                       goto failed;
-               }
-
-               txb->encrypted = 0;
-               txb->payload_size = skb->len;
-               memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len);
-       }
-
- success:
-//WB add to fill data tcb_desc here. only first fragment is considered, need to change, and you may remove to other place.
-       if (txb)
-       {
-               cb_desc *tcb_desc = (cb_desc *)(txb->fragments[0]->cb + MAX_DEV_ADDR_SIZE);
-               tcb_desc->bTxEnableFwCalcDur = 1;
-               if (is_multicast_ether_addr(header.addr1))
-                       tcb_desc->bMulticast = 1;
-               if (is_broadcast_ether_addr(header.addr1))
-                       tcb_desc->bBroadcast = 1;
-               ieee80211_txrate_selectmode(ieee, tcb_desc);
-               if ( tcb_desc->bMulticast ||  tcb_desc->bBroadcast)
-                       tcb_desc->data_rate = ieee->basic_rate;
-               else
-                       tcb_desc->data_rate = CURRENT_RATE(ieee->mode, ieee->rate, ieee->HTCurrentOperaRate);
-
-               if(bdhcp == true){
-                               tcb_desc->data_rate = MGN_1M;
-                               tcb_desc->bTxDisableRateFallBack = 1;
-
-                       tcb_desc->RATRIndex = 7;
-                       tcb_desc->bTxUseDriverAssingedRate = 1;
-                       tcb_desc->bdhcp = 1;
-               }
-
-
-               ieee80211_qurey_ShortPreambleMode(ieee, tcb_desc);
-               ieee80211_tx_query_agg_cap(ieee, txb->fragments[0], tcb_desc);
-               ieee80211_query_HTCapShortGI(ieee, tcb_desc);
-               ieee80211_query_BandwidthMode(ieee, tcb_desc);
-               ieee80211_query_protectionmode(ieee, tcb_desc, txb->fragments[0]);
-               ieee80211_query_seqnum(ieee, txb->fragments[0], header.addr1);
-       }
-       spin_unlock_irqrestore(&ieee->lock, flags);
-       dev_kfree_skb_any(skb);
-       if (txb) {
-               if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){
-                       ieee80211_softmac_xmit(txb, ieee);
-               }else{
-                       if ((*ieee->hard_start_xmit)(txb, ieee) == 0) {
-                               stats->tx_packets++;
-                               stats->tx_bytes += txb->payload_size;
-                               return 0;
-                       }
-                       ieee80211_txb_free(txb);
-               }
-       }
-
-       return 0;
-
- failed:
-       spin_unlock_irqrestore(&ieee->lock, flags);
-       netif_stop_queue(dev);
-       stats->tx_errors++;
-       return 1;
-
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c b/drivers/staging/rtl8192e/ieee80211/ieee80211_wx.c
deleted file mode 100644 (file)
index 6530d9b..0000000
+++ /dev/null
@@ -1,872 +0,0 @@
-/******************************************************************************
-
-  Copyright(c) 2004 Intel Corporation. All rights reserved.
-
-  Portions of this file are based on the WEP enablement code provided by the
-  Host AP project hostap-drivers v0.1.3
-  Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
-  <jkmaline@cc.hut.fi>
-  Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
-
-  This program is free software; you can redistribute it and/or modify it
-  under the terms of version 2 of the GNU General Public License as
-  published by the Free Software Foundation.
-
-  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.
-
-  The full GNU General Public License is included in this distribution in the
-  file called LICENSE.
-
-  Contact Information:
-  James P. Ketrenos <ipw2100-admin@linux.intel.com>
-  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
-
-******************************************************************************/
-#include <linux/wireless.h>
-#include <linux/version.h>
-#include <linux/kmod.h>
-#include <linux/slab.h>
-#include <linux/module.h>
-
-#include "ieee80211.h"
-
-struct modes_unit {
-       char *mode_string;
-       int mode_size;
-};
-struct modes_unit ieee80211_modes[] = {
-       {"a",1},
-       {"b",1},
-       {"g",1},
-       {"?",1},
-       {"N-24G",5},
-       {"N-5G",4},
-};
-
-#define iwe_stream_add_event_rsl iwe_stream_add_event
-
-#define MAX_CUSTOM_LEN 64
-static inline char *rtl819x_translate_scan(struct ieee80211_device *ieee,
-                                          char *start, char *stop,
-                                          struct ieee80211_network *network,
-                                           struct iw_request_info *info)
-{
-       char custom[MAX_CUSTOM_LEN];
-       char proto_name[IFNAMSIZ];
-       char *pname = proto_name;
-       char *p;
-       struct iw_event iwe;
-       int i, j;
-       u16 max_rate, rate;
-       static u8       EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
-
-       /* First entry *MUST* be the AP MAC address */
-       iwe.cmd = SIOCGIWAP;
-       iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
-       memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN);
-       start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_ADDR_LEN);
-       /* Remaining entries will be displayed in the order we provide them */
-
-       /* Add the ESSID */
-       iwe.cmd = SIOCGIWESSID;
-       iwe.u.data.flags = 1;
-//     if (network->flags & NETWORK_EMPTY_ESSID) {
-       if (network->ssid_len == 0) {
-               iwe.u.data.length = sizeof("<hidden>");
-                start = iwe_stream_add_point(info, start, stop, &iwe, "<hidden>");
-        } else {
-               iwe.u.data.length = min(network->ssid_len, (u8)32);
-                start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid);
-        }
-       /* Add the protocol name */
-       iwe.cmd = SIOCGIWNAME;
-       for(i=0; i<ARRAY_SIZE(ieee80211_modes); i++) {
-               if(network->mode&(1<<i)) {
-                       sprintf(pname,ieee80211_modes[i].mode_string,ieee80211_modes[i].mode_size);
-                       pname +=ieee80211_modes[i].mode_size;
-               }
-       }
-       *pname = '\0';
-       snprintf(iwe.u.name, IFNAMSIZ, "IEEE802.11%s", proto_name);
-        start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_CHAR_LEN);
-        /* Add mode */
-        iwe.cmd = SIOCGIWMODE;
-        if (network->capability &
-           (WLAN_CAPABILITY_BSS | WLAN_CAPABILITY_IBSS)) {
-               if (network->capability & WLAN_CAPABILITY_BSS)
-                       iwe.u.mode = IW_MODE_MASTER;
-               else
-                       iwe.u.mode = IW_MODE_ADHOC;
-                start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_UINT_LEN);
-        }
-
-        /* Add frequency/channel */
-       iwe.cmd = SIOCGIWFREQ;
-/*     iwe.u.freq.m = ieee80211_frequency(network->channel, network->mode);
-       iwe.u.freq.e = 3; */
-       iwe.u.freq.m = network->channel;
-       iwe.u.freq.e = 0;
-       iwe.u.freq.i = 0;
-        start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_FREQ_LEN);
-       /* Add encryption capability */
-       iwe.cmd = SIOCGIWENCODE;
-       if (network->capability & WLAN_CAPABILITY_PRIVACY)
-               iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
-       else
-               iwe.u.data.flags = IW_ENCODE_DISABLED;
-       iwe.u.data.length = 0;
-        start = iwe_stream_add_point(info, start, stop, &iwe, network->ssid);
-       /* Add basic and extended rates */
-       max_rate = 0;
-       p = custom;
-       p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): ");
-       for (i = 0, j = 0; i < network->rates_len; ) {
-               if (j < network->rates_ex_len &&
-                   ((network->rates_ex[j] & 0x7F) <
-                    (network->rates[i] & 0x7F)))
-                       rate = network->rates_ex[j++] & 0x7F;
-               else
-                       rate = network->rates[i++] & 0x7F;
-               if (rate > max_rate)
-                       max_rate = rate;
-               p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-                             "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
-       }
-       for (; j < network->rates_ex_len; j++) {
-               rate = network->rates_ex[j] & 0x7F;
-               p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-                             "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
-               if (rate > max_rate)
-                       max_rate = rate;
-       }
-
-       if (network->mode >= IEEE_N_24G)//add N rate here;
-       {
-               PHT_CAPABILITY_ELE ht_cap = NULL;
-               bool is40M = false, isShortGI = false;
-               u8 max_mcs = 0;
-               if (!memcmp(network->bssht.bdHTCapBuf, EWC11NHTCap, 4))
-                       ht_cap = (PHT_CAPABILITY_ELE)&network->bssht.bdHTCapBuf[4];
-               else
-                       ht_cap = (PHT_CAPABILITY_ELE)&network->bssht.bdHTCapBuf[0];
-               is40M = (ht_cap->ChlWidth)?1:0;
-               isShortGI = (ht_cap->ChlWidth)?
-                                               ((ht_cap->ShortGI40Mhz)?1:0):
-                                               ((ht_cap->ShortGI20Mhz)?1:0);
-
-               max_mcs = HTGetHighestMCSRate(ieee, ht_cap->MCS, MCS_FILTER_ALL);
-               rate = MCS_DATA_RATE[is40M][isShortGI][max_mcs&0x7f];
-               if (rate > max_rate)
-                       max_rate = rate;
-       }
-       iwe.cmd = SIOCGIWRATE;
-       iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
-       iwe.u.bitrate.value = max_rate * 500000;
-        start = iwe_stream_add_event_rsl(info, start, stop, &iwe,
-                                    IW_EV_PARAM_LEN);
-       iwe.cmd = IWEVCUSTOM;
-       iwe.u.data.length = p - custom;
-       if (iwe.u.data.length)
-        start = iwe_stream_add_point(info, start, stop, &iwe, custom);
-       /* Add quality statistics */
-       /* TODO: Fix these values... */
-       iwe.cmd = IWEVQUAL;
-       iwe.u.qual.qual = network->stats.signal;
-       iwe.u.qual.level = network->stats.rssi;
-       iwe.u.qual.noise = network->stats.noise;
-       iwe.u.qual.updated = network->stats.mask & IEEE80211_STATMASK_WEMASK;
-       if (!(network->stats.mask & IEEE80211_STATMASK_RSSI))
-               iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID;
-       if (!(network->stats.mask & IEEE80211_STATMASK_NOISE))
-               iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID;
-       if (!(network->stats.mask & IEEE80211_STATMASK_SIGNAL))
-               iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID;
-       iwe.u.qual.updated = 7;
-        start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_QUAL_LEN);
-       iwe.cmd = IWEVCUSTOM;
-       p = custom;
-
-       iwe.u.data.length = p - custom;
-       if (iwe.u.data.length)
-            start = iwe_stream_add_point(info, start, stop, &iwe, custom);
-#if (WIRELESS_EXT < 18)
-       if (ieee->wpa_enabled && network->wpa_ie_len){
-               char buf[MAX_WPA_IE_LEN * 2 + 30];
-               u8 *p = buf;
-               p += sprintf(p, "wpa_ie=");
-               for (i = 0; i < network->wpa_ie_len; i++) {
-                       p += sprintf(p, "%02x", network->wpa_ie[i]);
-               }
-
-               memset(&iwe, 0, sizeof(iwe));
-               iwe.cmd = IWEVCUSTOM;
-               iwe.u.data.length = strlen(buf);
-                start = iwe_stream_add_point(info, start, stop, &iwe, buf);
-        }
-
-       if (ieee->wpa_enabled && network->rsn_ie_len){
-               char buf[MAX_WPA_IE_LEN * 2 + 30];
-
-               u8 *p = buf;
-               p += sprintf(p, "rsn_ie=");
-               for (i = 0; i < network->rsn_ie_len; i++) {
-                       p += sprintf(p, "%02x", network->rsn_ie[i]);
-               }
-
-               memset(&iwe, 0, sizeof(iwe));
-               iwe.cmd = IWEVCUSTOM;
-               iwe.u.data.length = strlen(buf);
-                start = iwe_stream_add_point(info, start, stop, &iwe, buf);
-        }
-#else
-       memset(&iwe, 0, sizeof(iwe));
-       if (network->wpa_ie_len)
-       {
-               char buf[MAX_WPA_IE_LEN];
-               memcpy(buf, network->wpa_ie, network->wpa_ie_len);
-               iwe.cmd = IWEVGENIE;
-               iwe.u.data.length = network->wpa_ie_len;
-                start = iwe_stream_add_point(info, start, stop, &iwe, buf);
-        }
-       memset(&iwe, 0, sizeof(iwe));
-       if (network->rsn_ie_len)
-       {
-               char buf[MAX_WPA_IE_LEN];
-               memcpy(buf, network->rsn_ie, network->rsn_ie_len);
-               iwe.cmd = IWEVGENIE;
-               iwe.u.data.length = network->rsn_ie_len;
-                start = iwe_stream_add_point(info, start, stop, &iwe, buf);
-        }
-#endif
-
-
-       /* Add EXTRA: Age to display seconds since last beacon/probe response
-        * for given network. */
-       iwe.cmd = IWEVCUSTOM;
-       p = custom;
-       p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
-                     " Last beacon: %lums ago", (jiffies - network->last_scanned) / (HZ / 100));
-       iwe.u.data.length = p - custom;
-       if (iwe.u.data.length)
-            start = iwe_stream_add_point(info, start, stop, &iwe, custom);
-
-       return start;
-}
-
-int ieee80211_wx_get_scan(struct ieee80211_device *ieee,
-                         struct iw_request_info *info,
-                         union iwreq_data *wrqu, char *extra)
-{
-       struct ieee80211_network *network;
-       unsigned long flags;
-
-       char *ev = extra;
-//     char *stop = ev + IW_SCAN_MAX_DATA;
-       char *stop = ev + wrqu->data.length;//IW_SCAN_MAX_DATA;
-       //char *stop = ev + IW_SCAN_MAX_DATA;
-       int i = 0;
-       int err = 0;
-       IEEE80211_DEBUG_WX("Getting scan\n");
-       down(&ieee->wx_sem);
-       spin_lock_irqsave(&ieee->lock, flags);
-
-       list_for_each_entry(network, &ieee->network_list, list) {
-               i++;
-               if((stop-ev)<200)
-               {
-                       err = -E2BIG;
-                       break;
-                                                                                               }
-               if (ieee->scan_age == 0 ||
-                   time_after(network->last_scanned + ieee->scan_age, jiffies))
-                       ev = rtl819x_translate_scan(ieee, ev, stop, network, info);
-               else
-                       IEEE80211_DEBUG_SCAN(
-                               "Not showing network '%s ("
-                               "%pM)' due to age (%lums).\n",
-                               escape_essid(network->ssid,
-                                            network->ssid_len),
-                               network->bssid,
-                               (jiffies - network->last_scanned) / (HZ / 100));
-       }
-
-       spin_unlock_irqrestore(&ieee->lock, flags);
-       up(&ieee->wx_sem);
-       wrqu->data.length = ev -  extra;
-       wrqu->data.flags = 0;
-
-       IEEE80211_DEBUG_WX("exit: %d networks returned.\n", i);
-
-       return err;
-}
-
-int ieee80211_wx_set_encode(struct ieee80211_device *ieee,
-                           struct iw_request_info *info,
-                           union iwreq_data *wrqu, char *keybuf)
-{
-       struct iw_point *erq = &(wrqu->encoding);
-       struct net_device *dev = ieee->dev;
-       struct ieee80211_security sec = {
-               .flags = 0
-       };
-       int i, key, key_provided, len;
-       struct ieee80211_crypt_data **crypt;
-
-       IEEE80211_DEBUG_WX("SET_ENCODE\n");
-
-       key = erq->flags & IW_ENCODE_INDEX;
-       if (key) {
-               if (key > WEP_KEYS)
-                       return -EINVAL;
-               key--;
-               key_provided = 1;
-       } else {
-               key_provided = 0;
-               key = ieee->tx_keyidx;
-       }
-
-       IEEE80211_DEBUG_WX("Key: %d [%s]\n", key, key_provided ?
-                          "provided" : "default");
-       crypt = &ieee->crypt[key];
-
-       if (erq->flags & IW_ENCODE_DISABLED) {
-               if (key_provided && *crypt) {
-                       IEEE80211_DEBUG_WX("Disabling encryption on key %d.\n",
-                                          key);
-                       ieee80211_crypt_delayed_deinit(ieee, crypt);
-               } else
-                       IEEE80211_DEBUG_WX("Disabling encryption.\n");
-
-               /* Check all the keys to see if any are still configured,
-                * and if no key index was provided, de-init them all */
-               for (i = 0; i < WEP_KEYS; i++) {
-                       if (ieee->crypt[i] != NULL) {
-                               if (key_provided)
-                                       break;
-                               ieee80211_crypt_delayed_deinit(
-                                       ieee, &ieee->crypt[i]);
-                       }
-               }
-
-               if (i == WEP_KEYS) {
-                       sec.enabled = 0;
-                       sec.level = SEC_LEVEL_0;
-                       sec.flags |= SEC_ENABLED | SEC_LEVEL;
-               }
-
-               goto done;
-       }
-
-
-
-       sec.enabled = 1;
-       sec.flags |= SEC_ENABLED;
-
-       if (*crypt != NULL && (*crypt)->ops != NULL &&
-           strcmp((*crypt)->ops->name, "WEP") != 0) {
-               /* changing to use WEP; deinit previously used algorithm
-                * on this key */
-               ieee80211_crypt_delayed_deinit(ieee, crypt);
-       }
-
-       if (*crypt == NULL) {
-               struct ieee80211_crypt_data *new_crypt;
-
-               /* take WEP into use */
-               new_crypt = kzalloc(sizeof(struct ieee80211_crypt_data),
-                                   GFP_KERNEL);
-               if (new_crypt == NULL)
-                       return -ENOMEM;
-               new_crypt->ops = ieee80211_get_crypto_ops("WEP");
-               if (!new_crypt->ops)
-                       new_crypt->ops = ieee80211_get_crypto_ops("WEP");
-               if (new_crypt->ops)
-                       new_crypt->priv = new_crypt->ops->init(key);
-
-               if (!new_crypt->ops || !new_crypt->priv) {
-                       kfree(new_crypt);
-                       new_crypt = NULL;
-
-                       printk(KERN_WARNING "%s: could not initialize WEP: "
-                              "load module ieee80211_crypt_wep\n",
-                              dev->name);
-                       return -EOPNOTSUPP;
-               }
-               *crypt = new_crypt;
-       }
-
-       /* If a new key was provided, set it up */
-       if (erq->length > 0) {
-               len = erq->length <= 5 ? 5 : 13;
-               memcpy(sec.keys[key], keybuf, erq->length);
-               if (len > erq->length)
-                       memset(sec.keys[key] + erq->length, 0,
-                              len - erq->length);
-               IEEE80211_DEBUG_WX("Setting key %d to '%s' (%d:%d bytes)\n",
-                                  key, escape_essid(sec.keys[key], len),
-                                  erq->length, len);
-               sec.key_sizes[key] = len;
-               (*crypt)->ops->set_key(sec.keys[key], len, NULL,
-                                      (*crypt)->priv);
-               sec.flags |= (1 << key);
-               /* This ensures a key will be activated if no key is
-                * explicitely set */
-               if (key == sec.active_key)
-                       sec.flags |= SEC_ACTIVE_KEY;
-               ieee->tx_keyidx = key;
-
-       } else {
-               len = (*crypt)->ops->get_key(sec.keys[key], WEP_KEY_LEN,
-                                            NULL, (*crypt)->priv);
-               if (len == 0) {
-                       /* Set a default key of all 0 */
-                       printk("Setting key %d to all zero.\n",
-                                          key);
-
-                       IEEE80211_DEBUG_WX("Setting key %d to all zero.\n",
-                                          key);
-                       memset(sec.keys[key], 0, 13);
-                       (*crypt)->ops->set_key(sec.keys[key], 13, NULL,
-                                              (*crypt)->priv);
-                       sec.key_sizes[key] = 13;
-                       sec.flags |= (1 << key);
-               }
-
-               /* No key data - just set the default TX key index */
-               if (key_provided) {
-                       IEEE80211_DEBUG_WX(
-                               "Setting key %d to default Tx key.\n", key);
-                       ieee->tx_keyidx = key;
-                       sec.active_key = key;
-                       sec.flags |= SEC_ACTIVE_KEY;
-               }
-       }
-
- done:
-       ieee->open_wep = !(erq->flags & IW_ENCODE_RESTRICTED);
-       ieee->auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY;
-       sec.auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY;
-       sec.flags |= SEC_AUTH_MODE;
-       IEEE80211_DEBUG_WX("Auth: %s\n", sec.auth_mode == WLAN_AUTH_OPEN ?
-                          "OPEN" : "SHARED KEY");
-
-       /* For now we just support WEP, so only set that security level...
-        * TODO: When WPA is added this is one place that needs to change */
-       sec.flags |= SEC_LEVEL;
-       sec.level = SEC_LEVEL_1; /* 40 and 104 bit WEP */
-
-       if (ieee->set_security)
-               ieee->set_security(ieee, &sec);
-
-       /* Do not reset port if card is in Managed mode since resetting will
-        * generate new IEEE 802.11 authentication which may end up in looping
-        * with IEEE 802.1X.  If your hardware requires a reset after WEP
-        * configuration (for example... Prism2), implement the reset_port in
-        * the callbacks structures used to initialize the 802.11 stack. */
-       if (ieee->reset_on_keychange &&
-           ieee->iw_mode != IW_MODE_INFRA &&
-           ieee->reset_port && ieee->reset_port(ieee)) {
-               printk(KERN_DEBUG "%s: reset_port failed\n", dev->name);
-               return -EINVAL;
-       }
-       return 0;
-}
-
-int ieee80211_wx_get_encode(struct ieee80211_device *ieee,
-                           struct iw_request_info *info,
-                           union iwreq_data *wrqu, char *keybuf)
-{
-       struct iw_point *erq = &(wrqu->encoding);
-       int len, key;
-       struct ieee80211_crypt_data *crypt;
-
-       IEEE80211_DEBUG_WX("GET_ENCODE\n");
-
-       if(ieee->iw_mode == IW_MODE_MONITOR)
-               return -1;
-
-       key = erq->flags & IW_ENCODE_INDEX;
-       if (key) {
-               if (key > WEP_KEYS)
-                       return -EINVAL;
-               key--;
-       } else
-               key = ieee->tx_keyidx;
-
-       crypt = ieee->crypt[key];
-       erq->flags = key + 1;
-
-       if (crypt == NULL || crypt->ops == NULL) {
-               erq->length = 0;
-               erq->flags |= IW_ENCODE_DISABLED;
-               return 0;
-       }
-#if 0
-       if (strcmp(crypt->ops->name, "WEP") != 0) {
-               /* only WEP is supported with wireless extensions, so just
-                * report that encryption is used */
-               erq->length = 0;
-               erq->flags |= IW_ENCODE_ENABLED;
-               return 0;
-       }
-#endif
-       len = crypt->ops->get_key(keybuf, SCM_KEY_LEN, NULL, crypt->priv);
-       erq->length = (len >= 0 ? len : 0);
-
-       erq->flags |= IW_ENCODE_ENABLED;
-
-       if (ieee->open_wep)
-               erq->flags |= IW_ENCODE_OPEN;
-       else
-               erq->flags |= IW_ENCODE_RESTRICTED;
-
-       return 0;
-}
-#if (WIRELESS_EXT >= 18)
-int ieee80211_wx_set_encode_ext(struct ieee80211_device *ieee,
-                               struct iw_request_info *info,
-                               union iwreq_data *wrqu, char *extra)
-{
-       int ret = 0;
-       struct net_device *dev = ieee->dev;
-        struct iw_point *encoding = &wrqu->encoding;
-        struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
-        int i, idx;
-        int group_key = 0;
-        const char *alg;
-        struct ieee80211_crypto_ops *ops;
-        struct ieee80211_crypt_data **crypt;
-
-        struct ieee80211_security sec = {
-                .flags = 0,
-        };
-        idx = encoding->flags & IW_ENCODE_INDEX;
-        if (idx) {
-                if (idx < 1 || idx > WEP_KEYS)
-                        return -EINVAL;
-                idx--;
-        } else
-                idx = ieee->tx_keyidx;
-
-        if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
-
-                crypt = &ieee->crypt[idx];
-
-                group_key = 1;
-        } else {
-                /* some Cisco APs use idx>0 for unicast in dynamic WEP */
-                if (idx != 0 && ext->alg != IW_ENCODE_ALG_WEP)
-                        return -EINVAL;
-                if (ieee->iw_mode == IW_MODE_INFRA)
-
-                        crypt = &ieee->crypt[idx];
-
-                else
-                        return -EINVAL;
-        }
-
-        sec.flags |= SEC_ENABLED;// | SEC_ENCRYPT;
-        if ((encoding->flags & IW_ENCODE_DISABLED) ||
-            ext->alg == IW_ENCODE_ALG_NONE) {
-                if (*crypt)
-                        ieee80211_crypt_delayed_deinit(ieee, crypt);
-
-                for (i = 0; i < WEP_KEYS; i++)
-
-                       if (ieee->crypt[i] != NULL)
-
-                                break;
-
-                if (i == WEP_KEYS) {
-                        sec.enabled = 0;
-                      //  sec.encrypt = 0;
-                        sec.level = SEC_LEVEL_0;
-                        sec.flags |= SEC_LEVEL;
-                }
-                goto done;
-        }
-
-       sec.enabled = 1;
-    //    sec.encrypt = 1;
-#if 0
-        if (group_key ? !ieee->host_mc_decrypt :
-            !(ieee->host_encrypt || ieee->host_decrypt ||
-              ieee->host_encrypt_msdu))
-                goto skip_host_crypt;
-#endif
-        switch (ext->alg) {
-        case IW_ENCODE_ALG_WEP:
-                alg = "WEP";
-                break;
-        case IW_ENCODE_ALG_TKIP:
-                alg = "TKIP";
-                break;
-        case IW_ENCODE_ALG_CCMP:
-                alg = "CCMP";
-                break;
-        default:
-                IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n",
-                                   dev->name, ext->alg);
-                ret = -EINVAL;
-                goto done;
-        }
-       printk("alg name:%s\n",alg);
-
-        ops = ieee80211_get_crypto_ops(alg);
-        if (ops == NULL)
-                ops = ieee80211_get_crypto_ops(alg);
-        if (ops == NULL) {
-                IEEE80211_DEBUG_WX("%s: unknown crypto alg %d\n",
-                                   dev->name, ext->alg);
-               printk("========>unknown crypto alg %d\n", ext->alg);
-                ret = -EINVAL;
-                goto done;
-        }
-
-        if (*crypt == NULL || (*crypt)->ops != ops) {
-                struct ieee80211_crypt_data *new_crypt;
-
-                ieee80211_crypt_delayed_deinit(ieee, crypt);
-
-#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
-                new_crypt = kzalloc(sizeof(*new_crypt), GFP_KERNEL);
-#else
-                new_crypt = kmalloc(sizeof(*new_crypt), GFP_KERNEL);
-               memset(new_crypt,0,sizeof(*new_crypt));
-#endif
-                if (new_crypt == NULL) {
-                        ret = -ENOMEM;
-                        goto done;
-                }
-                new_crypt->ops = ops;
-                if (new_crypt->ops)
-                        new_crypt->priv = new_crypt->ops->init(idx);
-                if (new_crypt->priv == NULL) {
-                        kfree(new_crypt);
-                        ret = -EINVAL;
-                        goto done;
-                }
-                *crypt = new_crypt;
-
-       }
-
-        if (ext->key_len > 0 && (*crypt)->ops->set_key &&
-            (*crypt)->ops->set_key(ext->key, ext->key_len, ext->rx_seq,
-                                   (*crypt)->priv) < 0) {
-                IEEE80211_DEBUG_WX("%s: key setting failed\n", dev->name);
-               printk("key setting failed\n");
-                ret = -EINVAL;
-                goto done;
-        }
-#if 1
-        if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
-                ieee->tx_keyidx = idx;
-                sec.active_key = idx;
-                sec.flags |= SEC_ACTIVE_KEY;
-        }
-
-        if (ext->alg != IW_ENCODE_ALG_NONE) {
-                //memcpy(sec.keys[idx], ext->key, ext->key_len);
-                sec.key_sizes[idx] = ext->key_len;
-                sec.flags |= (1 << idx);
-                if (ext->alg == IW_ENCODE_ALG_WEP) {
-                      //  sec.encode_alg[idx] = SEC_ALG_WEP;
-                        sec.flags |= SEC_LEVEL;
-                        sec.level = SEC_LEVEL_1;
-                } else if (ext->alg == IW_ENCODE_ALG_TKIP) {
-                      //  sec.encode_alg[idx] = SEC_ALG_TKIP;
-                        sec.flags |= SEC_LEVEL;
-                        sec.level = SEC_LEVEL_2;
-                } else if (ext->alg == IW_ENCODE_ALG_CCMP) {
-                       // sec.encode_alg[idx] = SEC_ALG_CCMP;
-                        sec.flags |= SEC_LEVEL;
-                        sec.level = SEC_LEVEL_3;
-                }
-                /* Don't set sec level for group keys. */
-                if (group_key)
-                        sec.flags &= ~SEC_LEVEL;
-        }
-#endif
-done:
-        if (ieee->set_security)
-               ieee->set_security(ieee, &sec);
-
-        if (ieee->reset_on_keychange &&
-            ieee->iw_mode != IW_MODE_INFRA &&
-            ieee->reset_port && ieee->reset_port(ieee)) {
-                IEEE80211_DEBUG_WX("%s: reset_port failed\n", dev->name);
-                return -EINVAL;
-        }
-        return ret;
-}
-
-int ieee80211_wx_get_encode_ext(struct ieee80211_device *ieee,
-                              struct iw_request_info *info,
-                              union iwreq_data *wrqu, char *extra)
-{
-       struct iw_point *encoding = &wrqu->encoding;
-       struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
-       struct ieee80211_crypt_data *crypt;
-       int idx, max_key_len;
-
-       max_key_len = encoding->length - sizeof(*ext);
-       if (max_key_len < 0)
-               return -EINVAL;
-
-       idx = encoding->flags & IW_ENCODE_INDEX;
-       if (idx) {
-               if (idx < 1 || idx > WEP_KEYS)
-                       return -EINVAL;
-               idx--;
-       } else
-               idx = ieee->tx_keyidx;
-
-       if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) &&
-           ext->alg != IW_ENCODE_ALG_WEP)
-               if (idx != 0 || ieee->iw_mode != IW_MODE_INFRA)
-                       return -EINVAL;
-
-       crypt = ieee->crypt[idx];
-       encoding->flags = idx + 1;
-       memset(ext, 0, sizeof(*ext));
-
-       if (crypt == NULL || crypt->ops == NULL ) {
-               ext->alg = IW_ENCODE_ALG_NONE;
-               ext->key_len = 0;
-               encoding->flags |= IW_ENCODE_DISABLED;
-       } else {
-               if (strcmp(crypt->ops->name, "WEP") == 0 )
-                       ext->alg = IW_ENCODE_ALG_WEP;
-               else if (strcmp(crypt->ops->name, "TKIP"))
-                       ext->alg = IW_ENCODE_ALG_TKIP;
-               else if (strcmp(crypt->ops->name, "CCMP"))
-                       ext->alg = IW_ENCODE_ALG_CCMP;
-               else
-                       return -EINVAL;
-               ext->key_len = crypt->ops->get_key(ext->key, SCM_KEY_LEN, NULL, crypt->priv);
-               encoding->flags |= IW_ENCODE_ENABLED;
-               if (ext->key_len &&
-                   (ext->alg == IW_ENCODE_ALG_TKIP ||
-                    ext->alg == IW_ENCODE_ALG_CCMP))
-                       ext->ext_flags |= IW_ENCODE_EXT_TX_SEQ_VALID;
-
-       }
-
-       return 0;
-}
-
-int ieee80211_wx_set_mlme(struct ieee80211_device *ieee,
-                               struct iw_request_info *info,
-                               union iwreq_data *wrqu, char *extra)
-{
-       struct iw_mlme *mlme = (struct iw_mlme *) extra;
-       switch (mlme->cmd) {
-        case IW_MLME_DEAUTH:
-       case IW_MLME_DISASSOC:
-               ieee80211_disassociate(ieee);
-               break;
-        default:
-                return -EOPNOTSUPP;
-        }
-       return 0;
-}
-
-int ieee80211_wx_set_auth(struct ieee80211_device *ieee,
-                               struct iw_request_info *info,
-                               struct iw_param *data, char *extra)
-{
-       switch (data->flags & IW_AUTH_INDEX) {
-        case IW_AUTH_WPA_VERSION:
-            /*need to support wpa2 here*/
-               break;
-        case IW_AUTH_CIPHER_PAIRWISE:
-        case IW_AUTH_CIPHER_GROUP:
-        case IW_AUTH_KEY_MGMT:
-                /*
- *                  * Host AP driver does not use these parameters and allows
- *                                   * wpa_supplicant to control them internally.
- *                                                    */
-                break;
-        case IW_AUTH_TKIP_COUNTERMEASURES:
-                ieee->tkip_countermeasures = data->value;
-                break;
-        case IW_AUTH_DROP_UNENCRYPTED:
-                ieee->drop_unencrypted = data->value;
-               break;
-
-       case IW_AUTH_80211_AUTH_ALG:
-               if(data->value & IW_AUTH_ALG_SHARED_KEY){
-                       ieee->open_wep = 0;
-                       ieee->auth_mode = 1;
-               }
-               else if(data->value & IW_AUTH_ALG_OPEN_SYSTEM){
-                       ieee->open_wep = 1;
-                       ieee->auth_mode = 0;
-               }
-               else if(data->value & IW_AUTH_ALG_LEAP){
-                       ieee->open_wep = 1;
-                       ieee->auth_mode = 2;
-               }
-               else
-                       return -EINVAL;
-               break;
-
-#if 1
-       case IW_AUTH_WPA_ENABLED:
-               ieee->wpa_enabled = (data->value)?1:0;
-               break;
-
-#endif
-       case IW_AUTH_RX_UNENCRYPTED_EAPOL:
-                ieee->ieee802_1x = data->value;
-               break;
-       case IW_AUTH_PRIVACY_INVOKED:
-               ieee->privacy_invoked = data->value;
-               break;
-       default:
-                return -EOPNOTSUPP;
-       }
-       return 0;
-}
-#endif
-#if 1
-int ieee80211_wx_set_gen_ie(struct ieee80211_device *ieee, u8 *ie, size_t len)
-{
-       u8 *buf;
-
-       if (len>MAX_WPA_IE_LEN || (len && ie == NULL))
-       {
-       return -EINVAL;
-       }
-
-
-       if (len)
-       {
-               if (len != ie[1]+2)
-               {
-                       printk("len:%zu, ie:%d\n", len, ie[1]);
-                       return -EINVAL;
-               }
-               buf = kmemdup(ie, len, GFP_KERNEL);
-               if (buf == NULL)
-                       return -ENOMEM;
-               kfree(ieee->wpa_ie);
-               ieee->wpa_ie = buf;
-               ieee->wpa_ie_len = len;
-       }
-       else{
-               kfree(ieee->wpa_ie);
-               ieee->wpa_ie = NULL;
-               ieee->wpa_ie_len = 0;
-       }
-       return 0;
-
-}
-#endif
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_BA.h b/drivers/staging/rtl8192e/ieee80211/rtl819x_BA.h
deleted file mode 100644 (file)
index 8ddc8bf..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef _BATYPE_H_
-#define _BATYPE_H_
-
-#define        TOTAL_TXBA_NUM  16
-#define        TOTAL_RXBA_NUM  16
-
-#define        BA_SETUP_TIMEOUT        200
-#define        BA_INACT_TIMEOUT        60000
-
-#define        BA_POLICY_DELAYED               0
-#define        BA_POLICY_IMMEDIATE     1
-
-#define        ADDBA_STATUS_SUCCESS                    0
-#define        ADDBA_STATUS_REFUSED            37
-#define        ADDBA_STATUS_INVALID_PARAM      38
-
-#define        DELBA_REASON_QSTA_LEAVING       36
-#define        DELBA_REASON_END_BA                     37
-#define        DELBA_REASON_UNKNOWN_BA 38
-#define        DELBA_REASON_TIMEOUT                    39
-/*  whether need define BA Action frames here?
-struct ieee80211_ADDBA_Req{
-       struct ieee80211_header_data header;
-       u8      category;
-       u8
-} __attribute__ ((packed));
-*/
-//Is this need?I put here just to make it easier to define structure BA_RECORD //WB
-typedef union _SEQUENCE_CONTROL{
-       u16 ShortData;
-       struct
-       {
-               u16     FragNum:4;
-               u16     SeqNum:12;
-       }field;
-}SEQUENCE_CONTROL, *PSEQUENCE_CONTROL;
-
-typedef union _BA_PARAM_SET {
-       u8 charData[2];
-       u16 shortData;
-       struct {
-               u16 AMSDU_Support:1;
-               u16 BAPolicy:1;
-               u16 TID:4;
-               u16 BufferSize:10;
-       } field;
-} BA_PARAM_SET, *PBA_PARAM_SET;
-
-typedef union _DELBA_PARAM_SET {
-       u8 charData[2];
-       u16 shortData;
-       struct {
-               u16 Reserved:11;
-               u16 Initiator:1;
-               u16 TID:4;
-       } field;
-} DELBA_PARAM_SET, *PDELBA_PARAM_SET;
-
-typedef struct _BA_RECORD {
-       struct timer_list               Timer;
-       u8                              bValid;
-       u8                              DialogToken;
-       BA_PARAM_SET            BaParamSet;
-       u16                             BaTimeoutValue;
-       SEQUENCE_CONTROL        BaStartSeqCtrl;
-} BA_RECORD, *PBA_RECORD;
-
-#endif //end _BATYPE_H_
-
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_BAProc.c b/drivers/staging/rtl8192e/ieee80211/rtl819x_BAProc.c
deleted file mode 100644 (file)
index b690cbc..0000000
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * This file is created to process BA Action Frame. According to 802.11 spec,
- * there are 3 BA action types at all. And as BA is related to TS, this part
- * need some struture defined in QOS side code. Also TX RX is going to be
- * resturctured, so how to send ADDBAREQ ADDBARSP and DELBA packet is still
- * on consideration. Temporarily use MANAGE QUEUE instead of Normal Queue.
- */
-#include "ieee80211.h"
-#include "rtl819x_BA.h"
-
-/*
- * Activate BA entry. And if Time is nozero, start timer.
- */
-void ActivateBAEntry(struct ieee80211_device* ieee, PBA_RECORD pBA, u16 Time)
-{
-       pBA->bValid = true;
-       if(Time != 0)
-               mod_timer(&pBA->Timer, jiffies + MSECS(Time));
-}
-
-/*
- * deactivate BA entry, including its timer.
- */
-void DeActivateBAEntry( struct ieee80211_device* ieee, PBA_RECORD pBA)
-{
-       pBA->bValid = false;
-       del_timer_sync(&pBA->Timer);
-}
-
-/*
- * deactivete BA entry in Tx Ts, and send DELBA.
- */
-u8 TxTsDeleteBA( struct ieee80211_device* ieee, PTX_TS_RECORD  pTxTs)
-{
-       PBA_RECORD              pAdmittedBa = &pTxTs->TxAdmittedBARecord;  //These two BA entries must exist in TS structure
-       PBA_RECORD              pPendingBa = &pTxTs->TxPendingBARecord;
-       u8                      bSendDELBA = false;
-
-       // Delete pending BA
-       if(pPendingBa->bValid)
-       {
-               DeActivateBAEntry(ieee, pPendingBa);
-               bSendDELBA = true;
-       }
-
-       // Delete admitted BA
-       if(pAdmittedBa->bValid)
-       {
-               DeActivateBAEntry(ieee, pAdmittedBa);
-               bSendDELBA = true;
-       }
-
-       return bSendDELBA;
-}
-
-/*
- * deactivete BA entry in Tx Ts, and send DELBA.
- */
-u8 RxTsDeleteBA( struct ieee80211_device* ieee, PRX_TS_RECORD  pRxTs)
-{
-       PBA_RECORD              pBa = &pRxTs->RxAdmittedBARecord;
-       u8                      bSendDELBA = false;
-
-       if(pBa->bValid)
-       {
-               DeActivateBAEntry(ieee, pBa);
-               bSendDELBA = true;
-       }
-
-       return bSendDELBA;
-}
-
-/*
- * reset BA entry
- */
-void ResetBaEntry( PBA_RECORD pBA)
-{
-       pBA->bValid                     = false;
-       pBA->BaParamSet.shortData       = 0;
-       pBA->BaTimeoutValue             = 0;
-       pBA->DialogToken                = 0;
-       pBA->BaStartSeqCtrl.ShortData   = 0;
-}
-
-/*
- * construct ADDBAREQ and ADDBARSP frame here together.
- * return constructed skb to xmit
- */
-static struct sk_buff* ieee80211_ADDBA(struct ieee80211_device* ieee, u8* Dst, PBA_RECORD pBA, u16 StatusCode, u8 type)
-{
-       struct sk_buff *skb = NULL;
-        struct ieee80211_hdr_3addr* BAReq = NULL;
-       u8* tag = NULL;
-       u16 tmp = 0;
-       u16 len = ieee->tx_headroom + 9;
-       //category(1) + action field(1) + Dialog Token(1) + BA Parameter Set(2) +  BA Timeout Value(2) +  BA Start SeqCtrl(2)(or StatusCode(2))
-       IEEE80211_DEBUG(IEEE80211_DL_TRACE | IEEE80211_DL_BA, "========>%s(), frame(%d) sentd to:%pM, ieee->dev:%p\n", __FUNCTION__, type, Dst, ieee->dev);
-       if (pBA == NULL||ieee == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "pBA(%p) is NULL or ieee(%p) is NULL\n", pBA, ieee);
-               return NULL;
-       }
-       skb = dev_alloc_skb(len + sizeof( struct ieee80211_hdr_3addr)); //need to add something others? FIXME
-       if (skb == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc skb for ADDBA_REQ\n");
-               return NULL;
-       }
-
-       memset(skb->data, 0, sizeof( struct ieee80211_hdr_3addr));      //I wonder whether it's necessary. Apparently kernel will not do it when alloc a skb.
-       skb_reserve(skb, ieee->tx_headroom);
-
-       BAReq = ( struct ieee80211_hdr_3addr *) skb_put(skb,sizeof( struct ieee80211_hdr_3addr));
-
-       memcpy(BAReq->addr1, Dst, ETH_ALEN);
-       memcpy(BAReq->addr2, ieee->dev->dev_addr, ETH_ALEN);
-
-       memcpy(BAReq->addr3, ieee->current_network.bssid, ETH_ALEN);
-
-       BAReq->frame_ctl = cpu_to_le16(IEEE80211_STYPE_MANAGE_ACT); //action frame
-
-       //tag += sizeof( struct ieee80211_hdr_3addr); //move to action field
-       tag = (u8*)skb_put(skb, 9);
-       *tag ++= ACT_CAT_BA;
-       *tag ++= type;
-       // Dialog Token
-       *tag ++= pBA->DialogToken;
-
-       if (ACT_ADDBARSP == type)
-       {
-               // Status Code
-               printk("=====>to send ADDBARSP\n");
-               tmp = cpu_to_le16(StatusCode);
-               memcpy(tag, (u8*)&tmp, 2);
-               tag += 2;
-       }
-       // BA Parameter Set
-       tmp = cpu_to_le16(pBA->BaParamSet.shortData);
-       memcpy(tag, (u8*)&tmp, 2);
-       tag += 2;
-       // BA Timeout Value
-       tmp = cpu_to_le16(pBA->BaTimeoutValue);
-       memcpy(tag, (u8*)&tmp, 2);
-       tag += 2;
-
-       if (ACT_ADDBAREQ == type)
-       {
-       // BA Start SeqCtrl
-               memcpy(tag,(u8*)&(pBA->BaStartSeqCtrl), 2);
-               tag += 2;
-       }
-
-       IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
-       return skb;
-       //return NULL;
-}
-
-/*
- * construct DELBA frame
- */
-static struct sk_buff* ieee80211_DELBA(
-       struct ieee80211_device* ieee,
-       u8*                      dst,
-       PBA_RECORD               pBA,
-       TR_SELECT                TxRxSelect,
-       u16                      ReasonCode
-       )
-{
-       DELBA_PARAM_SET DelbaParamSet;
-       struct sk_buff *skb = NULL;
-        struct ieee80211_hdr_3addr* Delba = NULL;
-       u8* tag = NULL;
-       u16 tmp = 0;
-       //len = head len + DELBA Parameter Set(2) + Reason Code(2)
-       u16 len = 6 + ieee->tx_headroom;
-
-       if (net_ratelimit())
-       IEEE80211_DEBUG(IEEE80211_DL_TRACE | IEEE80211_DL_BA, "========>%s(), ReasonCode(%d) sentd to:%pM\n", __FUNCTION__, ReasonCode, dst);
-
-       memset(&DelbaParamSet, 0, 2);
-
-       DelbaParamSet.field.Initiator   = (TxRxSelect==TX_DIR)?1:0;
-       DelbaParamSet.field.TID = pBA->BaParamSet.field.TID;
-
-       skb = dev_alloc_skb(len + sizeof( struct ieee80211_hdr_3addr)); //need to add something others? FIXME
-       if (skb == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't alloc skb for ADDBA_REQ\n");
-               return NULL;
-       }
-//     memset(skb->data, 0, len+sizeof( struct ieee80211_hdr_3addr));
-       skb_reserve(skb, ieee->tx_headroom);
-
-       Delba = ( struct ieee80211_hdr_3addr *) skb_put(skb,sizeof( struct ieee80211_hdr_3addr));
-
-       memcpy(Delba->addr1, dst, ETH_ALEN);
-       memcpy(Delba->addr2, ieee->dev->dev_addr, ETH_ALEN);
-       memcpy(Delba->addr3, ieee->current_network.bssid, ETH_ALEN);
-       Delba->frame_ctl = cpu_to_le16(IEEE80211_STYPE_MANAGE_ACT); //action frame
-
-       tag = (u8*)skb_put(skb, 6);
-
-       *tag ++= ACT_CAT_BA;
-       *tag ++= ACT_DELBA;
-
-       // DELBA Parameter Set
-       tmp = cpu_to_le16(DelbaParamSet.shortData);
-       memcpy(tag, (u8*)&tmp, 2);
-       tag += 2;
-       // Reason Code
-       tmp = cpu_to_le16(ReasonCode);
-       memcpy(tag, (u8*)&tmp, 2);
-       tag += 2;
-
-       IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
-       if (net_ratelimit())
-       IEEE80211_DEBUG(IEEE80211_DL_TRACE | IEEE80211_DL_BA, "<=====%s()\n", __FUNCTION__);
-       return skb;
-}
-
-/*
- * send ADDBAReq frame out
- * If any possible, please hide pBA in ieee.
- * And temporarily use Manage Queue as softmac_mgmt_xmit() usually does
- */
-void ieee80211_send_ADDBAReq(struct ieee80211_device* ieee, u8*        dst, PBA_RECORD pBA)
-{
-       struct sk_buff *skb = NULL;
-       skb = ieee80211_ADDBA(ieee, dst, pBA, 0, ACT_ADDBAREQ); //construct ACT_ADDBAREQ frames so set statuscode zero.
-
-       if (skb)
-       {
-               softmac_mgmt_xmit(skb, ieee);
-               //add statistic needed here.
-               //and skb will be freed in softmac_mgmt_xmit(), so omit all dev_kfree_skb_any() outside softmac_mgmt_xmit()
-               //WB
-       }
-       else
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "alloc skb error in function %s()\n", __FUNCTION__);
-       }
-}
-
-/*
- * send ADDBARSP frame out
- *  If any possible, please hide pBA in ieee.
- * And temporarily use Manage Queue as softmac_mgmt_xmit() usually does
- */
-void ieee80211_send_ADDBARsp(struct ieee80211_device* ieee, u8* dst, PBA_RECORD pBA, u16 StatusCode)
-{
-       struct sk_buff *skb = NULL;
-       skb = ieee80211_ADDBA(ieee, dst, pBA, StatusCode, ACT_ADDBARSP); //construct ACT_ADDBARSP frames
-       if (skb)
-       {
-               softmac_mgmt_xmit(skb, ieee);
-               //same above
-       }
-       else
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "alloc skb error in function %s()\n", __FUNCTION__);
-       }
-}
-
-/*
- * send ADDBARSP frame out
- * If any possible, please hide pBA in ieee.
- * And temporarily use Manage Queue as softmac_mgmt_xmit() usually does
- */
-void ieee80211_send_DELBA(struct ieee80211_device* ieee, u8* dst, PBA_RECORD pBA, TR_SELECT TxRxSelect, u16 ReasonCode)
-{
-       struct sk_buff *skb = NULL;
-       skb = ieee80211_DELBA(ieee, dst, pBA, TxRxSelect, ReasonCode); //construct ACT_ADDBARSP frames
-       if (skb)
-       {
-               softmac_mgmt_xmit(skb, ieee);
-               //same above
-       }
-       else
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "alloc skb error in function %s()\n", __FUNCTION__);
-       }
-       return ;
-}
-
-int ieee80211_rx_ADDBAReq( struct ieee80211_device* ieee, struct sk_buff *skb)
-{
-        struct ieee80211_hdr_3addr* req = NULL;
-       u16 rc = 0;
-       u8 * dst = NULL, *pDialogToken = NULL, *tag = NULL;
-       PBA_RECORD pBA = NULL;
-       PBA_PARAM_SET   pBaParamSet = NULL;
-       u16* pBaTimeoutVal = NULL;
-       PSEQUENCE_CONTROL pBaStartSeqCtrl = NULL;
-       PRX_TS_RECORD   pTS = NULL;
-
-       if (skb->len < sizeof( struct ieee80211_hdr_3addr) + 9)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, " Invalid skb len in BAREQ(%d / %zu)\n", skb->len,    (sizeof( struct ieee80211_hdr_3addr) + 9));
-               return -1;
-       }
-
-       IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
-
-       req = ( struct ieee80211_hdr_3addr*) skb->data;
-       tag = (u8*)req;
-       dst = (u8*)(&req->addr2[0]);
-       tag += sizeof( struct ieee80211_hdr_3addr);
-       pDialogToken = tag + 2;  //category+action
-       pBaParamSet = (PBA_PARAM_SET)(tag + 3);   //+DialogToken
-       pBaTimeoutVal = (u16*)(tag + 5);
-       pBaStartSeqCtrl = (PSEQUENCE_CONTROL)(req + 7);
-
-       printk("====================>rx ADDBAREQ from :%pM\n", dst);
-//some other capability is not ready now.
-       if(     (ieee->current_network.qos_data.active == 0) ||
-               (ieee->pHTInfo->bCurrentHTSupport == false)) //||
-       //      (ieee->pStaQos->bEnableRxImmBA == false)        )
-       {
-               rc = ADDBA_STATUS_REFUSED;
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "Failed to reply on ADDBA_REQ as some capability is not ready(%d, %d)\n", ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport);
-               goto OnADDBAReq_Fail;
-       }
-       // Search for related traffic stream.
-       // If there is no matched TS, reject the ADDBA request.
-       if(     !GetTs(
-                       ieee,
-                       (PTS_COMMON_INFO*)(&pTS),
-                       dst,
-                       (u8)(pBaParamSet->field.TID),
-                       RX_DIR,
-                       true)   )
-       {
-               rc = ADDBA_STATUS_REFUSED;
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't get TS in %s()\n", __FUNCTION__);
-               goto OnADDBAReq_Fail;
-       }
-       pBA = &pTS->RxAdmittedBARecord;
-       // To Determine the ADDBA Req content
-       // We can do much more check here, including BufferSize, AMSDU_Support, Policy, StartSeqCtrl...
-       // I want to check StartSeqCtrl to make sure when we start aggregation!!!
-       //
-       if(pBaParamSet->field.BAPolicy == BA_POLICY_DELAYED)
-       {
-               rc = ADDBA_STATUS_INVALID_PARAM;
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "BA Policy is not correct in %s()\n", __FUNCTION__);
-               goto OnADDBAReq_Fail;
-       }
-               // Admit the ADDBA Request
-       //
-       DeActivateBAEntry(ieee, pBA);
-       pBA->DialogToken = *pDialogToken;
-       pBA->BaParamSet = *pBaParamSet;
-       pBA->BaTimeoutValue = *pBaTimeoutVal;
-       pBA->BaStartSeqCtrl = *pBaStartSeqCtrl;
-       //for half N mode we only aggregate 1 frame
-       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee))
-       pBA->BaParamSet.field.BufferSize = 1;
-       else
-       pBA->BaParamSet.field.BufferSize = 32;
-       ActivateBAEntry(ieee, pBA, pBA->BaTimeoutValue);
-       ieee80211_send_ADDBARsp(ieee, dst, pBA, ADDBA_STATUS_SUCCESS);
-
-       // End of procedure.
-       return 0;
-
-OnADDBAReq_Fail:
-       {
-               BA_RECORD       BA;
-               BA.BaParamSet = *pBaParamSet;
-               BA.BaTimeoutValue = *pBaTimeoutVal;
-               BA.DialogToken = *pDialogToken;
-               BA.BaParamSet.field.BAPolicy = BA_POLICY_IMMEDIATE;
-               ieee80211_send_ADDBARsp(ieee, dst, &BA, rc);
-               return 0; //we send RSP out.
-       }
-
-}
-
-int ieee80211_rx_ADDBARsp( struct ieee80211_device* ieee, struct sk_buff *skb)
-{
-        struct ieee80211_hdr_3addr* rsp = NULL;
-       PBA_RECORD              pPendingBA, pAdmittedBA;
-       PTX_TS_RECORD           pTS = NULL;
-       u8* dst = NULL, *pDialogToken = NULL, *tag = NULL;
-       u16* pStatusCode = NULL, *pBaTimeoutVal = NULL;
-       PBA_PARAM_SET           pBaParamSet = NULL;
-       u16                     ReasonCode;
-
-       if (skb->len < sizeof( struct ieee80211_hdr_3addr) + 9)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, " Invalid skb len in BARSP(%d / %zu)\n", skb->len,    (sizeof( struct ieee80211_hdr_3addr) + 9));
-               return -1;
-       }
-       rsp = ( struct ieee80211_hdr_3addr*)skb->data;
-       tag = (u8*)rsp;
-       dst = (u8*)(&rsp->addr2[0]);
-       tag += sizeof( struct ieee80211_hdr_3addr);
-       pDialogToken = tag + 2;
-       pStatusCode = (u16*)(tag + 3);
-       pBaParamSet = (PBA_PARAM_SET)(tag + 5);
-       pBaTimeoutVal = (u16*)(tag + 7);
-
-       // Check the capability
-       // Since we can always receive A-MPDU, we just check if it is under HT mode.
-       if(     ieee->current_network.qos_data.active == 0  ||
-               ieee->pHTInfo->bCurrentHTSupport == false ||
-               ieee->pHTInfo->bCurrentAMPDUEnable == false )
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "reject to ADDBA_RSP as some capability is not ready(%d, %d, %d)\n",ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport, ieee->pHTInfo->bCurrentAMPDUEnable);
-               ReasonCode = DELBA_REASON_UNKNOWN_BA;
-               goto OnADDBARsp_Reject;
-       }
-
-
-       //
-       // Search for related TS.
-       // If there is no TS found, we wil reject ADDBA Rsp by sending DELBA frame.
-       //
-       if (!GetTs(
-                       ieee,
-                       (PTS_COMMON_INFO*)(&pTS),
-                       dst,
-                       (u8)(pBaParamSet->field.TID),
-                       TX_DIR,
-                       false)  )
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "can't get TS in %s()\n", __FUNCTION__);
-               ReasonCode = DELBA_REASON_UNKNOWN_BA;
-               goto OnADDBARsp_Reject;
-       }
-
-       pTS->bAddBaReqInProgress = false;
-       pPendingBA = &pTS->TxPendingBARecord;
-       pAdmittedBA = &pTS->TxAdmittedBARecord;
-
-
-       //
-       // Check if related BA is waiting for setup.
-       // If not, reject by sending DELBA frame.
-       //
-       if((pAdmittedBA->bValid==true))
-       {
-               // Since BA is already setup, we ignore all other ADDBA Response.
-               IEEE80211_DEBUG(IEEE80211_DL_BA, "OnADDBARsp(): Recv ADDBA Rsp. Drop because already admit it! \n");
-               return -1;
-       }
-       else if((pPendingBA->bValid == false) ||(*pDialogToken != pPendingBA->DialogToken))
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR,  "OnADDBARsp(): Recv ADDBA Rsp. BA invalid, DELBA! \n");
-               ReasonCode = DELBA_REASON_UNKNOWN_BA;
-               goto OnADDBARsp_Reject;
-       }
-       else
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_BA, "OnADDBARsp(): Recv ADDBA Rsp. BA is admitted! Status code:%X\n", *pStatusCode);
-               DeActivateBAEntry(ieee, pPendingBA);
-       }
-
-
-       if(*pStatusCode == ADDBA_STATUS_SUCCESS)
-       {
-               //
-               // Determine ADDBA Rsp content here.
-               // We can compare the value of BA parameter set that Peer returned and Self sent.
-               // If it is OK, then admitted. Or we can send DELBA to cancel BA mechanism.
-               //
-               if(pBaParamSet->field.BAPolicy == BA_POLICY_DELAYED)
-               {
-                       // Since this is a kind of ADDBA failed, we delay next ADDBA process.
-                       pTS->bAddBaReqDelayed = true;
-                       DeActivateBAEntry(ieee, pAdmittedBA);
-                       ReasonCode = DELBA_REASON_END_BA;
-                       goto OnADDBARsp_Reject;
-               }
-
-
-               //
-               // Admitted condition
-               //
-               pAdmittedBA->DialogToken = *pDialogToken;
-               pAdmittedBA->BaTimeoutValue = *pBaTimeoutVal;
-               pAdmittedBA->BaStartSeqCtrl = pPendingBA->BaStartSeqCtrl;
-               pAdmittedBA->BaParamSet = *pBaParamSet;
-               DeActivateBAEntry(ieee, pAdmittedBA);
-               ActivateBAEntry(ieee, pAdmittedBA, *pBaTimeoutVal);
-       }
-       else
-       {
-               // Delay next ADDBA process.
-               pTS->bAddBaReqDelayed = true;
-       }
-
-       // End of procedure
-       return 0;
-
-OnADDBARsp_Reject:
-       {
-               BA_RECORD       BA;
-               BA.BaParamSet = *pBaParamSet;
-               ieee80211_send_DELBA(ieee, dst, &BA, TX_DIR, ReasonCode);
-               return 0;
-       }
-
-}
-
-int ieee80211_rx_DELBA(struct ieee80211_device* ieee,struct sk_buff *skb)
-{
-        struct ieee80211_hdr_3addr* delba = NULL;
-       PDELBA_PARAM_SET        pDelBaParamSet = NULL;
-       u16*                    pReasonCode = NULL;
-       u8*                     dst = NULL;
-
-       if (skb->len < sizeof( struct ieee80211_hdr_3addr) + 6)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, " Invalid skb len in DELBA(%d / %zu)\n", skb->len,    (sizeof( struct ieee80211_hdr_3addr) + 6));
-               return -1;
-       }
-
-       if(ieee->current_network.qos_data.active == 0 ||
-               ieee->pHTInfo->bCurrentHTSupport == false )
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "received DELBA while QOS or HT is not supported(%d, %d)\n",ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport);
-               return -1;
-       }
-
-       IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_BA, skb->data, skb->len);
-       delba = ( struct ieee80211_hdr_3addr*)skb->data;
-       dst = (u8*)(&delba->addr2[0]);
-       delba += sizeof( struct ieee80211_hdr_3addr);
-       pDelBaParamSet = (PDELBA_PARAM_SET)(delba+2);
-       pReasonCode = (u16*)(delba+4);
-
-       if(pDelBaParamSet->field.Initiator == 1)
-       {
-               PRX_TS_RECORD   pRxTs;
-
-               if( !GetTs(
-                               ieee,
-                               (PTS_COMMON_INFO*)&pRxTs,
-                               dst,
-                               (u8)pDelBaParamSet->field.TID,
-                               RX_DIR,
-                               false)  )
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR,  "can't get TS for RXTS in %s()\n", __FUNCTION__);
-                       return -1;
-               }
-
-               RxTsDeleteBA(ieee, pRxTs);
-       }
-       else
-       {
-               PTX_TS_RECORD   pTxTs;
-
-               if(!GetTs(
-                       ieee,
-                       (PTS_COMMON_INFO*)&pTxTs,
-                       dst,
-                       (u8)pDelBaParamSet->field.TID,
-                       TX_DIR,
-                       false)  )
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR,  "can't get TS for TXTS in %s()\n", __FUNCTION__);
-                       return -1;
-               }
-
-               pTxTs->bUsingBa = false;
-               pTxTs->bAddBaReqInProgress = false;
-               pTxTs->bAddBaReqDelayed = false;
-               del_timer_sync(&pTxTs->TsAddBaTimer);
-               //PlatformCancelTimer(Adapter, &pTxTs->TsAddBaTimer);
-               TxTsDeleteBA(ieee, pTxTs);
-       }
-       return 0;
-}
-
-/* ADDBA initiate. This can only be called by TX side. */
-void
-TsInitAddBA(
-       struct ieee80211_device* ieee,
-       PTX_TS_RECORD   pTS,
-       u8              Policy,
-       u8              bOverwritePending
-       )
-{
-       PBA_RECORD                      pBA = &pTS->TxPendingBARecord;
-
-       if(pBA->bValid==true && bOverwritePending==false)
-               return;
-
-       // Set parameters to "Pending" variable set
-       DeActivateBAEntry(ieee, pBA);
-
-       pBA->DialogToken++;                                             // DialogToken: Only keep the latest dialog token
-       pBA->BaParamSet.field.AMSDU_Support = 0;        // Do not support A-MSDU with A-MPDU now!!
-       pBA->BaParamSet.field.BAPolicy = Policy;        // Policy: Delayed or Immediate
-       pBA->BaParamSet.field.TID = pTS->TsCommonInfo.TSpec.f.TSInfo.field.ucTSID;      // TID
-       // BufferSize: This need to be set according to A-MPDU vector
-       pBA->BaParamSet.field.BufferSize = 32;          // BufferSize: This need to be set according to A-MPDU vector
-       pBA->BaTimeoutValue = 0;                                        // Timeout value: Set 0 to disable Timer
-       pBA->BaStartSeqCtrl.field.SeqNum = (pTS->TxCurSeq + 3) % 4096;  // Block Ack will start after 3 packets later.
-
-       ActivateBAEntry(ieee, pBA, BA_SETUP_TIMEOUT);
-
-       ieee80211_send_ADDBAReq(ieee, pTS->TsCommonInfo.Addr, pBA);
-}
-
-void
-TsInitDelBA( struct ieee80211_device* ieee, PTS_COMMON_INFO pTsCommonInfo, TR_SELECT TxRxSelect)
-{
-
-       if(TxRxSelect == TX_DIR)
-       {
-               PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)pTsCommonInfo;
-
-               if(TxTsDeleteBA(ieee, pTxTs))
-                       ieee80211_send_DELBA(
-                               ieee,
-                               pTsCommonInfo->Addr,
-                               (pTxTs->TxAdmittedBARecord.bValid)?(&pTxTs->TxAdmittedBARecord):(&pTxTs->TxPendingBARecord),
-                               TxRxSelect,
-                               DELBA_REASON_END_BA);
-       }
-       else if(TxRxSelect == RX_DIR)
-       {
-               PRX_TS_RECORD   pRxTs = (PRX_TS_RECORD)pTsCommonInfo;
-               if(RxTsDeleteBA(ieee, pRxTs))
-                       ieee80211_send_DELBA(
-                               ieee,
-                               pTsCommonInfo->Addr,
-                               &pRxTs->RxAdmittedBARecord,
-                               TxRxSelect,
-                               DELBA_REASON_END_BA     );
-       }
-}
-
-/*
- *  BA setup timer
- *  acturally we send TX_TS_RECORD or RX_TS_RECORD to these timer
- */
-void BaSetupTimeOut(unsigned long data)
-{
-       PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)data;
-
-       pTxTs->bAddBaReqInProgress = false;
-       pTxTs->bAddBaReqDelayed = true;
-       pTxTs->TxPendingBARecord.bValid = false;
-}
-
-void TxBaInactTimeout(unsigned long data)
-{
-       PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)data;
-       struct ieee80211_device *ieee = container_of(pTxTs, struct ieee80211_device, TxTsRecord[pTxTs->num]);
-       TxTsDeleteBA(ieee, pTxTs);
-       ieee80211_send_DELBA(
-               ieee,
-               pTxTs->TsCommonInfo.Addr,
-               &pTxTs->TxAdmittedBARecord,
-               TX_DIR,
-               DELBA_REASON_TIMEOUT);
-}
-
-void RxBaInactTimeout(unsigned long data)
-{
-       PRX_TS_RECORD   pRxTs = (PRX_TS_RECORD)data;
-       struct ieee80211_device *ieee = container_of(pRxTs, struct ieee80211_device, RxTsRecord[pRxTs->num]);
-
-       RxTsDeleteBA(ieee, pRxTs);
-       ieee80211_send_DELBA(
-               ieee,
-               pRxTs->TsCommonInfo.Addr,
-               &pRxTs->RxAdmittedBARecord,
-               RX_DIR,
-               DELBA_REASON_TIMEOUT);
-}
-
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_HT.h b/drivers/staging/rtl8192e/ieee80211/rtl819x_HT.h
deleted file mode 100644 (file)
index 56a120c..0000000
+++ /dev/null
@@ -1,483 +0,0 @@
-#ifndef _RTL819XU_HTTYPE_H_
-#define _RTL819XU_HTTYPE_H_
-
-//------------------------------------------------------------
-// The HT Capability element is present in beacons, association request,
-//     reassociation request and probe response frames
-//------------------------------------------------------------
-
-//
-// Operation mode value
-//
-#define HT_OPMODE_NO_PROTECT           0
-#define HT_OPMODE_OPTIONAL             1
-#define HT_OPMODE_40MHZ_PROTECT        2
-#define HT_OPMODE_MIXED                        3
-
-//
-// MIMO Power Save Setings
-//
-#define MIMO_PS_STATIC                         0
-#define MIMO_PS_DYNAMIC                        1
-#define MIMO_PS_NOLIMIT                        3
-
-
-//
-//     There should be 128 bits to cover all of the MCS rates. However, since
-//     8190 does not support too much rates, one integer is quite enough.
-//
-
-#define sHTCLng        4
-
-
-#define HT_SUPPORTED_MCS_1SS_BITMAP                                    0x000000ff
-#define HT_SUPPORTED_MCS_2SS_BITMAP                                    0x0000ff00
-#define HT_SUPPORTED_MCS_1SS_2SS_BITMAP                        HT_MCS_1SS_BITMAP|HT_MCS_1SS_2SS_BITMAP
-
-
-typedef enum _HT_MCS_RATE{
-       HT_MCS0   = 0x00000001,
-       HT_MCS1   = 0x00000002,
-       HT_MCS2   = 0x00000004,
-       HT_MCS3   = 0x00000008,
-       HT_MCS4   = 0x00000010,
-       HT_MCS5   = 0x00000020,
-       HT_MCS6   = 0x00000040,
-       HT_MCS7   = 0x00000080,
-       HT_MCS8   = 0x00000100,
-       HT_MCS9   = 0x00000200,
-       HT_MCS10 = 0x00000400,
-       HT_MCS11 = 0x00000800,
-       HT_MCS12 = 0x00001000,
-       HT_MCS13 = 0x00002000,
-       HT_MCS14 = 0x00004000,
-       HT_MCS15 = 0x00008000,
-       // Do not define MCS32 here although 8190 support MCS32
-}HT_MCS_RATE,*PHT_MCS_RATE;
-
-//
-// Represent Channel Width in HT Capabilities
-//
-typedef enum _HT_CHANNEL_WIDTH{
-       HT_CHANNEL_WIDTH_20 = 0,
-       HT_CHANNEL_WIDTH_20_40 = 1,
-}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH;
-
-//
-// Represent Extension Channel Offset in HT Capabilities
-// This is available only in 40Mhz mode.
-//
-typedef enum _HT_EXTCHNL_OFFSET{
-       HT_EXTCHNL_OFFSET_NO_EXT = 0,
-       HT_EXTCHNL_OFFSET_UPPER = 1,
-       HT_EXTCHNL_OFFSET_NO_DEF = 2,
-       HT_EXTCHNL_OFFSET_LOWER = 3,
-}HT_EXTCHNL_OFFSET, *PHT_EXTCHNL_OFFSET;
-
-typedef enum _CHNLOP{
-       CHNLOP_NONE = 0, // No Action now
-       CHNLOP_SCAN = 1, // Scan in progress
-       CHNLOP_SWBW = 2, // Bandwidth switching in progress
-       CHNLOP_SWCHNL = 3, // Software Channel switching in progress
-} CHNLOP, *PCHNLOP;
-
-// Determine if the Channel Operation is in progress
-#define CHHLOP_IN_PROGRESS(_pHTInfo)   \
-               ((_pHTInfo)->ChnlOp > CHNLOP_NONE) ? TRUE : FALSE
-
-/*
-typedef        union _HT_CAPABILITY{
-       u16     ShortData;
-       u8      CharData[2];
-       struct
-       {
-               u16     AdvCoding:1;
-               u16     ChlWidth:1;
-               u16     MimoPwrSave:2;
-               u16     GreenField:1;
-               u16     ShortGI20Mhz:1;
-               u16     ShortGI40Mhz:1;
-               u16     STBC:1;
-               u16     BeamForm:1;
-               u16     DelayBA:1;
-               u16     MaxAMSDUSize:1;
-               u16     DssCCk:1;
-               u16     PSMP:1;
-               u16     Rsvd:3;
-       }Field;
-}HT_CAPABILITY, *PHT_CAPABILITY;
-
-typedef        union _HT_CAPABILITY_MACPARA{
-       u8      ShortData;
-       u8      CharData[1];
-       struct
-       {
-               u8      MaxRxAMPDU:2;
-               u8      MPDUDensity:2;
-               u8      Rsvd:4;
-       }Field;
-}HT_CAPABILITY_MACPARA, *PHT_CAPABILITY_MACPARA;
-*/
-
-typedef enum _HT_ACTION{
-       ACT_RECOMMAND_WIDTH             = 0,
-       ACT_MIMO_PWR_SAVE               = 1,
-       ACT_PSMP                                        = 2,
-       ACT_SET_PCO_PHASE               = 3,
-       ACT_MIMO_CHL_MEASURE    = 4,
-       ACT_RECIPROCITY_CORRECT = 5,
-       ACT_MIMO_CSI_MATRICS            = 6,
-       ACT_MIMO_NOCOMPR_STEER  = 7,
-       ACT_MIMO_COMPR_STEER            = 8,
-       ACT_ANTENNA_SELECT              = 9,
-} HT_ACTION, *PHT_ACTION;
-
-
-/* 2007/06/07 MH Define sub-carrier mode for 40MHZ. */
-typedef enum _HT_Bandwidth_40MHZ_Sub_Carrier{
-       SC_MODE_DUPLICATE = 0,
-       SC_MODE_LOWER = 1,
-       SC_MODE_UPPER = 2,
-       SC_MODE_FULL40MHZ = 3,
-}HT_BW40_SC_E;
-
-typedef        struct _HT_CAPABILITY_ELE{
-
-       //HT capability info
-       u8      AdvCoding:1;
-       u8      ChlWidth:1;
-       u8      MimoPwrSave:2;
-       u8      GreenField:1;
-       u8      ShortGI20Mhz:1;
-       u8      ShortGI40Mhz:1;
-       u8      TxSTBC:1;
-       u8      RxSTBC:2;
-       u8      DelayBA:1;
-       u8      MaxAMSDUSize:1;
-       u8      DssCCk:1;
-       u8      PSMP:1;
-       u8      Rsvd1:1;
-       u8      LSigTxopProtect:1;
-
-       //MAC HT parameters info
-       u8      MaxRxAMPDUFactor:2;
-       u8      MPDUDensity:3;
-       u8      Rsvd2:3;
-
-       //Supported MCS set
-       u8      MCS[16];
-
-
-       //Extended HT Capability Info
-       u16     ExtHTCapInfo;
-
-       //TXBF Capabilities
-       u8      TxBFCap[4];
-
-       //Antenna Selection Capabilities
-       u8      ASCap;
-
-} __attribute__ ((packed)) HT_CAPABILITY_ELE, *PHT_CAPABILITY_ELE;
-
-//------------------------------------------------------------
-// The HT Information element is present in beacons
-// Only AP is required to include this element
-//------------------------------------------------------------
-
-typedef struct _HT_INFORMATION_ELE{
-       u8      ControlChl;
-
-       u8      ExtChlOffset:2;
-       u8      RecommemdedTxWidth:1;
-       u8      RIFS:1;
-       u8      PSMPAccessOnly:1;
-       u8      SrvIntGranularity:3;
-
-       u8      OptMode:2;
-       u8      NonGFDevPresent:1;
-       u8      Revd1:5;
-       u8      Revd2:8;
-
-       u8      Rsvd3:6;
-       u8      DualBeacon:1;
-       u8      DualCTSProtect:1;
-
-       u8      SecondaryBeacon:1;
-       u8      LSigTxopProtectFull:1;
-       u8      PcoActive:1;
-       u8      PcoPhase:1;
-       u8      Rsvd4:4;
-
-       u8      BasicMSC[16];
-} __attribute__ ((packed)) HT_INFORMATION_ELE, *PHT_INFORMATION_ELE;
-
-//
-// MIMO Power Save control field.
-// This is appear in MIMO Power Save Action Frame
-//
-typedef struct _MIMOPS_CTRL{
-       u8      MimoPsEnable:1;
-       u8      MimoPsMode:1;
-       u8      Reserved:6;
-} MIMOPS_CTRL, *PMIMOPS_CTRL;
-
-typedef enum _HT_SPEC_VER{
-       HT_SPEC_VER_IEEE = 0,
-       HT_SPEC_VER_EWC = 1,
-}HT_SPEC_VER, *PHT_SPEC_VER;
-
-typedef enum _HT_AGGRE_MODE_E{
-       HT_AGG_AUTO = 0,
-       HT_AGG_FORCE_ENABLE = 1,
-       HT_AGG_FORCE_DISABLE = 2,
-}HT_AGGRE_MODE_E, *PHT_AGGRE_MODE_E;
-
-//------------------------------------------------------------
-//  The Data structure is used to keep HT related variables when card is
-//  configured as non-AP STA mode.  **Note**  Current_xxx should be set
-//     to default value in HTInitializeHTInfo()
-//------------------------------------------------------------
-
-typedef struct _RT_HIGH_THROUGHPUT{
-       u8                              bEnableHT;
-       u8                              bCurrentHTSupport;
-
-       u8                              bRegBW40MHz;                            // Tx 40MHz channel capablity
-       u8                              bCurBW40MHz;                            // Tx 40MHz channel capability
-
-       u8                              bRegShortGI40MHz;                       // Tx Short GI for 40Mhz
-       u8                              bCurShortGI40MHz;                       // Tx Short GI for 40MHz
-
-       u8                              bRegShortGI20MHz;                       // Tx Short GI for 20MHz
-       u8                              bCurShortGI20MHz;                       // Tx Short GI for 20MHz
-
-       u8                              bRegSuppCCK;                            // Tx CCK rate capability
-       u8                              bCurSuppCCK;                            // Tx CCK rate capability
-
-       // 802.11n spec version for "peer"
-       HT_SPEC_VER                     ePeerHTSpecVer;
-
-
-       // HT related information for "Self"
-       HT_CAPABILITY_ELE       SelfHTCap;              // This is HT cap element sent to peer STA, which also indicate HT Rx capabilities.
-       HT_INFORMATION_ELE      SelfHTInfo;             // This is HT info element sent to peer STA, which also indicate HT Rx capabilities.
-
-       // HT related information for "Peer"
-       u8                              PeerHTCapBuf[32];
-       u8                              PeerHTInfoBuf[32];
-
-
-       // A-MSDU related
-       u8                              bAMSDU_Support;                 // This indicates Tx A-MSDU capability
-       u16                             nAMSDU_MaxSize;                 // This indicates Tx A-MSDU capability
-       u8                              bCurrent_AMSDU_Support; // This indicates Tx A-MSDU capability
-       u16                             nCurrent_AMSDU_MaxSize; // This indicates Tx A-MSDU capability
-
-
-       // AMPDU  related <2006.08.10 Emily>
-       u8                              bAMPDUEnable;                           // This indicate Tx A-MPDU capability
-       u8                              bCurrentAMPDUEnable;            // This indicate Tx A-MPDU capability
-       u8                              AMPDU_Factor;                           // This indicate Tx A-MPDU capability
-       u8                              CurrentAMPDUFactor;             // This indicate Tx A-MPDU capability
-       u8                              MPDU_Density;                           // This indicate Tx A-MPDU capability
-       u8                              CurrentMPDUDensity;                     // This indicate Tx A-MPDU capability
-
-       // Forced A-MPDU enable
-       HT_AGGRE_MODE_E ForcedAMPDUMode;
-       u8                              ForcedAMPDUFactor;
-       u8                              ForcedMPDUDensity;
-
-       // Forced A-MSDU enable
-       HT_AGGRE_MODE_E ForcedAMSDUMode;
-       u16                             ForcedAMSDUMaxSize;
-
-       u8                              bForcedShortGI;
-
-       u8                              CurrentOpMode;
-
-       // MIMO PS related
-       u8                              SelfMimoPs;
-       u8                              PeerMimoPs;
-
-       // 40MHz Channel Offset settings.
-       HT_EXTCHNL_OFFSET       CurSTAExtChnlOffset;
-       u8                              bCurTxBW40MHz;  // If we use 40 MHz to Tx
-       u8                              PeerBandwidth;
-
-       // For Bandwidth Switching
-       u8                              bSwBwInProgress;
-       CHNLOP                          ChnlOp; // software switching channel in progress. By Bruce, 2008-02-15.
-       u8                              SwBwStep;
-       //struct timer_list             SwBwTimer;  //moved to ieee80211_device. as timer_list need include some header file here.
-
-       // For Realtek proprietary A-MPDU factor for aggregation
-       u8                              bRegRT2RTAggregation;
-       u8                              bCurrentRT2RTAggregation;
-       u8                              bCurrentRT2RTLongSlotTime;
-       u8                              szRT2RTAggBuffer[10];
-
-       // Rx Reorder control
-       u8                              bRegRxReorderEnable;
-       u8                              bCurRxReorderEnable;
-       u8                              RxReorderWinSize;
-       u8                              RxReorderPendingTime;
-       u16                             RxReorderDropCounter;
-
-#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
-       u8                              UsbTxAggrNum;
-#endif
-#ifdef USB_RX_AGGREGATION_SUPPORT
-       u8                              UsbRxFwAggrEn;
-       u8                              UsbRxFwAggrPageNum;
-       u8                              UsbRxFwAggrPacketNum;
-       u8                              UsbRxFwAggrTimeout;
-#endif
-
-       // Add for Broadcom(Linksys) IOT. Joseph
-       u8                              bIsPeerBcm;
-
-       // For IOT issue.
-       u8                              IOTPeer;
-       u32                             IOTAction;
-} __attribute__ ((packed)) RT_HIGH_THROUGHPUT, *PRT_HIGH_THROUGHPUT;
-
-
-//------------------------------------------------------------
-// The Data structure is used to keep HT related variable for "each Sta"
-// when card is configured as "AP mode"
-//------------------------------------------------------------
-
-typedef struct _RT_HTINFO_STA_ENTRY{
-       u8                      bEnableHT;
-
-       u8                      bSupportCck;
-
-       u16                     AMSDU_MaxSize;
-
-       u8                      AMPDU_Factor;
-       u8                      MPDU_Density;
-
-       u8                      HTHighestOperaRate;
-
-       u8                      bBw40MHz;
-
-       u8                      MimoPs;
-
-       u8                      McsRateSet[16];
-
-
-}RT_HTINFO_STA_ENTRY, *PRT_HTINFO_STA_ENTRY;
-
-
-
-
-
-//------------------------------------------------------------
-// The Data structure is used to keep HT related variable for "each AP"
-// when card is configured as "STA mode"
-//------------------------------------------------------------
-
-typedef struct _BSS_HT{
-
-       u8                              bdSupportHT;
-
-       // HT related elements
-       u8                                      bdHTCapBuf[32];
-       u16                                     bdHTCapLen;
-       u8                                      bdHTInfoBuf[32];
-       u16                                     bdHTInfoLen;
-
-       HT_SPEC_VER                             bdHTSpecVer;
-       //HT_CAPABILITY_ELE                     bdHTCapEle;
-       //HT_INFORMATION_ELE            bdHTInfoEle;
-
-       u8                                      bdRT2RTAggregation;
-       u8                                      bdRT2RTLongSlotTime;
-} __attribute__ ((packed)) BSS_HT, *PBSS_HT;
-
-typedef struct _MIMO_RSSI{
-       u32     EnableAntenna;
-       u32     AntennaA;
-       u32     AntennaB;
-       u32     AntennaC;
-       u32     AntennaD;
-       u32     Average;
-}MIMO_RSSI, *PMIMO_RSSI;
-
-typedef struct _MIMO_EVM{
-       u32     EVM1;
-       u32    EVM2;
-}MIMO_EVM, *PMIMO_EVM;
-
-typedef struct _FALSE_ALARM_STATISTICS{
-       u32     Cnt_Parity_Fail;
-       u32    Cnt_Rate_Illegal;
-       u32     Cnt_Crc8_fail;
-       u32     Cnt_all;
-}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;
-
-
-extern u8 MCS_FILTER_ALL[16];
-extern u8 MCS_FILTER_1SS[16];
-
-/* 2007/07/11 MH Modify the macro. Becaus STA may link with a N-AP. If we set
-   STA in A/B/G mode and AP is still in N mode. The macro will be wrong. We have
-   to add a macro to judge wireless mode. */
-#define PICK_RATE(_nLegacyRate, _nMcsRate)     \
-               (_nMcsRate==0)?(_nLegacyRate&0x7f):(_nMcsRate)
-/* 2007/07/12 MH We only define legacy and HT wireless mode now. */
-#define        LEGACY_WIRELESS_MODE    IEEE_MODE_MASK
-
-#define CURRENT_RATE(WirelessMode, LegacyRate, HTRate) \
-                                       ((WirelessMode & (LEGACY_WIRELESS_MODE))!=0)?\
-                                               (LegacyRate):\
-                                               (PICK_RATE(LegacyRate, HTRate))
-
-
-
-// MCS Bw 40 {1~7, 12~15,32}
-#define        RATE_ADPT_1SS_MASK              0xFF
-#define        RATE_ADPT_2SS_MASK              0xF0 //Skip MCS8~11 because mcs7 > mcs6, 9, 10, 11. 2007.01.16 by Emily
-#define        RATE_ADPT_MCS32_MASK            0x01
-
-#define        IS_11N_MCS_RATE(rate)           (rate&0x80)
-
-typedef enum _HT_AGGRE_SIZE{
-       HT_AGG_SIZE_8K = 0,
-       HT_AGG_SIZE_16K = 1,
-       HT_AGG_SIZE_32K = 2,
-       HT_AGG_SIZE_64K = 3,
-}HT_AGGRE_SIZE_E, *PHT_AGGRE_SIZE_E;
-
-/* Indicate different AP vendor for IOT issue */
-typedef enum _HT_IOT_PEER
-{
-       HT_IOT_PEER_UNKNOWN = 0,
-       HT_IOT_PEER_REALTEK = 1,
-       HT_IOT_PEER_BROADCOM = 2,
-       HT_IOT_PEER_RALINK = 3,
-       HT_IOT_PEER_ATHEROS = 4,
-       HT_IOT_PEER_CISCO= 5,
-        HT_IOT_PEER_MARVELL=6,
-       HT_IOT_PEER_MAX = 7
-}HT_IOT_PEER_E, *PHTIOT_PEER_E;
-
-//
-// IOT Action for different AP
-//
-typedef enum _HT_IOT_ACTION{
-       HT_IOT_ACT_TX_USE_AMSDU_4K = 0x00000001,
-       HT_IOT_ACT_TX_USE_AMSDU_8K = 0x00000002,
-       HT_IOT_ACT_DISABLE_MCS14 = 0x00000004,
-       HT_IOT_ACT_DISABLE_MCS15 = 0x00000008,
-       HT_IOT_ACT_DISABLE_ALL_2SS = 0x00000010,
-       HT_IOT_ACT_DISABLE_EDCA_TURBO = 0x00000020,
-       HT_IOT_ACT_MGNT_USE_CCK_6M = 0x00000040,
-       HT_IOT_ACT_CDD_FSYNC = 0x00000080,
-       HT_IOT_ACT_PURE_N_MODE = 0x00000100,
-       HT_IOT_ACT_FORCED_CTS2SELF = 0x00000200,
-       HT_IOT_ACT_NULL_DATA_POWER_SAVING = 0x00800000,
-}HT_IOT_ACTION_E, *PHT_IOT_ACTION_E;
-
-#endif //_RTL819XU_HTTYPE_H_
-
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_HTProc.c b/drivers/staging/rtl8192e/ieee80211/rtl819x_HTProc.c
deleted file mode 100644 (file)
index f7a9da3..0000000
+++ /dev/null
@@ -1,1732 +0,0 @@
-
-//As this function is mainly ported from Windows driver, so leave the name little changed. If any confusion caused, tell me. Created by WB. 2008.05.08
-#include "ieee80211.h"
-#include "rtl819x_HT.h"
-u8 MCS_FILTER_ALL[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-u8 MCS_FILTER_1SS[16] = {0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
-
-u16 MCS_DATA_RATE[2][2][77] =
-       {       {       {13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78 ,104, 156, 208, 234, 260,
-                       39, 78, 117, 234, 312, 351, 390, 52, 104, 156, 208, 312, 416, 468, 520,
-                       0, 78, 104, 130, 117, 156, 195, 104, 130, 130, 156, 182, 182, 208, 156, 195,
-                       195, 234, 273, 273, 312, 130, 156, 181, 156, 181, 208, 234, 208, 234, 260, 260,
-                       286, 195, 234, 273, 234, 273, 312, 351, 312, 351, 390, 390, 429},                       // Long GI, 20MHz
-                       {14, 29, 43, 58, 87, 116, 130, 144, 29, 58, 87, 116, 173, 231, 260, 289,
-                       43, 87, 130, 173, 260, 347, 390, 433, 58, 116, 173, 231, 347, 462, 520, 578,
-                       0, 87, 116, 144, 130, 173, 217, 116, 144, 144, 173, 202, 202, 231, 173, 217,
-                       217, 260, 303, 303, 347, 144, 173, 202, 173, 202, 231, 260, 231, 260, 289, 289,
-                       318, 217, 260, 303, 260, 303, 347, 390, 347, 390, 433, 433, 477}        },              // Short GI, 20MHz
-               {       {27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,
-                       81, 162, 243, 324, 486, 648, 729, 810, 108, 216, 324, 432, 648, 864, 972, 1080,
-                       12, 162, 216, 270, 243, 324, 405, 216, 270, 270, 324, 378, 378, 432, 324, 405,
-                       405, 486, 567, 567, 648, 270, 324, 378, 324, 378, 432, 486, 432, 486, 540, 540,
-                       594, 405, 486, 567, 486, 567, 648, 729, 648, 729, 810, 810, 891},       // Long GI, 40MHz
-                       {30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,
-                       90, 180, 270, 360, 540, 720, 810, 900, 120, 240, 360, 480, 720, 960, 1080, 1200,
-                       13, 180, 240, 300, 270, 360, 450, 240, 300, 300, 360, 420, 420, 480, 360, 450,
-                       450, 540, 630, 630, 720, 300, 360, 420, 360, 420, 480, 540, 480, 540, 600, 600,
-                       660, 450, 540, 630, 540, 630, 720, 810, 720, 810, 900, 900, 990}        }       // Short GI, 40MHz
-       };
-
-static const u8 UNKNOWN_BORADCOM[3] = {0x00, 0x14, 0xbf};
-static const u8 LINKSYSWRT330_LINKSYSWRT300_BROADCOM[3] = {0x00, 0x1a, 0x70};
-static const u8 LINKSYSWRT350_LINKSYSWRT150_BROADCOM[3] = {0x00, 0x1d, 0x7e};
-//static u8 NETGEAR834Bv2_BROADCOM[3] = {0x00, 0x1b, 0x2f};
-static const u8 BELKINF5D8233V1_RALINK[3] = {0x00, 0x17, 0x3f};
-static const u8 BELKINF5D82334V3_RALINK[3] = {0x00, 0x1c, 0xdf};
-static const u8 PCI_RALINK[3] = {0x00, 0x90, 0xcc};
-static const u8 EDIMAX_RALINK[3] = {0x00, 0x0e, 0x2e};
-static const u8 AIRLINK_RALINK[3] = {0x00, 0x18, 0x02};
-static const u8 DLINK_ATHEROS[3] = {0x00, 0x1c, 0xf0};
-static const u8 CISCO_BROADCOM[3] = {0x00, 0x17, 0x94};
-static const u8 LINKSYS_MARVELL_4400N[3] = {0x00, 0x14, 0xa4};
-
-// 2008/04/01 MH For Cisco G mode RX TP We need to change FW duration. Should we put the
-// code in other place??
-//static u8 WIFI_CISCO_G_AP[3] = {0x00, 0x40, 0x96};
-/********************************************************************************************************************
- *function:  This function update default settings in pHTInfo structure
- *   input:  PRT_HIGH_THROUGHPUT       pHTInfo
- *  output:  none
- *  return:  none
- *  notice:  These value need be modified if any changes.
- * *****************************************************************************************************************/
-void HTUpdateDefaultSetting(struct ieee80211_device* ieee)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-
-       // ShortGI support
-       pHTInfo->bRegShortGI20MHz= 1;
-       pHTInfo->bRegShortGI40MHz= 1;
-
-       // 40MHz channel support
-       pHTInfo->bRegBW40MHz = 1;
-
-       // CCK rate support in 40MHz channel
-       if(pHTInfo->bRegBW40MHz)
-               pHTInfo->bRegSuppCCK = 1;
-       else
-               pHTInfo->bRegSuppCCK = true;
-
-       // AMSDU related
-       pHTInfo->nAMSDU_MaxSize = 7935UL;
-       pHTInfo->bAMSDU_Support = 0;
-
-       // AMPDU related
-       pHTInfo->bAMPDUEnable = 1;
-       pHTInfo->AMPDU_Factor = 2; //// 0: 2n13(8K), 1:2n14(16K), 2:2n15(32K), 3:2n16(64k)
-       pHTInfo->MPDU_Density = 0;// 0: No restriction, 1: 1/8usec, 2: 1/4usec, 3: 1/2usec, 4: 1usec, 5: 2usec, 6: 4usec, 7:8usec
-
-       // MIMO Power Save
-       pHTInfo->SelfMimoPs = 3;// 0: Static Mimo Ps, 1: Dynamic Mimo Ps, 3: No Limitation, 2: Reserved(Set to 3 automatically.)
-       if(pHTInfo->SelfMimoPs == 2)
-               pHTInfo->SelfMimoPs = 3;
-       // 8190 only. Assign rate operation mode to firmware
-       ieee->bTxDisableRateFallBack = 0;
-       ieee->bTxUseDriverAssingedRate = 0;
-
-#ifdef         TO_DO_LIST
-       // 8190 only. Assign duration operation mode to firmware
-       pMgntInfo->bTxEnableFwCalcDur = (BOOLEAN)pNdisCommon->bRegTxEnableFwCalcDur;
-#endif
-       // 8190 only, Realtek proprietary aggregation mode
-       // Set MPDUDensity=2,   1: Set MPDUDensity=2(32k)  for Realtek AP and set MPDUDensity=0(8k) for others
-       pHTInfo->bRegRT2RTAggregation = 1;//0: Set MPDUDensity=2,   1: Set MPDUDensity=2(32k)  for Realtek AP and set MPDUDensity=0(8k) for others
-
-       // For Rx Reorder Control
-       pHTInfo->bRegRxReorderEnable = 1;
-       pHTInfo->RxReorderWinSize = 64;
-       pHTInfo->RxReorderPendingTime = 30;
-
-#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
-       pHTInfo->UsbTxAggrNum = 4;
-#endif
-#ifdef USB_RX_AGGREGATION_SUPPORT
-       pHTInfo->UsbRxFwAggrEn = 1;
-       pHTInfo->UsbRxFwAggrPageNum = 24;
-       pHTInfo->UsbRxFwAggrPacketNum = 8;
-       pHTInfo->UsbRxFwAggrTimeout = 16; ////usb rx FW aggregation timeout threshold.It's in units of 64us
-#endif
-
-
-}
-/********************************************************************************************************************
- *function:  This function print out each field on HT capability IE mainly from (Beacon/ProbeRsp/AssocReq)
- *   input:  u8*       CapIE       //Capability IE to be printed out
- *          u8*        TitleString //mainly print out caller function
- *  output:  none
- *  return:  none
- *  notice:  Driver should not print out this message by default.
- * *****************************************************************************************************************/
-void HTDebugHTCapability(u8* CapIE, u8* TitleString )
-{
-
-       static u8       EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};       // For 11n EWC definition, 2007.07.17, by Emily
-       PHT_CAPABILITY_ELE              pCapELE;
-
-       if(!memcmp(CapIE, EWC11NHTCap, sizeof(EWC11NHTCap)))
-       {
-               //EWC IE
-               IEEE80211_DEBUG(IEEE80211_DL_HT, "EWC IE in %s()\n", __FUNCTION__);
-               pCapELE = (PHT_CAPABILITY_ELE)(&CapIE[4]);
-       }else
-               pCapELE = (PHT_CAPABILITY_ELE)(&CapIE[0]);
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "<Log HT Capability>. Called by %s\n", TitleString );
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tSupported Channel Width = %s\n", (pCapELE->ChlWidth)?"20MHz": "20/40MHz");
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tSupport Short GI for 20M = %s\n", (pCapELE->ShortGI20Mhz)?"YES": "NO");
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tSupport Short GI for 40M = %s\n", (pCapELE->ShortGI40Mhz)?"YES": "NO");
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tSupport TX STBC = %s\n", (pCapELE->TxSTBC)?"YES": "NO");
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tMax AMSDU Size = %s\n", (pCapELE->MaxAMSDUSize)?"3839": "7935");
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tSupport CCK in 20/40 mode = %s\n", (pCapELE->DssCCk)?"YES": "NO");
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tMax AMPDU Factor = %d\n", pCapELE->MaxRxAMPDUFactor);
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tMPDU Density = %d\n", pCapELE->MPDUDensity);
-       IEEE80211_DEBUG(IEEE80211_DL_HT,  "\tMCS Rate Set = [%x][%x][%x][%x][%x]\n", pCapELE->MCS[0],\
-                               pCapELE->MCS[1], pCapELE->MCS[2], pCapELE->MCS[3], pCapELE->MCS[4]);
-}
-/********************************************************************************************************************
- *function:  This function print out each field on HT Information IE mainly from (Beacon/ProbeRsp)
- *   input:  u8*       InfoIE       //Capability IE to be printed out
- *          u8*        TitleString //mainly print out caller function
- *  output:  none
- *  return:  none
- *  notice:  Driver should not print out this message by default.
- * *****************************************************************************************************************/
-void HTDebugHTInfo(u8* InfoIE, u8* TitleString)
-{
-
-       static u8       EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x34};      // For 11n EWC definition, 2007.07.17, by Emily
-       PHT_INFORMATION_ELE             pHTInfoEle;
-
-       if(!memcmp(InfoIE, EWC11NHTInfo, sizeof(EWC11NHTInfo)))
-       {
-               // Not EWC IE
-               IEEE80211_DEBUG(IEEE80211_DL_HT, "EWC IE in %s()\n", __FUNCTION__);
-               pHTInfoEle = (PHT_INFORMATION_ELE)(&InfoIE[4]);
-       }else
-               pHTInfoEle = (PHT_INFORMATION_ELE)(&InfoIE[0]);
-
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "<Log HT Information Element>. Called by %s\n", TitleString);
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "\tPrimary channel = %d\n", pHTInfoEle->ControlChl);
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "\tSenondary channel =");
-       switch(pHTInfoEle->ExtChlOffset)
-       {
-               case 0:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "Not Present\n");
-                       break;
-               case 1:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "Upper channel\n");
-                       break;
-               case 2:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "Reserved. Eooro!!!\n");
-                       break;
-               case 3:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "Lower Channel\n");
-                       break;
-       }
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "\tRecommended channel width = %s\n", (pHTInfoEle->RecommemdedTxWidth)?"20Mhz": "40Mhz");
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "\tOperation mode for protection = ");
-       switch(pHTInfoEle->OptMode)
-       {
-               case 0:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "No Protection\n");
-                       break;
-               case 1:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "HT non-member protection mode\n");
-                       break;
-               case 2:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "Suggest to open protection\n");
-                       break;
-               case 3:
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "HT mixed mode\n");
-                       break;
-       }
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "\tBasic MCS Rate Set = [%x][%x][%x][%x][%x]\n", pHTInfoEle->BasicMSC[0],\
-                               pHTInfoEle->BasicMSC[1], pHTInfoEle->BasicMSC[2], pHTInfoEle->BasicMSC[3], pHTInfoEle->BasicMSC[4]);
-}
-
-/*
-*      Return:         true if station in half n mode and AP supports 40 bw
-*/
-bool IsHTHalfNmode40Bandwidth(struct ieee80211_device* ieee)
-{
-       bool                    retValue = false;
-       PRT_HIGH_THROUGHPUT      pHTInfo = ieee->pHTInfo;
-
-       if(pHTInfo->bCurrentHTSupport == false )        // wireless is n mode
-               retValue = false;
-       else if(pHTInfo->bRegBW40MHz == false)  // station supports 40 bw
-               retValue = false;
-       else if (!ieee->GetHalfNmodeSupportByAPsHandler(ieee))  // station in half n mode
-               retValue = false;
-       else if(((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ChlWidth) // ap support 40 bw
-               retValue = true;
-       else
-               retValue = false;
-
-       return retValue;
-}
-
-bool IsHTHalfNmodeSGI(struct ieee80211_device* ieee, bool is40MHz)
-{
-       bool                    retValue = false;
-       PRT_HIGH_THROUGHPUT      pHTInfo = ieee->pHTInfo;
-
-       if(pHTInfo->bCurrentHTSupport == false )        // wireless is n mode
-               retValue = false;
-       else if (!ieee->GetHalfNmodeSupportByAPsHandler(ieee))  // station in half n mode
-               retValue = false;
-       else if(is40MHz) // ap support 40 bw
-       {
-               if(((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ShortGI40Mhz) // ap support 40 bw short GI
-                       retValue = true;
-               else
-                       retValue = false;
-       }
-       else
-       {
-               if(((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ShortGI20Mhz) // ap support 40 bw short GI
-                       retValue = true;
-               else
-                       retValue = false;
-       }
-
-       return retValue;
-}
-
-u16 HTHalfMcsToDataRate(struct ieee80211_device* ieee,         u8      nMcsRate)
-{
-
-       u8      is40MHz;
-       u8      isShortGI;
-
-       is40MHz  =  (IsHTHalfNmode40Bandwidth(ieee))?1:0;
-       isShortGI = (IsHTHalfNmodeSGI(ieee, is40MHz))? 1:0;
-
-       return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate&0x7f)];
-}
-
-
-u16 HTMcsToDataRate( struct ieee80211_device* ieee, u8 nMcsRate)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-
-       u8      is40MHz = (pHTInfo->bCurBW40MHz)?1:0;
-       u8      isShortGI = (pHTInfo->bCurBW40MHz)?
-                                               ((pHTInfo->bCurShortGI40MHz)?1:0):
-                                               ((pHTInfo->bCurShortGI20MHz)?1:0);
-       return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate&0x7f)];
-}
-
-/********************************************************************************************************************
- *function:  This function returns current datarate.
- *   input:  struct ieee80211_device*  ieee
- *          u8                         nDataRate
- *  output:  none
- *  return:  tx rate
- *  notice:  quite unsure about how to use this function //wb
- * *****************************************************************************************************************/
-u16  TxCountToDataRate( struct ieee80211_device* ieee, u8 nDataRate)
-{
-       //PRT_HIGH_THROUGHPUT   pHTInfo = ieee->pHTInfo;
-       u16             CCKOFDMRate[12] = {0x02 , 0x04 , 0x0b , 0x16 , 0x0c , 0x12 , 0x18 , 0x24 , 0x30 , 0x48 , 0x60 , 0x6c};
-       u8      is40MHz = 0;
-       u8      isShortGI = 0;
-
-       if(nDataRate < 12)
-       {
-               return CCKOFDMRate[nDataRate];
-       }
-       else
-       {
-               if (nDataRate >= 0x10 && nDataRate <= 0x1f)//if(nDataRate > 11 && nDataRate < 28 )
-               {
-                       is40MHz = 0;
-                       isShortGI = 0;
-
-                     // nDataRate = nDataRate - 12;
-               }
-               else if(nDataRate >=0x20  && nDataRate <= 0x2f ) //(27, 44)
-               {
-                       is40MHz = 1;
-                       isShortGI = 0;
-
-                       //nDataRate = nDataRate - 28;
-               }
-               else if(nDataRate >= 0x30  && nDataRate <= 0x3f )  //(43, 60)
-               {
-                       is40MHz = 0;
-                       isShortGI = 1;
-
-                       //nDataRate = nDataRate - 44;
-               }
-               else if(nDataRate >= 0x40  && nDataRate <= 0x4f ) //(59, 76)
-               {
-                       is40MHz = 1;
-                       isShortGI = 1;
-
-                       //nDataRate = nDataRate - 60;
-               }
-               return MCS_DATA_RATE[is40MHz][isShortGI][nDataRate&0xf];
-       }
-}
-
-
-
-bool IsHTHalfNmodeAPs(struct ieee80211_device* ieee)
-{
-       bool                    retValue = false;
-       struct ieee80211_network* net = &ieee->current_network;
-#if 0
-       if(ieee->bHalfNMode == false)
-               retValue = false;
-       else
-#endif
-       if((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
-                    (memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3)==0) ||
-                    (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
-                    (memcmp(net->bssid, EDIMAX_RALINK, 3)==0) ||
-                    (memcmp(net->bssid, AIRLINK_RALINK, 3)==0) ||
-                    (net->ralink_cap_exist))
-               retValue = true;
-       else if((memcmp(net->bssid, UNKNOWN_BORADCOM, 3)==0) ||
-                   (memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
-                   (memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)||
-                   //(memcmp(net->bssid, NETGEAR834Bv2_BROADCOM, 3)==0) ||
-                   (net->broadcom_cap_exist))
-                 retValue = true;
-       else if(net->bssht.bdRT2RTAggregation)
-               retValue = true;
-       else
-               retValue = false;
-
-       return retValue;
-}
-
-/********************************************************************************************************************
- *function:  This function returns peer IOT.
- *   input:  struct ieee80211_device*  ieee
- *  output:  none
- *  return:
- *  notice:
- * *****************************************************************************************************************/
-void HTIOTPeerDetermine(struct ieee80211_device* ieee)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-       struct ieee80211_network* net = &ieee->current_network;
-       if(net->bssht.bdRT2RTAggregation)
-               pHTInfo->IOTPeer = HT_IOT_PEER_REALTEK;
-       else if(net->broadcom_cap_exist){
-               pHTInfo->IOTPeer = HT_IOT_PEER_BROADCOM;
-       }
-       else if((memcmp(net->bssid, UNKNOWN_BORADCOM, 3)==0) ||
-                       (memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
-                       (memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)){//||
-                       //(memcmp(net->bssid, NETGEAR834Bv2_BROADCOM, 3)==0) ){
-               pHTInfo->IOTPeer = HT_IOT_PEER_BROADCOM;
-       }
-       else if((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
-                       (memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3)==0) ||
-                       (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
-                       (memcmp(net->bssid, EDIMAX_RALINK, 3)==0) ||
-                       (memcmp(net->bssid, AIRLINK_RALINK, 3)==0) ||
-                        net->ralink_cap_exist)
-               pHTInfo->IOTPeer = HT_IOT_PEER_RALINK;
-       else if((net->atheros_cap_exist )|| (memcmp(net->bssid, DLINK_ATHEROS, 3) == 0))
-               pHTInfo->IOTPeer = HT_IOT_PEER_ATHEROS;
-       else if(memcmp(net->bssid, CISCO_BROADCOM, 3)==0)
-               pHTInfo->IOTPeer = HT_IOT_PEER_CISCO;
-        else if ((memcmp(net->bssid, LINKSYS_MARVELL_4400N, 3) == 0) ||
-                       net->marvell_cap_exist){
-               pHTInfo->IOTPeer = HT_IOT_PEER_MARVELL;
-       }
-       else
-               pHTInfo->IOTPeer = HT_IOT_PEER_UNKNOWN;
-
-       IEEE80211_DEBUG(IEEE80211_DL_IOT, "Joseph debug!! IOTPEER: %x\n", pHTInfo->IOTPeer);
-}
-/********************************************************************************************************************
- *function:  Check whether driver should declare received rate up to MCS13 only since some chipset is not good
- *          at receiving MCS14~15 frame from some AP.
- *   input:  struct ieee80211_device*  ieee
- *          u8 *                       PeerMacAddr
- *  output:  none
- *  return:  return 1 if driver should declare MCS13 only(otherwise return 0)
-  * *****************************************************************************************************************/
-u8 HTIOTActIsDisableMCS14(struct ieee80211_device* ieee, u8* PeerMacAddr)
-{
-       u8 ret = 0;
-#if 0
-       // Apply for 819u only
-#if (HAL_CODE_BASE==RTL8192 && DEV_BUS_TYPE==USB_INTERFACE)
-       if((memcmp(PeerMacAddr, UNKNOWN_BORADCOM, 3)==0) ||
-               (memcmp(PeerMacAddr, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)
-           )
-       {
-               ret = 1;
-       }
-
-
-       if(pHTInfo->bCurrentRT2RTAggregation)
-       {
-               // The parameter of pHTInfo->bCurrentRT2RTAggregation must be decided previously
-               ret = 1;
-       }
-#endif
-#endif
-       return ret;
- }
-
-u8 HTIOTActIsForcedCTS2Self(struct ieee80211_device *ieee, struct ieee80211_network *network)
-{
-        u8      retValue = 0;
-        //if(network->marvell_cap_exist)
-        if(ieee->pHTInfo->IOTPeer == HT_IOT_PEER_MARVELL)
-        {
-                retValue = 1;
-        }
-
-        return retValue;
-}
-
-
-/**
-* Function:    HTIOTActIsDisableMCS15
-*
-* Overview:    Check whether driver should declare capability of receiving MCS15
-*
-* Input:
-*                      PADAPTER                Adapter,
-*
-* Output:              None
-* Return:      true if driver should disable MCS15
-* 2008.04.15   Emily
-*/
-bool HTIOTActIsDisableMCS15(struct ieee80211_device* ieee)
-{
-       bool retValue = false;
-
-#ifdef TODO
-       // Apply for 819u only
-#if (HAL_CODE_BASE==RTL8192)
-
-#if (DEV_BUS_TYPE == USB_INTERFACE)
-       // Alway disable MCS15 by Jerry Chang's request.by Emily, 2008.04.15
-       retValue = true;
-#elif (DEV_BUS_TYPE == PCI_INTERFACE)
-       // Enable MCS15 if the peer is Cisco AP. by Emily, 2008.05.12
-//     if(pBssDesc->bCiscoCapExist)
-//             retValue = false;
-//     else
-               retValue = false;
-#endif
-#endif
-#endif
-       // Jerry Chang suggest that 8190 1x2 does not need to disable MCS15
-
-       return retValue;
-}
-
-/**
-* Function:    HTIOTActIsDisableMCSTwoSpatialStream
-*
-* Overview:    Check whether driver should declare capability of receiving All 2 ss packets
-*
-* Input:
-*                      PADAPTER                Adapter,
-*
-* Output:              None
-* Return:      true if driver should disable all two spatial stream packet
-* 2008.04.21   Emily
-*/
-bool HTIOTActIsDisableMCSTwoSpatialStream(struct ieee80211_device* ieee, u8 *PeerMacAddr)
-{
-       bool retValue = false;
-
-#ifdef TODO
-       // Apply for 819u only
-//#if (HAL_CODE_BASE==RTL8192)
-
-       //This rule only apply to Belkin(Ralink) AP
-       if(IS_UNDER_11N_AES_MODE(Adapter))
-       {
-               if((PlatformCompareMemory(PeerMacAddr, BELKINF5D8233V1_RALINK, 3)==0) ||
-                               (PlatformCompareMemory(PeerMacAddr, PCI_RALINK, 3)==0) ||
-                               (PlatformCompareMemory(PeerMacAddr, EDIMAX_RALINK, 3)==0))
-               {
-                       //Set True to disable this function. Disable by default, Emily, 2008.04.23
-                       retValue = false;
-               }
-       }
-
-//#endif
-#endif
-       return retValue;
-}
-
-/********************************************************************************************************************
- *function:  Check whether driver should disable EDCA turbo mode
- *   input:  struct ieee80211_device*  ieee
- *          u8*                        PeerMacAddr
- *  output:  none
- *  return:  return 1 if driver should disable EDCA turbo mode(otherwise return 0)
-  * *****************************************************************************************************************/
-u8 HTIOTActIsDisableEDCATurbo(struct ieee80211_device*         ieee, u8* PeerMacAddr)
-{
-       u8      retValue = false;       // default enable EDCA Turbo mode.
-       // Set specific EDCA parameter for different AP in DM handler.
-
-       return retValue;
-#if 0
-       if((memcmp(PeerMacAddr, UNKNOWN_BORADCOM, 3)==0)||
-               (memcmp(PeerMacAddr, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
-               (memcmp(PeerMacAddr, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)||
-               (memcmp(PeerMacAddr, NETGEAR834Bv2_BROADCOM, 3)==0))
-
-       {
-               retValue = 1;   //Linksys disable EDCA turbo mode
-       }
-
-       return retValue;
-#endif
-}
-
-/********************************************************************************************************************
- *function:  Check whether we need to use OFDM to sned MGNT frame for broadcom AP
- *   input:  struct ieee80211_network *network   //current network we live
- *  output:  none
- *  return:  return 1 if true
-  * *****************************************************************************************************************/
-u8 HTIOTActIsMgntUseCCK6M(struct ieee80211_network *network)
-{
-       u8      retValue = 0;
-
-       // 2008/01/25 MH Judeg if we need to use OFDM to sned MGNT frame for broadcom AP.
-       // 2008/01/28 MH We must prevent that we select null bssid to link.
-
-       if(network->broadcom_cap_exist)
-       {
-               retValue = 1;
-       }
-
-       return retValue;
-}
-
-u8 HTIOTActIsCCDFsync(u8* PeerMacAddr)
-{
-       u8      retValue = 0;
-       if(     (memcmp(PeerMacAddr, UNKNOWN_BORADCOM, 3)==0) ||
-               (memcmp(PeerMacAddr, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0) ||
-               (memcmp(PeerMacAddr, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3) ==0))
-       {
-               retValue = 1;
-       }
-
-       return retValue;
-}
-
-//
-//  Send null data for to tell AP that we are awake.
-//
-bool
-HTIOTActIsNullDataPowerSaving(struct ieee80211_device* ieee,struct ieee80211_network *network)
-{
-       bool    retValue = false;
-
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-       {
-               if(pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM) // ||(pBssDesc->Vender == HT_IOT_PEER_ATHEROS && pBssDesc->SubTypeOfVender == HT_IOT_PEER_ATHEROS_DIR635))
-                       return true;
-
-       }
-       return retValue;
-}
-
-void HTResetIOTSetting(
-       PRT_HIGH_THROUGHPUT             pHTInfo
-)
-{
-       pHTInfo->IOTAction = 0;
-       pHTInfo->IOTPeer = HT_IOT_PEER_UNKNOWN;
-}
-
-
-/********************************************************************************************************************
- *function:  Construct Capablility Element in Beacon... if HTEnable is turned on
- *   input:  struct ieee80211_device*  ieee
- *          u8*                        posHTCap //pointer to store Capability Ele
- *          u8*                        len //store length of CE
- *          u8                         IsEncrypt //whether encrypt, needed further
- *  output:  none
- *  return:  none
- *  notice:  posHTCap can't be null and should be initialized before.
-  * *****************************************************************************************************************/
-void HTConstructCapabilityElement(struct ieee80211_device* ieee, u8* posHTCap, u8* len, u8 IsEncrypt)
-{
-       PRT_HIGH_THROUGHPUT     pHT = ieee->pHTInfo;
-       PHT_CAPABILITY_ELE      pCapELE = NULL;
-       //u8 bIsDeclareMCS13;
-
-       if ((posHTCap == NULL) || (pHT == NULL))
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "posHTCap or pHTInfo can't be null in HTConstructCapabilityElement()\n");
-               return;
-       }
-       memset(posHTCap, 0, *len);
-       if(pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC)
-       {
-               u8      EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};       // For 11n EWC definition, 2007.07.17, by Emily
-               memcpy(posHTCap, EWC11NHTCap, sizeof(EWC11NHTCap));
-               pCapELE = (PHT_CAPABILITY_ELE)&(posHTCap[4]);
-       }else
-       {
-               pCapELE = (PHT_CAPABILITY_ELE)posHTCap;
-       }
-
-
-       //HT capability info
-       pCapELE->AdvCoding              = 0; // This feature is not supported now!!
-       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee))
-       {
-               pCapELE->ChlWidth = 0;
-       }
-       else
-       {
-               pCapELE->ChlWidth = (pHT->bRegBW40MHz?1:0);
-       }
-
-//     pCapELE->ChlWidth               = (pHT->bRegBW40MHz?1:0);
-       pCapELE->MimoPwrSave            = pHT->SelfMimoPs;
-       pCapELE->GreenField             = 0; // This feature is not supported now!!
-       pCapELE->ShortGI20Mhz           = 1; // We can receive Short GI!!
-       pCapELE->ShortGI40Mhz           = 1; // We can receive Short GI!!
-       //DbgPrint("TX HT cap/info ele BW=%d SG20=%d SG40=%d\n\r",
-               //pCapELE->ChlWidth, pCapELE->ShortGI20Mhz, pCapELE->ShortGI40Mhz);
-       pCapELE->TxSTBC                 = 1;
-       pCapELE->RxSTBC                 = 0;
-       pCapELE->DelayBA                = 0;    // Do not support now!!
-       pCapELE->MaxAMSDUSize   = (MAX_RECEIVE_BUFFER_SIZE>=7935)?1:0;
-       pCapELE->DssCCk                 = ((pHT->bRegBW40MHz)?(pHT->bRegSuppCCK?1:0):0);
-       pCapELE->PSMP                   = 0; // Do not support now!!
-       pCapELE->LSigTxopProtect        = 0; // Do not support now!!
-
-
-       //MAC HT parameters info
-        // TODO: Nedd to take care of this part
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "TX HT cap/info ele BW=%d MaxAMSDUSize:%d DssCCk:%d\n", pCapELE->ChlWidth, pCapELE->MaxAMSDUSize, pCapELE->DssCCk);
-
-       if( IsEncrypt)
-       {
-               pCapELE->MPDUDensity    = 7; // 8us
-               pCapELE->MaxRxAMPDUFactor       = 2; // 2 is for 32 K and 3 is 64K
-       }
-       else
-       {
-               pCapELE->MaxRxAMPDUFactor       = 3; // 2 is for 32 K and 3 is 64K
-               pCapELE->MPDUDensity    = 0; // no density
-       }
-
-       //Supported MCS set
-       memcpy(pCapELE->MCS, ieee->Regdot11HTOperationalRateSet, 16);
-       if(pHT->IOTAction & HT_IOT_ACT_DISABLE_MCS15)
-               pCapELE->MCS[1] &= 0x7f;
-
-       if(pHT->IOTAction & HT_IOT_ACT_DISABLE_MCS14)
-               pCapELE->MCS[1] &= 0xbf;
-
-       if(pHT->IOTAction & HT_IOT_ACT_DISABLE_ALL_2SS)
-               pCapELE->MCS[1] &= 0x00;
-
-       // 2008.06.12
-       // For RTL819X, if pairwisekey = wep/tkip, ap is ralink, we support only MCS0~7.
-       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee))
-       {
-               int i;
-               for(i = 1; i< 16; i++)
-                       pCapELE->MCS[i] = 0;
-       }
-
-       //Extended HT Capability Info
-       memset(&pCapELE->ExtHTCapInfo, 0, 2);
-
-
-       //TXBF Capabilities
-       memset(pCapELE->TxBFCap, 0, 4);
-
-       //Antenna Selection Capabilities
-       pCapELE->ASCap = 0;
-//add 2 to give space for element ID and len when construct frames
-       if(pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC)
-               *len = 30 + 2;
-       else
-               *len = 26 + 2;
-}
-/********************************************************************************************************************
- *function:  Construct  Information Element in Beacon... if HTEnable is turned on
- *   input:  struct ieee80211_device*  ieee
- *          u8*                        posHTCap //pointer to store Information Ele
- *          u8*                        len   //store len of
- *          u8                         IsEncrypt //whether encrypt, needed further
- *  output:  none
- *  return:  none
- *  notice:  posHTCap can't be null and be initialized before. only AP and IBSS sta should do this
-  * *****************************************************************************************************************/
-void HTConstructInfoElement(struct ieee80211_device* ieee, u8* posHTInfo, u8* len, u8 IsEncrypt)
-{
-       PRT_HIGH_THROUGHPUT     pHT = ieee->pHTInfo;
-       PHT_INFORMATION_ELE             pHTInfoEle = (PHT_INFORMATION_ELE)posHTInfo;
-       if ((posHTInfo == NULL) || (pHTInfoEle == NULL))
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "posHTInfo or pHTInfoEle can't be null in HTConstructInfoElement()\n");
-               return;
-       }
-
-       memset(posHTInfo, 0, *len);
-       if ( (ieee->iw_mode == IW_MODE_ADHOC) || (ieee->iw_mode == IW_MODE_MASTER)) //ap mode is not currently supported
-       {
-               pHTInfoEle->ControlChl                  = ieee->current_network.channel;
-               pHTInfoEle->ExtChlOffset                        = ((pHT->bRegBW40MHz == false)?HT_EXTCHNL_OFFSET_NO_EXT:
-                                                                                       (ieee->current_network.channel<=6)?
-                                                                                               HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
-               pHTInfoEle->RecommemdedTxWidth  = pHT->bRegBW40MHz;
-               pHTInfoEle->RIFS                                        = 0;
-               pHTInfoEle->PSMPAccessOnly              = 0;
-               pHTInfoEle->SrvIntGranularity           = 0;
-               pHTInfoEle->OptMode                             = pHT->CurrentOpMode;
-               pHTInfoEle->NonGFDevPresent             = 0;
-               pHTInfoEle->DualBeacon                  = 0;
-               pHTInfoEle->SecondaryBeacon             = 0;
-               pHTInfoEle->LSigTxopProtectFull         = 0;
-               pHTInfoEle->PcoActive                           = 0;
-               pHTInfoEle->PcoPhase                            = 0;
-
-               memset(pHTInfoEle->BasicMSC, 0, 16);
-
-
-               *len = 22 + 2; //same above
-
-       }
-       else
-       {
-               //STA should not generate High Throughput Information Element
-               *len = 0;
-       }
-}
-
-/*
-  *  According to experiment, Realtek AP to STA (based on rtl8190) may achieve best performance
-  *  if both STA and AP set limitation of aggregation size to 32K, that is, set AMPDU density to 2
-  *  (Ref: IEEE 11n specification). However, if Realtek STA associates to other AP, STA should set
-  *  limitation of aggregation size to 8K, otherwise, performance of traffic stream from STA to AP
-  *  will be much less than the traffic stream from AP to STA if both of the stream runs concurrently
-  *  at the same time.
-  *
-  *  Frame Format
-  *  Element ID                Length          OUI                     Type1           Reserved
-  *  1 byte                    1 byte          3 bytes         1 byte          1 byte
-  *
-  *  OUI               = 0x00, 0xe0, 0x4c,
-  *  Type      = 0x02
-  *  Reserved  = 0x00
-  *
-  *  2007.8.21 by Emily
-*/
-/********************************************************************************************************************
- *function:  Construct  Information Element in Beacon... in RT2RT condition
- *   input:  struct ieee80211_device*  ieee
- *          u8*                        posRT2RTAgg //pointer to store Information Ele
- *          u8*                        len   //store len
- *  output:  none
- *  return:  none
- *  notice:
-  * *****************************************************************************************************************/
-void HTConstructRT2RTAggElement(struct ieee80211_device* ieee, u8* posRT2RTAgg, u8* len)
-{
-       if (posRT2RTAgg == NULL) {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "posRT2RTAgg can't be null in HTConstructRT2RTAggElement()\n");
-               return;
-       }
-       memset(posRT2RTAgg, 0, *len);
-       *posRT2RTAgg++ = 0x00;
-       *posRT2RTAgg++ = 0xe0;
-       *posRT2RTAgg++ = 0x4c;
-       *posRT2RTAgg++ = 0x02;
-       *posRT2RTAgg++ = 0x01;
-       *posRT2RTAgg = 0x10;//*posRT2RTAgg = 0x02;
-
-       if(ieee->bSupportRemoteWakeUp) {
-               *posRT2RTAgg |= 0x08;//RT_HT_CAP_USE_WOW;
-       }
-
-       *len = 6 + 2;
-       return;
-#ifdef TODO
-#if(HAL_CODE_BASE == RTL8192 && DEV_BUS_TYPE == USB_INTERFACE)
-       /*
-       //Emily. If it is required to Ask Realtek AP to send AMPDU during AES mode, enable this
-          section of code.
-       if(IS_UNDER_11N_AES_MODE(Adapter))
-       {
-               posRT2RTAgg->Octet[5] |=RT_HT_CAP_USE_AMPDU;
-       }else
-       {
-               posRT2RTAgg->Octet[5] &= 0xfb;
-       }
-       */
-
-#else
-       // Do Nothing
-#endif
-
-       posRT2RTAgg->Length = 6;
-#endif
-
-
-
-
-}
-
-
-/********************************************************************************************************************
- *function:  Pick the right Rate Adaptive table to use
- *   input:  struct ieee80211_device*  ieee
- *          u8*                        pOperateMCS //A pointer to MCS rate bitmap
- *  return:  always we return true
- *  notice:
-  * *****************************************************************************************************************/
-u8 HT_PickMCSRate(struct ieee80211_device* ieee, u8* pOperateMCS)
-{
-       u8                                      i;
-       if (pOperateMCS == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "pOperateMCS can't be null in HT_PickMCSRate()\n");
-               return false;
-       }
-
-       switch(ieee->mode)
-       {
-       case IEEE_A:
-       case IEEE_B:
-       case IEEE_G:
-                       //legacy rate routine handled at selectedrate
-
-                       //no MCS rate
-                       for(i=0;i<=15;i++){
-                               pOperateMCS[i] = 0;
-                       }
-                       break;
-
-       case IEEE_N_24G:        //assume CCK rate ok
-       case IEEE_N_5G:
-                       // Legacy part we only use 6, 5.5,2,1 for N_24G and 6 for N_5G.
-                       // Legacy part shall be handled at SelectRateSet().
-
-                       //HT part
-                       // TODO: may be different if we have different number of antenna
-                       pOperateMCS[0] &=RATE_ADPT_1SS_MASK;    //support MCS 0~7
-                       pOperateMCS[1] &=RATE_ADPT_2SS_MASK;
-                       pOperateMCS[3] &=RATE_ADPT_MCS32_MASK;
-                       break;
-
-       //should never reach here
-       default:
-
-                       break;
-
-       }
-
-       return true;
-}
-
-/*
-*      Description:
-*              This function will get the highest speed rate in input MCS set.
-*
-*      /param  Adapter                 Pionter to Adapter entity
-*                      pMCSRateSet             Pointer to MCS rate bitmap
-*                      pMCSFilter              Pointer to MCS rate filter
-*
-*      /return Highest MCS rate included in pMCSRateSet and filtered by pMCSFilter.
-*
-*/
-/********************************************************************************************************************
- *function:  This function will get the highest speed rate in input MCS set.
- *   input:  struct ieee80211_device*  ieee
- *          u8*                        pMCSRateSet //Pointer to MCS rate bitmap
- *          u8*                        pMCSFilter //Pointer to MCS rate filter
- *  return:  Highest MCS rate included in pMCSRateSet and filtered by pMCSFilter
- *  notice:
-  * *****************************************************************************************************************/
-u8 HTGetHighestMCSRate(struct ieee80211_device* ieee, u8* pMCSRateSet, u8* pMCSFilter)
-{
-       u8              i, j;
-       u8              bitMap;
-       u8              mcsRate = 0;
-       u8              availableMcsRate[16];
-       if (pMCSRateSet == NULL || pMCSFilter == NULL)
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "pMCSRateSet or pMCSFilter can't be null in HTGetHighestMCSRate()\n");
-               return false;
-       }
-       for(i=0; i<16; i++)
-               availableMcsRate[i] = pMCSRateSet[i] & pMCSFilter[i];
-
-       for(i = 0; i < 16; i++)
-       {
-               if(availableMcsRate[i] != 0)
-                       break;
-       }
-       if(i == 16)
-               return false;
-
-       for(i = 0; i < 16; i++)
-       {
-               if(availableMcsRate[i] != 0)
-               {
-                       bitMap = availableMcsRate[i];
-                       for(j = 0; j < 8; j++)
-                       {
-                               if((bitMap%2) != 0)
-                               {
-                                       if(HTMcsToDataRate(ieee, (8*i+j)) > HTMcsToDataRate(ieee, mcsRate))
-                                               mcsRate = (8*i+j);
-                               }
-                               bitMap = bitMap>>1;
-                       }
-               }
-       }
-       return (mcsRate|0x80);
-}
-
-
-
-/*
-**
-**1.Filter our operation rate set with AP's rate set
-**2.shall reference channel bandwidth, STBC, Antenna number
-**3.generate rate adative table for firmware
-**David 20060906
-**
-** \pHTSupportedCap: the connected STA's supported rate Capability element
-*/
-u8 HTFilterMCSRate( struct ieee80211_device* ieee, u8* pSupportMCS, u8* pOperateMCS)
-{
-
-       u8 i=0;
-
-       // filter out operational rate set not supported by AP, the lenth of it is 16
-       for(i=0;i<=15;i++){
-               pOperateMCS[i] = ieee->Regdot11HTOperationalRateSet[i]&pSupportMCS[i];
-       }
-
-
-       // TODO: adjust our operational rate set  according to our channel bandwidth, STBC and Antenna number
-
-       // TODO: fill suggested rate adaptive rate index and give firmware info using Tx command packet
-       // we also shall suggested the first start rate set according to our singal strength
-       HT_PickMCSRate(ieee, pOperateMCS);
-
-       // For RTL819X, if pairwisekey = wep/tkip, we support only MCS0~7.
-       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee))
-               pOperateMCS[1] = 0;
-
-       //
-       // For RTL819X, we support only MCS0~15.
-       // And also, we do not know how to use MCS32 now.
-       //
-       for(i=2; i<=15; i++)
-               pOperateMCS[i] = 0;
-
-       return true;
-}
-void HTSetConnectBwMode(struct ieee80211_device* ieee, HT_CHANNEL_WIDTH        Bandwidth, HT_EXTCHNL_OFFSET    Offset);
-void HTOnAssocRsp(struct ieee80211_device *ieee)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-       PHT_CAPABILITY_ELE              pPeerHTCap = NULL;
-       PHT_INFORMATION_ELE             pPeerHTInfo = NULL;
-       u16     nMaxAMSDUSize = 0;
-       u8*     pMcsFilter = NULL;
-
-       static u8                               EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};               // For 11n EWC definition, 2007.07.17, by Emily
-       static u8                               EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x34};      // For 11n EWC definition, 2007.07.17, by Emily
-
-       if( pHTInfo->bCurrentHTSupport == false )
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "<=== HTOnAssocRsp(): HT_DISABLE\n");
-               return;
-       }
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "===> HTOnAssocRsp_wq(): HT_ENABLE\n");
-//     IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA, pHTInfo->PeerHTCapBuf, sizeof(HT_CAPABILITY_ELE));
-//     IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA, pHTInfo->PeerHTInfoBuf, sizeof(HT_INFORMATION_ELE));
-
-//     HTDebugHTCapability(pHTInfo->PeerHTCapBuf,"HTOnAssocRsp_wq");
-//     HTDebugHTInfo(pHTInfo->PeerHTInfoBuf,"HTOnAssocRsp_wq");
-       //
-       if(!memcmp(pHTInfo->PeerHTCapBuf,EWC11NHTCap, sizeof(EWC11NHTCap)))
-               pPeerHTCap = (PHT_CAPABILITY_ELE)(&pHTInfo->PeerHTCapBuf[4]);
-       else
-               pPeerHTCap = (PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf);
-
-       if(!memcmp(pHTInfo->PeerHTInfoBuf, EWC11NHTInfo, sizeof(EWC11NHTInfo)))
-               pPeerHTInfo = (PHT_INFORMATION_ELE)(&pHTInfo->PeerHTInfoBuf[4]);
-       else
-               pPeerHTInfo = (PHT_INFORMATION_ELE)(pHTInfo->PeerHTInfoBuf);
-
-
-       ////////////////////////////////////////////////////////
-       // Configurations:
-       ////////////////////////////////////////////////////////
-       IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_HT, pPeerHTCap, sizeof(HT_CAPABILITY_ELE));
-//     IEEE80211_DEBUG_DATA(IEEE80211_DL_DATA|IEEE80211_DL_HT, pPeerHTInfo, sizeof(HT_INFORMATION_ELE));
-       // Config Supported Channel Width setting
-       //
-       HTSetConnectBwMode(ieee, (HT_CHANNEL_WIDTH)(pPeerHTCap->ChlWidth), (HT_EXTCHNL_OFFSET)(pPeerHTInfo->ExtChlOffset));
-
-//     if(pHTInfo->bCurBW40MHz == true)
-               pHTInfo->bCurTxBW40MHz = ((pPeerHTInfo->RecommemdedTxWidth == 1)?true:false);
-
-       //
-       // Update short GI/ long GI setting
-       //
-       // TODO:
-       pHTInfo->bCurShortGI20MHz=
-               ((pHTInfo->bRegShortGI20MHz)?((pPeerHTCap->ShortGI20Mhz==1)?true:false):false);
-       pHTInfo->bCurShortGI40MHz=
-               ((pHTInfo->bRegShortGI40MHz)?((pPeerHTCap->ShortGI40Mhz==1)?true:false):false);
-
-       //
-       // Config TX STBC setting
-       //
-       // TODO:
-
-       //
-       // Config DSSS/CCK  mode in 40MHz mode
-       //
-       // TODO:
-       pHTInfo->bCurSuppCCK =
-               ((pHTInfo->bRegSuppCCK)?((pPeerHTCap->DssCCk==1)?true:false):false);
-
-
-       //
-       // Config and configure A-MSDU setting
-       //
-       pHTInfo->bCurrent_AMSDU_Support = pHTInfo->bAMSDU_Support;
-        if (ieee->rtllib_ap_sec_type &&
-           (ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_WEP|SEC_ALG_TKIP))){
-                if( (pHTInfo->IOTPeer== HT_IOT_PEER_ATHEROS) ||
-                                (pHTInfo->IOTPeer == HT_IOT_PEER_UNKNOWN) )
-                        pHTInfo->bCurrentAMPDUEnable = false;
-        }
-
-
-       nMaxAMSDUSize = (pPeerHTCap->MaxAMSDUSize==0)?3839:7935;
-
-       if(pHTInfo->nAMSDU_MaxSize > nMaxAMSDUSize )
-               pHTInfo->nCurrent_AMSDU_MaxSize = nMaxAMSDUSize;
-       else
-               pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
-
-
-       //
-       // Config A-MPDU setting
-       //
-       pHTInfo->bCurrentAMPDUEnable = pHTInfo->bAMPDUEnable;
-
-       // <1> Decide AMPDU Factor
-
-       // By Emily
-       if(!pHTInfo->bRegRT2RTAggregation)
-       {
-               // Decide AMPDU Factor according to protocol handshake
-               if(pHTInfo->AMPDU_Factor > pPeerHTCap->MaxRxAMPDUFactor)
-                       pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
-               else
-                       pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
-
-       }else
-       {
-               // Set MPDU density to 2 to Realtek AP, and set it to 0 for others
-               // Replace MPDU factor declared in original association response frame format. 2007.08.20 by Emily
-#if 0
-               osTmp= PacketGetElement( asocpdu, EID_Vendor, OUI_SUB_REALTEK_AGG, OUI_SUBTYPE_DONT_CARE);
-               if(osTmp.Length >= 5)   //00:e0:4c:02:00
-#endif
-               if (ieee->current_network.bssht.bdRT2RTAggregation)
-               {
-                       if( ieee->pairwise_key_type != KEY_TYPE_NA)
-                               // Realtek may set 32k in security mode and 64k for others
-                               pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
-                       else
-                               pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_64K;
-               }else
-               {
-                       if(pPeerHTCap->MaxRxAMPDUFactor < HT_AGG_SIZE_32K)
-                               pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
-                       else
-                               pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_32K;
-               }
-       }
-
-       // <2> Set AMPDU Minimum MPDU Start Spacing
-       // 802.11n 3.0 section 9.7d.3
-#if 1
-       if(pHTInfo->MPDU_Density > pPeerHTCap->MPDUDensity)
-               pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
-       else
-               pHTInfo->CurrentMPDUDensity = pPeerHTCap->MPDUDensity;
-       if(ieee->pairwise_key_type != KEY_TYPE_NA )
-               pHTInfo->CurrentMPDUDensity     = 7; // 8us
-#else
-       if(pHTInfo->MPDU_Density > pPeerHTCap->MPDUDensity)
-               pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
-       else
-               pHTInfo->CurrentMPDUDensity = pPeerHTCap->MPDUDensity;
-#endif
-       // Force TX AMSDU
-
-       // Lanhsin: mark for tmp to avoid deauth by ap from  s3
-       //if(memcmp(pMgntInfo->Bssid, NETGEAR834Bv2_BROADCOM, 3)==0)
-       if(0)
-               {
-
-                       pHTInfo->bCurrentAMPDUEnable = false;
-                       pHTInfo->ForcedAMSDUMode = HT_AGG_FORCE_ENABLE;
-                       pHTInfo->ForcedAMSDUMaxSize = 7935;
-
-               pHTInfo->IOTAction |=  HT_IOT_ACT_TX_USE_AMSDU_8K;
-       }
-
-       // Rx Reorder Setting
-       pHTInfo->bCurRxReorderEnable = pHTInfo->bRegRxReorderEnable;
-
-       //
-       // Filter out unsupported HT rate for this AP
-       // Update RATR table
-       // This is only for 8190 ,8192 or later product which using firmware to handle rate adaptive mechanism.
-       //
-
-       // Handle Ralink AP bad MCS rate set condition. Joseph.
-       // This fix the bug of Ralink AP. This may be removed in the future.
-       if(pPeerHTCap->MCS[0] == 0)
-               pPeerHTCap->MCS[0] = 0xff;
-
-       HTFilterMCSRate(ieee, pPeerHTCap->MCS, ieee->dot11HTOperationalRateSet);
-
-       //
-       // Config MIMO Power Save setting
-       //
-       pHTInfo->PeerMimoPs = pPeerHTCap->MimoPwrSave;
-       if(pHTInfo->PeerMimoPs == MIMO_PS_STATIC)
-               pMcsFilter = MCS_FILTER_1SS;
-       else
-               pMcsFilter = MCS_FILTER_ALL;
-       //WB add for MCS8 bug
-//     pMcsFilter = MCS_FILTER_1SS;
-       ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee, ieee->dot11HTOperationalRateSet, pMcsFilter);
-       ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
-
-       //
-       // Config current operation mode.
-       //
-       pHTInfo->CurrentOpMode = pPeerHTInfo->OptMode;
-
-
-
-}
-
-void HTSetConnectBwModeCallback(struct ieee80211_device* ieee);
-/********************************************************************************************************************
- *function:  initialize HT info(struct PRT_HIGH_THROUGHPUT)
- *   input:  struct ieee80211_device*  ieee
- *  output:  none
- *  return:  none
- *  notice: This function is called when *  (1) MPInitialization Phase *  (2) Receiving of Deauthentication from AP
-********************************************************************************************************************/
-// TODO: Should this funciton be called when receiving of Disassociation?
-void HTInitializeHTInfo(struct ieee80211_device* ieee)
-{
-       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
-
-       //
-       // These parameters will be reset when receiving deauthentication packet
-       //
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "===========>%s()\n", __FUNCTION__);
-       pHTInfo->bCurrentHTSupport = false;
-
-       // 40MHz channel support
-       pHTInfo->bCurBW40MHz = false;
-       pHTInfo->bCurTxBW40MHz = false;
-
-       // Short GI support
-       pHTInfo->bCurShortGI20MHz = false;
-       pHTInfo->bCurShortGI40MHz = false;
-       pHTInfo->bForcedShortGI = false;
-
-       // CCK rate support
-       // This flag is set to true to support CCK rate by default.
-       // It will be affected by "pHTInfo->bRegSuppCCK" and AP capabilities only when associate to
-       // 11N BSS.
-       pHTInfo->bCurSuppCCK = true;
-
-       // AMSDU related
-       pHTInfo->bCurrent_AMSDU_Support = false;
-       pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
-
-       // AMPUD related
-       pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
-       pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
-
-
-
-       // Initialize all of the parameters related to 11n
-       memset((void*)(&(pHTInfo->SelfHTCap)), 0, sizeof(pHTInfo->SelfHTCap));
-       memset((void*)(&(pHTInfo->SelfHTInfo)), 0, sizeof(pHTInfo->SelfHTInfo));
-       memset((void*)(&(pHTInfo->PeerHTCapBuf)), 0, sizeof(pHTInfo->PeerHTCapBuf));
-       memset((void*)(&(pHTInfo->PeerHTInfoBuf)), 0, sizeof(pHTInfo->PeerHTInfoBuf));
-
-       pHTInfo->bSwBwInProgress = false;
-       pHTInfo->ChnlOp = CHNLOP_NONE;
-
-       // Set default IEEE spec for Draft N
-       pHTInfo->ePeerHTSpecVer = HT_SPEC_VER_IEEE;
-
-       // Realtek proprietary aggregation mode
-       pHTInfo->bCurrentRT2RTAggregation = false;
-       pHTInfo->bCurrentRT2RTLongSlotTime = false;
-       pHTInfo->IOTPeer = 0;
-       pHTInfo->IOTAction = 0;
-
-       //MCS rate initialized here
-       {
-               u8* RegHTSuppRateSets = &(ieee->RegHTSuppRateSet[0]);
-               RegHTSuppRateSets[0] = 0xFF;    //support MCS 0~7
-               RegHTSuppRateSets[1] = 0xFF;    //support MCS 8~15
-               RegHTSuppRateSets[4] = 0x01;    //support MCS 32
-       }
-}
-/********************************************************************************************************************
- *function:  initialize Bss HT structure(struct PBSS_HT)
- *   input:  PBSS_HT pBssHT //to be initialized
- *  output:  none
- *  return:  none
- *  notice: This function is called when initialize network structure
-********************************************************************************************************************/
-void HTInitializeBssDesc(PBSS_HT pBssHT)
-{
-
-       pBssHT->bdSupportHT = false;
-       memset(pBssHT->bdHTCapBuf, 0, sizeof(pBssHT->bdHTCapBuf));
-       pBssHT->bdHTCapLen = 0;
-       memset(pBssHT->bdHTInfoBuf, 0, sizeof(pBssHT->bdHTInfoBuf));
-       pBssHT->bdHTInfoLen = 0;
-
-       pBssHT->bdHTSpecVer= HT_SPEC_VER_IEEE;
-
-       pBssHT->bdRT2RTAggregation = false;
-       pBssHT->bdRT2RTLongSlotTime = false;
-}
-#if 0
-//below function has merged into ieee80211_network_init() in ieee80211_rx.c
-void
-HTParsingHTCapElement(
-       IN      PADAPTER                Adapter,
-       IN      OCTET_STRING    HTCapIE,
-       OUT     PRT_WLAN_BSS    pBssDesc
-)
-{
-       PMGNT_INFO                              pMgntInfo = &Adapter->MgntInfo;
-
-       if( HTCapIE.Length > sizeof(pBssDesc->BssHT.bdHTCapBuf) )
-       {
-               RT_TRACE( COMP_HT, DBG_LOUD, ("HTParsingHTCapElement(): HT Capability Element length is too long!\n") );
-               return;
-       }
-
-       // TODO: Check the correctness of HT Cap
-       //Print each field in detail. Driver should not print out this message by default
-       if(!pMgntInfo->mActingAsAp && !pMgntInfo->mAssoc)
-               HTDebugHTCapability(DBG_TRACE, Adapter, &HTCapIE, (pu8)"HTParsingHTCapElement()");
-
-       HTCapIE.Length = HTCapIE.Length > sizeof(pBssDesc->BssHT.bdHTCapBuf)?\
-               sizeof(pBssDesc->BssHT.bdHTCapBuf):HTCapIE.Length;      //prevent from overflow
-
-       CopyMem(pBssDesc->BssHT.bdHTCapBuf, HTCapIE.Octet, HTCapIE.Length);
-       pBssDesc->BssHT.bdHTCapLen = HTCapIE.Length;
-
-}
-
-
-void
-HTParsingHTInfoElement(
-       PADAPTER                Adapter,
-       OCTET_STRING    HTInfoIE,
-       PRT_WLAN_BSS    pBssDesc
-)
-{
-       PMGNT_INFO                              pMgntInfo = &Adapter->MgntInfo;
-
-       if( HTInfoIE.Length > sizeof(pBssDesc->BssHT.bdHTInfoBuf))
-       {
-               RT_TRACE( COMP_HT, DBG_LOUD, ("HTParsingHTInfoElement(): HT Information Element length is too long!\n") );
-               return;
-       }
-
-       // TODO: Check the correctness of HT Info
-       //Print each field in detail. Driver should not print out this message by default
-       if(!pMgntInfo->mActingAsAp && !pMgntInfo->mAssoc)
-               HTDebugHTInfo(DBG_TRACE, Adapter, &HTInfoIE, (pu8)"HTParsingHTInfoElement()");
-
-       HTInfoIE.Length = HTInfoIE.Length > sizeof(pBssDesc->BssHT.bdHTInfoBuf)?\
-               sizeof(pBssDesc->BssHT.bdHTInfoBuf):HTInfoIE.Length;    //prevent from overflow
-
-       CopyMem( pBssDesc->BssHT.bdHTInfoBuf, HTInfoIE.Octet, HTInfoIE.Length);
-       pBssDesc->BssHT.bdHTInfoLen = HTInfoIE.Length;
-}
-
-/*
-  * Get HT related information from beacon and save it in BssDesc
-  *
-  * (1) Parse HTCap, and HTInfo, and record whether it is 11n AP
-  * (2) If peer is HT, but not WMM, call QosSetLegacyWMMParamWithHT()
-  * (3) Check whether peer is Realtek AP (for Realtek proprietary aggregation mode).
-  * Input:
-  *            PADAPTER        Adapter
-  *
-  * Output:
-  *            PRT_TCB         BssDesc
-  *
-*/
-void HTGetValueFromBeaconOrProbeRsp(
-       PADAPTER                        Adapter,
-       POCTET_STRING           pSRCmmpdu,
-       PRT_WLAN_BSS            bssDesc
-)
-{
-       PMGNT_INFO                              pMgntInfo = &Adapter->MgntInfo;
-       PRT_HIGH_THROUGHPUT             pHTInfo = GET_HT_INFO(pMgntInfo);
-       OCTET_STRING                            HTCapIE, HTInfoIE, HTRealtekAgg, mmpdu;
-       OCTET_STRING                            BroadcomElement, CiscoElement;
-
-       mmpdu.Octet = pSRCmmpdu->Octet;
-       mmpdu.Length = pSRCmmpdu->Length;
-
-       //2Note:
-       //   Mark for IOT testing using  Linksys WRT350N, This AP does not contain WMM IE  when
-       //   it is configured at pure-N mode.
-       //      if(bssDesc->BssQos.bdQoSMode & QOS_WMM)
-       //
-
-       HTInitializeBssDesc (&bssDesc->BssHT);
-
-       //2<1> Parse HTCap, and HTInfo
-       // Get HT Capability IE: (1) Get IEEE Draft N IE or (2) Get EWC IE
-       HTCapIE = PacketGetElement(mmpdu, EID_HTCapability, OUI_SUB_DONT_CARE, OUI_SUBTYPE_DONT_CARE);
-       if(HTCapIE.Length == 0)
-       {
-               HTCapIE = PacketGetElement(mmpdu, EID_Vendor, OUI_SUB_11N_EWC_HT_CAP, OUI_SUBTYPE_DONT_CARE);
-               if(HTCapIE.Length != 0)
-                       bssDesc->BssHT.bdHTSpecVer= HT_SPEC_VER_EWC;
-       }
-       if(HTCapIE.Length != 0)
-               HTParsingHTCapElement(Adapter, HTCapIE, bssDesc);
-
-       // Get HT Information IE: (1) Get IEEE Draft N IE or (2) Get EWC IE
-       HTInfoIE = PacketGetElement(mmpdu, EID_HTInfo, OUI_SUB_DONT_CARE, OUI_SUBTYPE_DONT_CARE);
-       if(HTInfoIE.Length == 0)
-       {
-               HTInfoIE = PacketGetElement(mmpdu, EID_Vendor, OUI_SUB_11N_EWC_HT_INFO, OUI_SUBTYPE_DONT_CARE);
-               if(HTInfoIE.Length != 0)
-                               bssDesc->BssHT.bdHTSpecVer  = HT_SPEC_VER_EWC;
-       }
-       if(HTInfoIE.Length != 0)
-               HTParsingHTInfoElement(Adapter, HTInfoIE, bssDesc);
-
-       //2<2>If peer is HT, but not WMM, call QosSetLegacyWMMParamWithHT()
-       if(HTCapIE.Length != 0)
-       {
-               bssDesc->BssHT.bdSupportHT = true;
-               if(bssDesc->BssQos.bdQoSMode == QOS_DISABLE)
-                       QosSetLegacyWMMParamWithHT(Adapter, bssDesc);
-       }
-       else
-       {
-               bssDesc->BssHT.bdSupportHT = false;
-       }
-
-       //2<3>Check whether the peer is Realtek AP/STA
-       if(pHTInfo->bRegRT2RTAggregation)
-       {
-               if(bssDesc->BssHT.bdSupportHT)
-               {
-                       HTRealtekAgg = PacketGetElement(mmpdu, EID_Vendor, OUI_SUB_REALTEK_AGG, OUI_SUBTYPE_DONT_CARE);
-                       if(HTRealtekAgg.Length >=5 )
-                       {
-                               bssDesc->BssHT.bdRT2RTAggregation = true;
-
-                               if((HTRealtekAgg.Octet[4]==1) && (HTRealtekAgg.Octet[5] & 0x02))
-                                       bssDesc->BssHT.bdRT2RTLongSlotTime = true;
-                       }
-               }
-       }
-
-       //
-       // 2008/01/25 MH Get Broadcom AP IE for manamgent frame CCK rate problem.
-       // AP can not receive CCK managemtn from from 92E.
-       //
-
-       // Initialize every new bss broadcom cap exist as false..
-       bssDesc->bBroadcomCapExist= false;
-
-       if(HTCapIE.Length != 0 || HTInfoIE.Length != 0)
-       {
-               u4Byte  Length = 0;
-
-               FillOctetString(BroadcomElement, NULL, 0);
-
-               BroadcomElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_BROADCOM_IE_1, OUI_SUBTYPE_DONT_CARE);
-               Length += BroadcomElement.Length;
-               BroadcomElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_BROADCOM_IE_2, OUI_SUBTYPE_DONT_CARE);
-               Length += BroadcomElement.Length;
-               BroadcomElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_BROADCOM_IE_3, OUI_SUBTYPE_DONT_CARE);
-               Length += BroadcomElement.Length;
-
-               if(Length > 0)
-                       bssDesc->bBroadcomCapExist = true;
-       }
-
-
-       // For Cisco IOT issue
-       CiscoElement = PacketGetElement( mmpdu, EID_Vendor, OUI_SUB_CISCO_IE, OUI_SUBTYPE_DONT_CARE);
-       if(CiscoElement.Length != 0){ // 3: 0x00, 0x40, 0x96 ....
-               bssDesc->bCiscoCapExist = true;
-       }else{
-               bssDesc->bCiscoCapExist = false;
-       }
-}
-
-
-#endif
-/********************************************************************************************************************
- *function:  initialize Bss HT structure(struct PBSS_HT)
- *   input:  struct ieee80211_device   *ieee
- *          struct ieee80211_network   *pNetwork //usually current network we are live in
- *  output:  none
- *  return:  none
- *  notice: This function should ONLY be called before association
-********************************************************************************************************************/
-void HTResetSelfAndSavePeerSetting(struct ieee80211_device* ieee,      struct ieee80211_network * pNetwork)
-{
-       PRT_HIGH_THROUGHPUT             pHTInfo = ieee->pHTInfo;
-//     u16                                             nMaxAMSDUSize;
-//     PHT_CAPABILITY_ELE              pPeerHTCap = (PHT_CAPABILITY_ELE)pNetwork->bssht.bdHTCapBuf;
-//     PHT_INFORMATION_ELE             pPeerHTInfo = (PHT_INFORMATION_ELE)pNetwork->bssht.bdHTInfoBuf;
-//     u8*     pMcsFilter;
-       u8      bIOTAction = 0;
-
-       //
-       //  Save Peer Setting before Association
-       //
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "==============>%s()\n", __FUNCTION__);
-       /*unmark bEnableHT flag here is the same reason why unmarked in function ieee80211_softmac_new_net. WB 2008.09.10*/
-//     if( pHTInfo->bEnableHT &&  pNetwork->bssht.bdSupportHT)
-       if (pNetwork->bssht.bdSupportHT)
-       {
-               pHTInfo->bCurrentHTSupport = true;
-               pHTInfo->ePeerHTSpecVer = pNetwork->bssht.bdHTSpecVer;
-
-               // Save HTCap and HTInfo information Element
-               if(pNetwork->bssht.bdHTCapLen > 0 &&    pNetwork->bssht.bdHTCapLen <= sizeof(pHTInfo->PeerHTCapBuf))
-                       memcpy(pHTInfo->PeerHTCapBuf, pNetwork->bssht.bdHTCapBuf, pNetwork->bssht.bdHTCapLen);
-
-               if(pNetwork->bssht.bdHTInfoLen > 0 && pNetwork->bssht.bdHTInfoLen <= sizeof(pHTInfo->PeerHTInfoBuf))
-                       memcpy(pHTInfo->PeerHTInfoBuf, pNetwork->bssht.bdHTInfoBuf, pNetwork->bssht.bdHTInfoLen);
-
-               // Check whether RT to RT aggregation mode is enabled
-               if(pHTInfo->bRegRT2RTAggregation)
-               {
-                       pHTInfo->bCurrentRT2RTAggregation = pNetwork->bssht.bdRT2RTAggregation;
-                       pHTInfo->bCurrentRT2RTLongSlotTime = pNetwork->bssht.bdRT2RTLongSlotTime;
-               }
-               else
-               {
-                       pHTInfo->bCurrentRT2RTAggregation = false;
-                       pHTInfo->bCurrentRT2RTLongSlotTime = false;
-               }
-
-               // Determine the IOT Peer Vendor.
-               HTIOTPeerDetermine(ieee);
-
-               // Decide IOT Action
-               // Must be called after the parameter of pHTInfo->bCurrentRT2RTAggregation is decided
-               pHTInfo->IOTAction = 0;
-               bIOTAction = HTIOTActIsDisableMCS14(ieee, pNetwork->bssid);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_MCS14;
-               bIOTAction = HTIOTActIsForcedCTS2Self(ieee, pNetwork);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
-
-               bIOTAction = HTIOTActIsDisableMCS15(ieee);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_MCS15;
-
-               bIOTAction = HTIOTActIsDisableMCSTwoSpatialStream(ieee, pNetwork->bssid);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_ALL_2SS;
-
-
-               bIOTAction = HTIOTActIsDisableEDCATurbo(ieee, pNetwork->bssid);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_EDCA_TURBO;
-
-               bIOTAction = HTIOTActIsMgntUseCCK6M(pNetwork);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_MGNT_USE_CCK_6M;
-
-               bIOTAction = HTIOTActIsCCDFsync(pNetwork->bssid);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_CDD_FSYNC;
-
-               bIOTAction = HTIOTActIsNullDataPowerSaving(ieee, pNetwork);
-               if(bIOTAction)
-                       pHTInfo->IOTAction |= HT_IOT_ACT_NULL_DATA_POWER_SAVING;
-
-       }
-       else
-       {
-               pHTInfo->bCurrentHTSupport = false;
-               pHTInfo->bCurrentRT2RTAggregation = false;
-               pHTInfo->bCurrentRT2RTLongSlotTime = false;
-
-               pHTInfo->IOTAction = 0;
-       }
-
-}
-
-void HTUpdateSelfAndPeerSetting(struct ieee80211_device* ieee,         struct ieee80211_network * pNetwork)
-{
-       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
-//     PHT_CAPABILITY_ELE              pPeerHTCap = (PHT_CAPABILITY_ELE)pNetwork->bssht.bdHTCapBuf;
-       PHT_INFORMATION_ELE             pPeerHTInfo = (PHT_INFORMATION_ELE)pNetwork->bssht.bdHTInfoBuf;
-
-       if(pHTInfo->bCurrentHTSupport)
-       {
-               //
-               // Config current operation mode.
-               //
-               if(pNetwork->bssht.bdHTInfoLen != 0)
-                       pHTInfo->CurrentOpMode = pPeerHTInfo->OptMode;
-
-               //
-               // <TODO: Config according to OBSS non-HT STA present!!>
-               //
-       }
-}
-
-void HTUseDefaultSetting(struct ieee80211_device* ieee)
-{
-       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
-//     u8      regBwOpMode;
-
-       if(pHTInfo->bEnableHT)
-       {
-               pHTInfo->bCurrentHTSupport = true;
-
-               pHTInfo->bCurSuppCCK = pHTInfo->bRegSuppCCK;
-
-               pHTInfo->bCurBW40MHz = pHTInfo->bRegBW40MHz;
-
-               pHTInfo->bCurShortGI20MHz= pHTInfo->bRegShortGI20MHz;
-
-               pHTInfo->bCurShortGI40MHz= pHTInfo->bRegShortGI40MHz;
-
-               pHTInfo->bCurrent_AMSDU_Support = pHTInfo->bAMSDU_Support;
-
-               pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
-
-               pHTInfo->bCurrentAMPDUEnable = pHTInfo->bAMPDUEnable;
-
-               pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
-
-               pHTInfo->CurrentMPDUDensity = pHTInfo->CurrentMPDUDensity;
-
-               // Set BWOpMode register
-
-               //update RATR index0
-               HTFilterMCSRate(ieee, ieee->Regdot11HTOperationalRateSet, ieee->dot11HTOperationalRateSet);
-       //function below is not implemented at all. WB
-#ifdef TODO
-               Adapter->HalFunc.InitHalRATRTableHandler( Adapter, &pMgntInfo->dot11OperationalRateSet, pMgntInfo->dot11HTOperationalRateSet);
-#endif
-               ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee, ieee->dot11HTOperationalRateSet, MCS_FILTER_ALL);
-               ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
-
-       }
-       else
-       {
-               pHTInfo->bCurrentHTSupport = false;
-       }
-}
-/********************************************************************************************************************
- *function:  check whether HT control field exists
- *   input:  struct ieee80211_device   *ieee
- *          u8*                        pFrame //coming skb->data
- *  output:  none
- *  return:  return true if HT control field exists(false otherwise)
- *  notice:
-********************************************************************************************************************/
-u8 HTCCheck(struct ieee80211_device* ieee, u8* pFrame)
-{
-       if(ieee->pHTInfo->bCurrentHTSupport)
-       {
-               if( (IsQoSDataFrame(pFrame) && Frame_Order(pFrame)) == 1)
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_HT, "HT CONTROL FILED EXIST!!\n");
-                       return true;
-               }
-       }
-       return false;
-}
-
-//
-// This function set bandwidth mode in protocol layer.
-//
-void HTSetConnectBwMode(struct ieee80211_device* ieee, HT_CHANNEL_WIDTH        Bandwidth, HT_EXTCHNL_OFFSET    Offset)
-{
-       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
-//     u32 flags = 0;
-
-       if(pHTInfo->bRegBW40MHz == false)
-               return;
-
-
-
-       // To reduce dummy operation
-//     if((pHTInfo->bCurBW40MHz==false && Bandwidth==HT_CHANNEL_WIDTH_20) ||
-//        (pHTInfo->bCurBW40MHz==true && Bandwidth==HT_CHANNEL_WIDTH_20_40 && Offset==pHTInfo->CurSTAExtChnlOffset))
-//             return;
-
-//     spin_lock_irqsave(&(ieee->bw_spinlock), flags);
-       if(pHTInfo->bSwBwInProgress) {
-//             spin_unlock_irqrestore(&(ieee->bw_spinlock), flags);
-               return;
-       }
-       //if in half N mode, set to 20M bandwidth please 09.08.2008 WB.
-       if (Bandwidth==HT_CHANNEL_WIDTH_20_40 && (!ieee->GetHalfNmodeSupportByAPsHandler(ieee)))
-        {
-                       // Handle Illegal extension channel offset!!
-               if(ieee->current_network.channel<2 && Offset==HT_EXTCHNL_OFFSET_LOWER)
-                       Offset = HT_EXTCHNL_OFFSET_NO_EXT;
-               if(Offset==HT_EXTCHNL_OFFSET_UPPER || Offset==HT_EXTCHNL_OFFSET_LOWER) {
-                       pHTInfo->bCurBW40MHz = true;
-                       pHTInfo->CurSTAExtChnlOffset = Offset;
-               } else {
-                       pHTInfo->bCurBW40MHz = false;
-                       pHTInfo->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
-               }
-       } else {
-               pHTInfo->bCurBW40MHz = false;
-               pHTInfo->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
-       }
-
-       pHTInfo->bSwBwInProgress = true;
-
-       // TODO: 2007.7.13 by Emily Wait 2000ms  in order to guarantee that switching
-       //   bandwidth is executed after scan is finished. It is a temporal solution
-       //   because software should ganrantee the last operation of switching bandwidth
-       //   is executed properlly.
-       HTSetConnectBwModeCallback(ieee);
-
-//     spin_unlock_irqrestore(&(ieee->bw_spinlock), flags);
-}
-
-void HTSetConnectBwModeCallback(struct ieee80211_device* ieee)
-{
-       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
-
-       IEEE80211_DEBUG(IEEE80211_DL_HT, "======>%s()\n", __FUNCTION__);
-
-       if(pHTInfo->bCurBW40MHz)
-       {
-               if(pHTInfo->CurSTAExtChnlOffset==HT_EXTCHNL_OFFSET_UPPER)
-                       ieee->set_chan(ieee, ieee->current_network.channel+2);
-               else if(pHTInfo->CurSTAExtChnlOffset==HT_EXTCHNL_OFFSET_LOWER)
-                       ieee->set_chan(ieee, ieee->current_network.channel-2);
-               else
-                       ieee->set_chan(ieee, ieee->current_network.channel);
-
-               ieee->SetBWModeHandler(ieee, HT_CHANNEL_WIDTH_20_40, pHTInfo->CurSTAExtChnlOffset);
-       } else {
-               ieee->set_chan(ieee, ieee->current_network.channel);
-               ieee->SetBWModeHandler(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
-       }
-
-       pHTInfo->bSwBwInProgress = false;
-}
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_Qos.h b/drivers/staging/rtl8192e/ieee80211/rtl819x_Qos.h
deleted file mode 100644 (file)
index d4565ec..0000000
+++ /dev/null
@@ -1,582 +0,0 @@
-#ifndef __INC_QOS_TYPE_H
-#define __INC_QOS_TYPE_H
-
-#define BIT0                    0x00000001
-#define BIT1                    0x00000002
-#define BIT2                    0x00000004
-#define BIT3                    0x00000008
-#define BIT4                    0x00000010
-#define BIT5                    0x00000020
-#define BIT6                    0x00000040
-#define BIT7                    0x00000080
-#define BIT8                    0x00000100
-#define BIT9                    0x00000200
-#define BIT10                   0x00000400
-#define BIT11                   0x00000800
-#define BIT12                   0x00001000
-#define BIT13                   0x00002000
-#define BIT14                   0x00004000
-#define BIT15                   0x00008000
-#define BIT16                   0x00010000
-#define BIT17                   0x00020000
-#define BIT18                   0x00040000
-#define BIT19                   0x00080000
-#define BIT20                   0x00100000
-#define BIT21                   0x00200000
-#define BIT22                   0x00400000
-#define BIT23                   0x00800000
-#define BIT24                   0x01000000
-#define BIT25                   0x02000000
-#define BIT26                   0x04000000
-#define BIT27                   0x08000000
-#define BIT28                   0x10000000
-#define BIT29                   0x20000000
-#define BIT30                   0x40000000
-#define BIT31                   0x80000000
-
-#define        MAX_WMMELE_LENGTH       64
-
-//
-// QoS mode.
-// enum 0, 1, 2, 4: since we can use the OR(|) operation.
-//
-// QOS_MODE is redefined for enum can't be ++, | under C++ compiler, 2006.05.17, by rcnjko.
-//typedef      enum _QOS_MODE{
-//     QOS_DISABLE             = 0,
-//     QOS_WMM                 = 1,
-//     QOS_EDCA                        = 2,
-//     QOS_HCCA                        = 4,
-//}QOS_MODE,*PQOS_MODE;
-//
-typedef u32 QOS_MODE, *PQOS_MODE;
-#define QOS_DISABLE            0
-#define QOS_WMM                        1
-#define QOS_WMMSA              2
-#define QOS_EDCA               4
-#define QOS_HCCA               8
-#define QOS_WMM_UAPSD          16   //WMM Power Save, 2006-06-14 Isaiah
-
-#define AC_PARAM_SIZE  4
-#define WMM_PARAM_ELE_BODY_LEN 18
-
-//
-// QoS ACK Policy Field Values
-// Ref: WMM spec 2.1.6: QoS Control Field, p.10.
-//
-typedef        enum _ACK_POLICY{
-       eAckPlc0_ACK            = 0x00,
-       eAckPlc1_NoACK          = 0x01,
-}ACK_POLICY,*PACK_POLICY;
-
-#define WMM_PARAM_ELEMENT_SIZE (8+(4*AC_PARAM_SIZE))
-
-//
-// QoS Control Field
-// Ref:
-//     1. WMM spec 2.1.6: QoS Control Field, p.9.
-//     2. 802.11e/D13.0 7.1.3.5, p.26.
-//
-typedef        union _QOS_CTRL_FIELD{
-       u8      charData[2];
-       u16     shortData;
-
-       // WMM spec
-       struct
-       {
-               u8              UP:3;
-               u8              usRsvd1:1;
-               u8              EOSP:1;
-               u8              AckPolicy:2;
-               u8              usRsvd2:1;
-               u8              ucRsvdByte;
-       }WMM;
-
-       // 802.11e: QoS data type frame sent by non-AP QSTAs.
-       struct
-       {
-               u8              TID:4;
-               u8              bIsQsize:1;// 0: BIT[8:15] is TXOP Duration Requested, 1: BIT[8:15] is Queue Size.
-               u8              AckPolicy:2;
-               u8              usRsvd:1;
-               u8              TxopOrQsize;    // (BIT4=0)TXOP Duration Requested or (BIT4=1)Queue Size.
-       }BySta;
-
-       // 802.11e: QoS data, QoS Null, and QoS Data+CF-Ack frames sent by HC.
-       struct
-       {
-               u8              TID:4;
-               u8              EOSP:1;
-               u8              AckPolicy:2;
-               u8              usRsvd:1;
-               u8              PSBufState;             // QAP PS Buffer State.
-       }ByHc_Data;
-
-       // 802.11e: QoS (+) CF-Poll frames sent by HC.
-       struct
-       {
-               u8              TID:4;
-               u8              EOSP:1;
-               u8              AckPolicy:2;
-               u8              usRsvd:1;
-               u8              TxopLimit;              // TXOP Limit.
-       }ByHc_CFP;
-
-}QOS_CTRL_FIELD, *PQOS_CTRL_FIELD;
-
-
-//
-// QoS Info Field
-// Ref:
-//     1. WMM spec 2.2.1: WME Information Element, p.11.
-//     2. 8185 QoS code: QOS_INFO [def. in QoS_mp.h]
-//
-typedef        union _QOS_INFO_FIELD{
-       u8      charData;
-
-       struct
-       {
-               u8              ucParameterSetCount:4;
-               u8              ucReserved:4;
-       }WMM;
-
-       struct
-       {
-               //Ref WMM_Specification_1-1.pdf, 2006-06-13 Isaiah
-               u8              ucAC_VO_UAPSD:1;
-               u8              ucAC_VI_UAPSD:1;
-               u8              ucAC_BE_UAPSD:1;
-               u8              ucAC_BK_UAPSD:1;
-               u8              ucReserved1:1;
-               u8              ucMaxSPLen:2;
-               u8              ucReserved2:1;
-
-       }ByWmmPsSta;
-
-       struct
-       {
-               //Ref WMM_Specification_1-1.pdf, 2006-06-13 Isaiah
-               u8              ucParameterSetCount:4;
-               u8              ucReserved:3;
-               u8              ucApUapsd:1;
-       }ByWmmPsAp;
-
-       struct
-       {
-               u8              ucAC3_UAPSD:1;
-               u8              ucAC2_UAPSD:1;
-               u8              ucAC1_UAPSD:1;
-               u8              ucAC0_UAPSD:1;
-               u8              ucQAck:1;
-               u8              ucMaxSPLen:2;
-               u8              ucMoreDataAck:1;
-       } By11eSta;
-
-       struct
-       {
-               u8              ucParameterSetCount:4;
-               u8              ucQAck:1;
-               u8              ucQueueReq:1;
-               u8              ucTXOPReq:1;
-               u8              ucReserved:1;
-       } By11eAp;
-
-       struct
-       {
-               u8              ucReserved1:4;
-               u8              ucQAck:1;
-               u8              ucReserved2:2;
-               u8              ucMoreDataAck:1;
-       } ByWmmsaSta;
-
-       struct
-       {
-               u8              ucReserved1:4;
-               u8              ucQAck:1;
-               u8              ucQueueReq:1;
-               u8              ucTXOPReq:1;
-               u8              ucReserved2:1;
-       } ByWmmsaAp;
-
-       struct
-       {
-               u8              ucAC3_UAPSD:1;
-               u8              ucAC2_UAPSD:1;
-               u8              ucAC1_UAPSD:1;
-               u8              ucAC0_UAPSD:1;
-               u8              ucQAck:1;
-               u8              ucMaxSPLen:2;
-               u8              ucMoreDataAck:1;
-       } ByAllSta;
-
-       struct
-       {
-               u8              ucParameterSetCount:4;
-               u8              ucQAck:1;
-               u8              ucQueueReq:1;
-               u8              ucTXOPReq:1;
-               u8              ucApUapsd:1;
-       } ByAllAp;
-
-}QOS_INFO_FIELD, *PQOS_INFO_FIELD;
-
-//
-// ACI to AC coding.
-// Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
-//
-// AC_CODING is redefined for enum can't be ++, | under C++ compiler, 2006.05.17, by rcnjko.
-//typedef      enum _AC_CODING{
-//     AC0_BE  = 0,            // ACI: 0x00    // Best Effort
-//     AC1_BK  = 1,            // ACI: 0x01    // Background
-//     AC2_VI  = 2,            // ACI: 0x10    // Video
-//     AC3_VO  = 3,            // ACI: 0x11    // Voice
-//     AC_MAX = 4,             // Max: define total number; Should not to be used as a real enum.
-//}AC_CODING,*PAC_CODING;
-//
-typedef u32 AC_CODING;
-#define AC0_BE 0               // ACI: 0x00    // Best Effort
-#define AC1_BK 1               // ACI: 0x01    // Background
-#define AC2_VI 2               // ACI: 0x10    // Video
-#define AC3_VO 3               // ACI: 0x11    // Voice
-#define AC_MAX 4               // Max: define total number; Should not to be used as a real enum.
-
-//
-// ACI/AIFSN Field.
-// Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
-//
-typedef        union _ACI_AIFSN{
-       u8      charData;
-
-       struct
-       {
-               u8      AIFSN:4;
-               u8      ACM:1;
-               u8      ACI:2;
-               u8      Reserved:1;
-       }f;     // Field
-}ACI_AIFSN, *PACI_AIFSN;
-
-//
-// ECWmin/ECWmax field.
-// Ref: WMM spec 2.2.2: WME Parameter Element, p.13.
-//
-typedef        union _ECW{
-       u8      charData;
-       struct
-       {
-               u8      ECWmin:4;
-               u8      ECWmax:4;
-       }f;     // Field
-}ECW, *PECW;
-
-//
-// AC Parameters Record Format.
-// Ref: WMM spec 2.2.2: WME Parameter Element, p.12.
-//
-typedef        union _AC_PARAM{
-       u32     longData;
-       u8      charData[4];
-
-       struct
-       {
-               ACI_AIFSN       AciAifsn;
-               ECW             Ecw;
-               u16             TXOPLimit;
-       }f;     // Field
-}AC_PARAM, *PAC_PARAM;
-
-
-
-//
-// QoS element subtype
-//
-typedef        enum _QOS_ELE_SUBTYPE{
-       QOSELE_TYPE_INFO        = 0x00,         // 0x00: Information element
-       QOSELE_TYPE_PARAM       = 0x01,         // 0x01: parameter element
-}QOS_ELE_SUBTYPE,*PQOS_ELE_SUBTYPE;
-
-
-//
-// Direction Field Values.
-// Ref: WMM spec 2.2.11: WME TSPEC Element, p.18.
-//
-typedef        enum _DIRECTION_VALUE{
-       DIR_UP                  = 0,            // 0x00 // UpLink
-       DIR_DOWN                = 1,            // 0x01 // DownLink
-       DIR_DIRECT              = 2,            // 0x10 // DirectLink
-       DIR_BI_DIR              = 3,            // 0x11 // Bi-Direction
-}DIRECTION_VALUE,*PDIRECTION_VALUE;
-
-
-//
-// TS Info field in WMM TSPEC Element.
-// Ref:
-//     1. WMM spec 2.2.11: WME TSPEC Element, p.18.
-//     2. 8185 QoS code: QOS_TSINFO [def. in QoS_mp.h]
-//
-typedef union _QOS_TSINFO{
-       u8              charData[3];
-       struct {
-               u8              ucTrafficType:1;                        //WMM is reserved
-               u8              ucTSID:4;
-               u8              ucDirection:2;
-               u8              ucAccessPolicy:2;       //WMM: bit8=0, bit7=1
-               u8              ucAggregation:1;                //WMM is reserved
-               u8              ucPSB:1;                                //WMMSA is APSD
-               u8              ucUP:3;
-               u8              ucTSInfoAckPolicy:2;            //WMM is reserved
-               u8              ucSchedule:1;                   //WMM is reserved
-               u8              ucReserved:7;
-       }field;
-}QOS_TSINFO, *PQOS_TSINFO;
-
-//
-// WMM TSPEC Body.
-// Ref: WMM spec 2.2.11: WME TSPEC Element, p.16.
-//
-typedef union _TSPEC_BODY{
-       u8              charData[55];
-
-       struct
-       {
-               QOS_TSINFO      TSInfo; //u8    TSInfo[3];
-               u16     NominalMSDUsize;
-               u16     MaxMSDUsize;
-               u32     MinServiceItv;
-               u32     MaxServiceItv;
-               u32     InactivityItv;
-               u32     SuspenItv;
-               u32     ServiceStartTime;
-               u32     MinDataRate;
-               u32     MeanDataRate;
-               u32     PeakDataRate;
-               u32     MaxBurstSize;
-               u32     DelayBound;
-               u32     MinPhyRate;
-               u16     SurplusBandwidthAllowance;
-               u16     MediumTime;
-       } f;    // Field
-}TSPEC_BODY, *PTSPEC_BODY;
-
-
-//
-// WMM TSPEC Element.
-// Ref: WMM spec 2.2.11: WME TSPEC Element, p.16.
-//
-typedef struct _WMM_TSPEC{
-       u8              ID;
-       u8              Length;
-       u8              OUI[3];
-       u8              OUI_Type;
-       u8              OUI_SubType;
-       u8              Version;
-       TSPEC_BODY      Body;
-} WMM_TSPEC, *PWMM_TSPEC;
-
-//
-// ACM implementation method.
-// Annie, 2005-12-13.
-//
-typedef        enum _ACM_METHOD{
-       eAcmWay0_SwAndHw                = 0,            // By SW and HW.
-       eAcmWay1_HW                     = 1,            // By HW.
-       eAcmWay2_SW                     = 2,            // By SW.
-}ACM_METHOD,*PACM_METHOD;
-
-
-typedef struct _ACM{
-//     u8              RegEnableACM;
-       u64             UsedTime;
-       u64             MediumTime;
-       u8              HwAcmCtl;       // TRUE: UsedTime exceed => Do NOT USE this AC. It wll be written to ACM_CONTROL(0xBF BIT 0/1/2 in 8185B).
-}ACM, *PACM;
-
-typedef        u8              AC_UAPSD, *PAC_UAPSD;
-
-#define        GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
-#define        SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
-
-#define        GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
-#define        SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
-
-#define        GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
-#define        SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
-
-#define        GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
-#define        SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
-
-
-//typedef struct _TCLASS{
-// TODO
-//} TCLASS, *PTCLASS;
-typedef union _QOS_TCLAS{
-
-       struct _TYPE_GENERAL{
-               u8              Priority;
-               u8              ClassifierType;
-               u8              Mask;
-       } TYPE_GENERAL;
-
-       struct _TYPE0_ETH{
-               u8              Priority;
-               u8              ClassifierType;
-               u8              Mask;
-               u8              SrcAddr[6];
-               u8              DstAddr[6];
-               u16             Type;
-       } TYPE0_ETH;
-
-       struct _TYPE1_IPV4{
-               u8              Priority;
-               u8              ClassifierType;
-               u8              Mask;
-               u8              Version;
-               u8              SrcIP[4];
-               u8              DstIP[4];
-               u16             SrcPort;
-               u16             DstPort;
-               u8              DSCP;
-               u8              Protocol;
-               u8              Reserved;
-       } TYPE1_IPV4;
-
-       struct _TYPE1_IPV6{
-               u8              Priority;
-               u8              ClassifierType;
-               u8              Mask;
-               u8              Version;
-               u8              SrcIP[16];
-               u8              DstIP[16];
-               u16             SrcPort;
-               u16             DstPort;
-               u8              FlowLabel[3];
-       } TYPE1_IPV6;
-
-       struct _TYPE2_8021Q{
-               u8              Priority;
-               u8              ClassifierType;
-               u8              Mask;
-               u16             TagType;
-       } TYPE2_8021Q;
-} QOS_TCLAS, *PQOS_TCLAS;
-
-//typedef struct _WMM_TSTREAM{
-//
-//- TSPEC
-//- AC (which to mapping)
-//} WMM_TSTREAM, *PWMM_TSTREAM;
-typedef struct _QOS_TSTREAM{
-       u8                      AC;
-       WMM_TSPEC               TSpec;
-       QOS_TCLAS               TClass;
-} QOS_TSTREAM, *PQOS_TSTREAM;
-
-//typedef struct _U_APSD{
-//- TriggerEnable [4]
-//- MaxSPLength
-//- HighestAcBuffered
-//} U_APSD, *PU_APSD;
-
-//joseph TODO:
-//     UAPSD function should be implemented by 2 data structure
-//     "Qos control field" and "Qos info field"
-//typedef struct _QOS_UAPSD{
-//     u8                      bTriggerEnable[4];
-//     u8                      MaxSPLength;
-//     u8                      HighestBufAC;
-//} QOS_UAPSD, *PQOS_APSD;
-
-//----------------------------------------------------------------------------
-//      802.11 Management frame Status Code field
-//----------------------------------------------------------------------------
-typedef struct _OCTET_STRING{
-        u8             *Octet;
-        u16             Length;
-}OCTET_STRING, *POCTET_STRING;
-
-//
-// STA QoS data.
-// Ref: DOT11_QOS in 8185 code. [def. in QoS_mp.h]
-//
-typedef struct _STA_QOS{
-       //DECLARE_RT_OBJECT(STA_QOS);
-       u8                              WMMIEBuf[MAX_WMMELE_LENGTH];
-       u8*                             WMMIE;
-
-       // Part 1. Self QoS Mode.
-       QOS_MODE                        QosCapability; //QoS Capability, 2006-06-14 Isaiah
-       QOS_MODE                        CurrentQosMode;
-
-       // For WMM Power Save Mode :
-       // ACs are trigger/delivery enabled or legacy power save enabled. 2006-06-13 Isaiah
-       AC_UAPSD                        b4ac_Uapsd;  //VoUapsd(bit0), ViUapsd(bit1),  BkUapsd(bit2), BeUapsd(bit3),
-       AC_UAPSD                        Curr4acUapsd;
-       u8                              bInServicePeriod;
-       u8                              MaxSPLength;
-       int                             NumBcnBeforeTrigger;
-
-       // Part 2. EDCA Parameter (perAC)
-       u8 *                            pWMMInfoEle;
-       u8                              WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
-       u8                              WMMPELength;
-
-       // <Bruce_Note>
-       //2 ToDo: remove the Qos Info Field and replace it by the above WMM Info element.
-       // By Bruce, 2008-01-30.
-       // Part 2. EDCA Parameter (perAC)
-       QOS_INFO_FIELD                  QosInfoField_STA;       // Maintained by STA
-       QOS_INFO_FIELD                  QosInfoField_AP;        // Retrieved from AP
-
-       AC_PARAM                        CurAcParameters[4];
-
-       // Part 3. ACM
-       ACM                             acm[4];
-       ACM_METHOD                      AcmMethod;
-
-       // Part 4. Per TID (Part 5: TCLASS will be described by TStream)
-       QOS_TSTREAM                     TStream[16];
-       WMM_TSPEC                       TSpec;
-
-       u32                             QBssWirelessMode;
-
-       // No Ack Setting
-       u8                              bNoAck;
-
-       // Enable/Disable Rx immediate BA capability.
-       u8                              bEnableRxImmBA;
-
-}STA_QOS, *PSTA_QOS;
-
-//
-// BSS QOS data.
-// Ref: BssDscr in 8185 code. [def. in BssDscr.h]
-//
-typedef struct _BSS_QOS{
-       QOS_MODE                bdQoSMode;
-
-       u8                      bdWMMIEBuf[MAX_WMMELE_LENGTH];
-       u8*             bdWMMIE;
-
-       QOS_ELE_SUBTYPE         EleSubType;
-
-       u8 *                    pWMMInfoEle;
-       u8 *                    pWMMParamEle;
-
-       QOS_INFO_FIELD          QosInfoField;
-       AC_PARAM                AcParameter[4];
-}BSS_QOS, *PBSS_QOS;
-
-
-//
-// Ref: sQoSCtlLng and QoSCtl definition in 8185 QoS code.
-//#define QoSCtl   ((  (Adapter->bRegQoS) && (Adapter->dot11QoS.QoSMode &(QOS_EDCA|QOS_HCCA))    )  ?sQoSCtlLng:0)
-//
-#define sQoSCtlLng                     2
-#define        QOS_CTRL_LEN(_QosMode)          ((_QosMode > QOS_DISABLE)? sQoSCtlLng : 0)
-
-
-//Added by joseph
-//UP Mapping to AC, using in MgntQuery_SequenceNumber() and maybe for DSCP
-//#define UP2AC(up)                    ((up<3)?((up==0)?1:0):(up>>1))
-#define IsACValid(ac)                  ((ac<=7 )?true:false )
-
-#endif // #ifndef __INC_QOS_TYPE_H
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_TS.h b/drivers/staging/rtl8192e/ieee80211/rtl819x_TS.h
deleted file mode 100644 (file)
index e7e26fd..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef _TSTYPE_H_
-#define _TSTYPE_H_
-#include "rtl819x_Qos.h"
-#define TS_SETUP_TIMEOUT       60  // In millisecond
-#define TS_INACT_TIMEOUT       60
-#define TS_ADDBA_DELAY         60
-
-#define TOTAL_TS_NUM           16
-#define TCLAS_NUM              4
-
-// This define the Tx/Rx directions
-typedef enum _TR_SELECT {
-       TX_DIR = 0,
-       RX_DIR = 1,
-} TR_SELECT, *PTR_SELECT;
-
-typedef struct _TS_COMMON_INFO{
-       struct list_head                List;
-       struct timer_list               SetupTimer;
-       struct timer_list               InactTimer;
-       u8                              Addr[6];
-       TSPEC_BODY                      TSpec;
-       QOS_TCLAS                       TClass[TCLAS_NUM];
-       u8                              TClasProc;
-       u8                              TClasNum;
-} TS_COMMON_INFO, *PTS_COMMON_INFO;
-
-typedef struct _TX_TS_RECORD{
-       TS_COMMON_INFO          TsCommonInfo;
-       u16                             TxCurSeq;
-       BA_RECORD                       TxPendingBARecord;      // For BA Originator
-       BA_RECORD                       TxAdmittedBARecord;     // For BA Originator
-//     QOS_DL_RECORD           DLRecord;
-       u8                              bAddBaReqInProgress;
-       u8                              bAddBaReqDelayed;
-       u8                              bUsingBa;
-       struct timer_list               TsAddBaTimer;
-       u8                              num;
-} TX_TS_RECORD, *PTX_TS_RECORD;
-
-typedef struct _RX_TS_RECORD {
-       TS_COMMON_INFO          TsCommonInfo;
-       u16                             RxIndicateSeq;
-       u16                             RxTimeoutIndicateSeq;
-       struct list_head                RxPendingPktList;
-       struct timer_list               RxPktPendingTimer;
-       BA_RECORD                       RxAdmittedBARecord;      // For BA Recipient
-       u16                             RxLastSeqNum;
-       u8                              RxLastFragNum;
-       u8                              num;
-//     QOS_DL_RECORD           DLRecord;
-} RX_TS_RECORD, *PRX_TS_RECORD;
-
-
-#endif
-
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl819x_TSProc.c b/drivers/staging/rtl8192e/ieee80211/rtl819x_TSProc.c
deleted file mode 100644 (file)
index ad6872d..0000000
+++ /dev/null
@@ -1,627 +0,0 @@
-#include "ieee80211.h"
-#include <linux/etherdevice.h>
-#include <linux/slab.h>
-#include "rtl819x_TS.h"
-
-void TsSetupTimeOut(unsigned long data)
-{
-       // Not implement yet
-       // This is used for WMMSA and ACM , that would send ADDTSReq frame.
-}
-
-void TsInactTimeout(unsigned long data)
-{
-       // Not implement yet
-       // This is used for WMMSA and ACM.
-       // This function would be call when TS is no Tx/Rx for some period of time.
-}
-
-/********************************************************************************************************************
- *function:  I still not understand this function, so wait for further implementation
- *   input:  unsigned long      data           //acturally we send TX_TS_RECORD or RX_TS_RECORD to these timer
- *  return:  NULL
- *  notice:
-********************************************************************************************************************/
-void RxPktPendingTimeout(unsigned long data)
-{
-       PRX_TS_RECORD   pRxTs = (PRX_TS_RECORD)data;
-       struct ieee80211_device *ieee = container_of(pRxTs, struct ieee80211_device, RxTsRecord[pRxTs->num]);
-
-       PRX_REORDER_ENTRY       pReorderEntry = NULL;
-
-       //u32 flags = 0;
-       unsigned long flags = 0;
-       struct ieee80211_rxb *stats_IndicateArray[REORDER_WIN_SIZE];
-       u8 index = 0;
-       bool bPktInBuf = false;
-
-
-       spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
-       //PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
-       IEEE80211_DEBUG(IEEE80211_DL_REORDER,"==================>%s()\n",__FUNCTION__);
-       if(pRxTs->RxTimeoutIndicateSeq != 0xffff)
-       {
-               // Indicate the pending packets sequentially according to SeqNum until meet the gap.
-               while(!list_empty(&pRxTs->RxPendingPktList))
-               {
-                       pReorderEntry = (PRX_REORDER_ENTRY)list_entry(pRxTs->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
-                       if(index == 0)
-                               pRxTs->RxIndicateSeq = pReorderEntry->SeqNum;
-
-                       if( SN_LESS(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) ||
-                               SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)   )
-                       {
-                               list_del_init(&pReorderEntry->List);
-
-                               if(SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq))
-                                       pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096;
-
-                               IEEE80211_DEBUG(IEEE80211_DL_REORDER,"RxPktPendingTimeout(): IndicateSeq: %d\n", pReorderEntry->SeqNum);
-                               stats_IndicateArray[index] = pReorderEntry->prxb;
-                               index++;
-
-                               list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List);
-                       }
-                       else
-                       {
-                               bPktInBuf = true;
-                               break;
-                       }
-               }
-       }
-
-       if(index>0)
-       {
-               // Set RxTimeoutIndicateSeq to 0xffff to indicate no pending packets in buffer now.
-               pRxTs->RxTimeoutIndicateSeq = 0xffff;
-
-               // Indicate packets
-               if(index > REORDER_WIN_SIZE){
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer buffer full!! \n");
-                       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
-                       return;
-               }
-               ieee80211_indicate_packets(ieee, stats_IndicateArray, index);
-       }
-
-       if(bPktInBuf && (pRxTs->RxTimeoutIndicateSeq==0xffff))
-       {
-               pRxTs->RxTimeoutIndicateSeq = pRxTs->RxIndicateSeq;
-               mod_timer(&pRxTs->RxPktPendingTimer, jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime));
-       }
-       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
-       //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
-}
-
-/********************************************************************************************************************
- *function:  Add BA timer function
- *   input:  unsigned long      data           //acturally we send TX_TS_RECORD or RX_TS_RECORD to these timer
- *  return:  NULL
- *  notice:
-********************************************************************************************************************/
-void TsAddBaProcess(unsigned long data)
-{
-       PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)data;
-       u8 num = pTxTs->num;
-       struct ieee80211_device *ieee = container_of(pTxTs, struct ieee80211_device, TxTsRecord[num]);
-
-       TsInitAddBA(ieee, pTxTs, BA_POLICY_IMMEDIATE, false);
-       IEEE80211_DEBUG(IEEE80211_DL_BA, "TsAddBaProcess(): ADDBA Req is started!! \n");
-}
-
-
-void ResetTsCommonInfo(PTS_COMMON_INFO pTsCommonInfo)
-{
-       memset(pTsCommonInfo->Addr, 0, 6);
-       memset(&pTsCommonInfo->TSpec, 0, sizeof(TSPEC_BODY));
-       memset(&pTsCommonInfo->TClass, 0, sizeof(QOS_TCLAS)*TCLAS_NUM);
-       pTsCommonInfo->TClasProc = 0;
-       pTsCommonInfo->TClasNum = 0;
-}
-
-void ResetTxTsEntry(PTX_TS_RECORD pTS)
-{
-       ResetTsCommonInfo(&pTS->TsCommonInfo);
-       pTS->TxCurSeq = 0;
-       pTS->bAddBaReqInProgress = false;
-       pTS->bAddBaReqDelayed = false;
-       pTS->bUsingBa = false;
-       ResetBaEntry(&pTS->TxAdmittedBARecord); //For BA Originator
-       ResetBaEntry(&pTS->TxPendingBARecord);
-}
-
-void ResetRxTsEntry(PRX_TS_RECORD pTS)
-{
-       ResetTsCommonInfo(&pTS->TsCommonInfo);
-       pTS->RxIndicateSeq = 0xffff; // This indicate the RxIndicateSeq is not used now!!
-       pTS->RxTimeoutIndicateSeq = 0xffff; // This indicate the RxTimeoutIndicateSeq is not used now!!
-       ResetBaEntry(&pTS->RxAdmittedBARecord);   // For BA Recipient
-}
-
-void TSInitialize(struct ieee80211_device *ieee)
-{
-       PTX_TS_RECORD           pTxTS  = ieee->TxTsRecord;
-       PRX_TS_RECORD           pRxTS  = ieee->RxTsRecord;
-       PRX_REORDER_ENTRY       pRxReorderEntry = ieee->RxReorderEntry;
-       u8                              count = 0;
-       IEEE80211_DEBUG(IEEE80211_DL_TS, "==========>%s()\n", __FUNCTION__);
-       // Initialize Tx TS related info.
-       INIT_LIST_HEAD(&ieee->Tx_TS_Admit_List);
-       INIT_LIST_HEAD(&ieee->Tx_TS_Pending_List);
-       INIT_LIST_HEAD(&ieee->Tx_TS_Unused_List);
-
-       for(count = 0; count < TOTAL_TS_NUM; count++)
-       {
-               //
-               pTxTS->num = count;
-               // The timers for the operation of Traffic Stream and Block Ack.
-               // DLS related timer will be add here in the future!!
-               init_timer(&pTxTS->TsCommonInfo.SetupTimer);
-               pTxTS->TsCommonInfo.SetupTimer.data = (unsigned long)pTxTS;
-               pTxTS->TsCommonInfo.SetupTimer.function = TsSetupTimeOut;
-
-               init_timer(&pTxTS->TsCommonInfo.InactTimer);
-               pTxTS->TsCommonInfo.InactTimer.data = (unsigned long)pTxTS;
-               pTxTS->TsCommonInfo.InactTimer.function = TsInactTimeout;
-
-               init_timer(&pTxTS->TsAddBaTimer);
-               pTxTS->TsAddBaTimer.data = (unsigned long)pTxTS;
-               pTxTS->TsAddBaTimer.function = TsAddBaProcess;
-
-               init_timer(&pTxTS->TxPendingBARecord.Timer);
-               pTxTS->TxPendingBARecord.Timer.data = (unsigned long)pTxTS;
-               pTxTS->TxPendingBARecord.Timer.function = BaSetupTimeOut;
-
-               init_timer(&pTxTS->TxAdmittedBARecord.Timer);
-               pTxTS->TxAdmittedBARecord.Timer.data = (unsigned long)pTxTS;
-               pTxTS->TxAdmittedBARecord.Timer.function = TxBaInactTimeout;
-
-               ResetTxTsEntry(pTxTS);
-               list_add_tail(&pTxTS->TsCommonInfo.List, &ieee->Tx_TS_Unused_List);
-               pTxTS++;
-       }
-
-       // Initialize Rx TS related info.
-       INIT_LIST_HEAD(&ieee->Rx_TS_Admit_List);
-       INIT_LIST_HEAD(&ieee->Rx_TS_Pending_List);
-       INIT_LIST_HEAD(&ieee->Rx_TS_Unused_List);
-       for(count = 0; count < TOTAL_TS_NUM; count++)
-       {
-               pRxTS->num = count;
-               INIT_LIST_HEAD(&pRxTS->RxPendingPktList);
-
-               init_timer(&pRxTS->TsCommonInfo.SetupTimer);
-               pRxTS->TsCommonInfo.SetupTimer.data = (unsigned long)pRxTS;
-               pRxTS->TsCommonInfo.SetupTimer.function = TsSetupTimeOut;
-
-               init_timer(&pRxTS->TsCommonInfo.InactTimer);
-               pRxTS->TsCommonInfo.InactTimer.data = (unsigned long)pRxTS;
-               pRxTS->TsCommonInfo.InactTimer.function = TsInactTimeout;
-
-               init_timer(&pRxTS->RxAdmittedBARecord.Timer);
-               pRxTS->RxAdmittedBARecord.Timer.data = (unsigned long)pRxTS;
-               pRxTS->RxAdmittedBARecord.Timer.function = RxBaInactTimeout;
-
-               init_timer(&pRxTS->RxPktPendingTimer);
-               pRxTS->RxPktPendingTimer.data = (unsigned long)pRxTS;
-               pRxTS->RxPktPendingTimer.function = RxPktPendingTimeout;
-
-               ResetRxTsEntry(pRxTS);
-               list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List);
-               pRxTS++;
-       }
-       // Initialize unused Rx Reorder List.
-       INIT_LIST_HEAD(&ieee->RxReorder_Unused_List);
-//#ifdef TO_DO_LIST
-       for(count = 0; count < REORDER_ENTRY_NUM; count++)
-       {
-               list_add_tail( &pRxReorderEntry->List,&ieee->RxReorder_Unused_List);
-               if(count == (REORDER_ENTRY_NUM-1))
-                       break;
-               pRxReorderEntry = &ieee->RxReorderEntry[count+1];
-       }
-//#endif
-
-}
-
-void AdmitTS(struct ieee80211_device *ieee, PTS_COMMON_INFO pTsCommonInfo, u32 InactTime)
-{
-       del_timer_sync(&pTsCommonInfo->SetupTimer);
-       del_timer_sync(&pTsCommonInfo->InactTimer);
-
-       if(InactTime!=0)
-               mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime));
-}
-
-
-PTS_COMMON_INFO SearchAdmitTRStream(struct ieee80211_device *ieee, u8* Addr, u8 TID, TR_SELECT TxRxSelect)
-{
-       //DIRECTION_VALUE       dir;
-       u8      dir;
-       bool                            search_dir[4] = {0, 0, 0, 0};
-       struct list_head*               psearch_list; //FIXME
-       PTS_COMMON_INFO pRet = NULL;
-       if(ieee->iw_mode == IW_MODE_MASTER) //ap mode
-       {
-               if(TxRxSelect == TX_DIR)
-               {
-                       search_dir[DIR_DOWN] = true;
-                       search_dir[DIR_BI_DIR]= true;
-               }
-               else
-               {
-                       search_dir[DIR_UP]      = true;
-                       search_dir[DIR_BI_DIR]= true;
-               }
-       }
-       else if(ieee->iw_mode == IW_MODE_ADHOC)
-       {
-               if(TxRxSelect == TX_DIR)
-                       search_dir[DIR_UP]      = true;
-               else
-                       search_dir[DIR_DOWN] = true;
-       }
-       else
-       {
-               if(TxRxSelect == TX_DIR)
-               {
-                       search_dir[DIR_UP]      = true;
-                       search_dir[DIR_BI_DIR]= true;
-                       search_dir[DIR_DIRECT]= true;
-               }
-               else
-               {
-                       search_dir[DIR_DOWN] = true;
-                       search_dir[DIR_BI_DIR]= true;
-                       search_dir[DIR_DIRECT]= true;
-               }
-       }
-
-       if(TxRxSelect == TX_DIR)
-               psearch_list = &ieee->Tx_TS_Admit_List;
-       else
-               psearch_list = &ieee->Rx_TS_Admit_List;
-
-       //for(dir = DIR_UP; dir <= DIR_BI_DIR; dir++)
-       for(dir = 0; dir <= DIR_BI_DIR; dir++)
-       {
-               if(search_dir[dir] ==false )
-                       continue;
-               list_for_each_entry(pRet, psearch_list, List){
-       //              IEEE80211_DEBUG(IEEE80211_DL_TS, "ADD:%pM, TID:%d, dir:%d\n", pRet->Addr, pRet->TSpec.f.TSInfo.field.ucTSID, pRet->TSpec.f.TSInfo.field.ucDirection);
-                       if (memcmp(pRet->Addr, Addr, 6) == 0)
-                               if (pRet->TSpec.f.TSInfo.field.ucTSID == TID)
-                                       if(pRet->TSpec.f.TSInfo.field.ucDirection == dir)
-                                       {
-                                               break;
-                                       }
-
-               }
-               if(&pRet->List  != psearch_list)
-                       break;
-       }
-
-       if(&pRet->List  != psearch_list){
-               return pRet ;
-       }
-       else
-               return NULL;
-}
-
-void MakeTSEntry(
-               PTS_COMMON_INFO pTsCommonInfo,
-               u8*             Addr,
-               PTSPEC_BODY     pTSPEC,
-               PQOS_TCLAS      pTCLAS,
-               u8              TCLAS_Num,
-               u8              TCLAS_Proc
-       )
-{
-       u8      count;
-
-       if(pTsCommonInfo == NULL)
-               return;
-
-       memcpy(pTsCommonInfo->Addr, Addr, 6);
-
-       if(pTSPEC != NULL)
-               memcpy((u8*)(&(pTsCommonInfo->TSpec)), (u8*)pTSPEC, sizeof(TSPEC_BODY));
-
-       for(count = 0; count < TCLAS_Num; count++)
-               memcpy((u8*)(&(pTsCommonInfo->TClass[count])), (u8*)pTCLAS, sizeof(QOS_TCLAS));
-
-       pTsCommonInfo->TClasProc = TCLAS_Proc;
-       pTsCommonInfo->TClasNum = TCLAS_Num;
-}
-
-
-bool GetTs(
-       struct ieee80211_device*        ieee,
-       PTS_COMMON_INFO                 *ppTS,
-       u8*                             Addr,
-       u8                              TID,
-       TR_SELECT                       TxRxSelect,  //Rx:1, Tx:0
-       bool                            bAddNewTs
-       )
-{
-       u8      UP = 0;
-       //
-       // We do not build any TS for Broadcast or Multicast stream.
-       // So reject these kinds of search here.
-       //
-       if(is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr))
-       {
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "get TS for Broadcast or Multicast\n");
-               return false;
-       }
-
-       if (ieee->current_network.qos_data.supported == 0)
-               UP = 0;
-       else
-       {
-               // In WMM case: we use 4 TID only
-               if (!IsACValid(TID))
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_ERR, " in %s(), TID(%d) is not valid\n", __FUNCTION__, TID);
-                       return false;
-               }
-
-               switch(TID)
-               {
-               case 0:
-               case 3:
-                       UP = 0;
-                       break;
-
-               case 1:
-               case 2:
-                       UP = 2;
-                       break;
-
-               case 4:
-               case 5:
-                       UP = 5;
-                       break;
-
-               case 6:
-               case 7:
-                       UP = 7;
-                       break;
-               }
-       }
-
-       *ppTS = SearchAdmitTRStream(
-                       ieee,
-                       Addr,
-                       UP,
-                       TxRxSelect);
-       if(*ppTS != NULL)
-       {
-               return true;
-       }
-       else
-       {
-               if(bAddNewTs == false)
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_TS, "add new TS failed(tid:%d)\n", UP);
-                       return false;
-               }
-               else
-               {
-                       //
-                       // Create a new Traffic stream for current Tx/Rx
-                       // This is for EDCA and WMM to add a new TS.
-                       // For HCCA or WMMSA, TS cannot be addmit without negotiation.
-                       //
-                       TSPEC_BODY      TSpec;
-                       PQOS_TSINFO             pTSInfo = &TSpec.f.TSInfo;
-                       struct list_head*       pUnusedList =
-                                                               (TxRxSelect == TX_DIR)?
-                                                               (&ieee->Tx_TS_Unused_List):
-                                                               (&ieee->Rx_TS_Unused_List);
-
-                       struct list_head*       pAddmitList =
-                                                               (TxRxSelect == TX_DIR)?
-                                                               (&ieee->Tx_TS_Admit_List):
-                                                               (&ieee->Rx_TS_Admit_List);
-
-                       DIRECTION_VALUE         Dir =           (ieee->iw_mode == IW_MODE_MASTER)?
-                                                               ((TxRxSelect==TX_DIR)?DIR_DOWN:DIR_UP):
-                                                               ((TxRxSelect==TX_DIR)?DIR_UP:DIR_DOWN);
-                       IEEE80211_DEBUG(IEEE80211_DL_TS, "to add Ts\n");
-                       if(!list_empty(pUnusedList))
-                       {
-                               (*ppTS) = list_entry(pUnusedList->next, TS_COMMON_INFO, List);
-                               list_del_init(&(*ppTS)->List);
-                               if(TxRxSelect==TX_DIR)
-                               {
-                                       PTX_TS_RECORD tmp = container_of(*ppTS, TX_TS_RECORD, TsCommonInfo);
-                                       ResetTxTsEntry(tmp);
-                               }
-                               else{
-                                       PRX_TS_RECORD tmp = container_of(*ppTS, RX_TS_RECORD, TsCommonInfo);
-                                       ResetRxTsEntry(tmp);
-                               }
-
-                               IEEE80211_DEBUG(IEEE80211_DL_TS, "to init current TS, UP:%d, Dir:%d, addr:%pM\n", UP, Dir, Addr);
-                               // Prepare TS Info releated field
-                               pTSInfo->field.ucTrafficType = 0;                       // Traffic type: WMM is reserved in this field
-                               pTSInfo->field.ucTSID = UP;                     // TSID
-                               pTSInfo->field.ucDirection = Dir;                       // Direction: if there is DirectLink, this need additional consideration.
-                               pTSInfo->field.ucAccessPolicy = 1;              // Access policy
-                               pTSInfo->field.ucAggregation = 0;               // Aggregation
-                               pTSInfo->field.ucPSB = 0;                               // Aggregation
-                               pTSInfo->field.ucUP = UP;                               // User priority
-                               pTSInfo->field.ucTSInfoAckPolicy = 0;           // Ack policy
-                               pTSInfo->field.ucSchedule = 0;                  // Schedule
-
-                               MakeTSEntry(*ppTS, Addr, &TSpec, NULL, 0, 0);
-                               AdmitTS(ieee, *ppTS, 0);
-                               list_add_tail(&((*ppTS)->List), pAddmitList);
-                               // if there is DirectLink, we need to do additional operation here!!
-
-                               return true;
-                       }
-                       else
-                       {
-                               IEEE80211_DEBUG(IEEE80211_DL_ERR, "in function %s() There is not enough TS record to be used!!", __FUNCTION__);
-                               return false;
-                       }
-               }
-       }
-}
-
-void RemoveTsEntry(
-       struct ieee80211_device*        ieee,
-       PTS_COMMON_INFO                 pTs,
-       TR_SELECT                       TxRxSelect
-       )
-{
-       //u32 flags = 0;
-       unsigned long flags = 0;
-       del_timer_sync(&pTs->SetupTimer);
-       del_timer_sync(&pTs->InactTimer);
-       TsInitDelBA(ieee, pTs, TxRxSelect);
-
-       if(TxRxSelect == RX_DIR)
-       {
-//#ifdef TO_DO_LIST
-               PRX_REORDER_ENTRY       pRxReorderEntry;
-               PRX_TS_RECORD           pRxTS = (PRX_TS_RECORD)pTs;
-               if(timer_pending(&pRxTS->RxPktPendingTimer))
-                       del_timer_sync(&pRxTS->RxPktPendingTimer);
-
-                while(!list_empty(&pRxTS->RxPendingPktList))
-                {
-                //      PlatformAcquireSpinLock(Adapter, RT_RX_SPINLOCK);
-                        spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
-                        //pRxReorderEntry = list_entry(&pRxTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
-                       pRxReorderEntry = (PRX_REORDER_ENTRY)list_entry(pRxTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
-                        list_del_init(&pRxReorderEntry->List);
-                        {
-                                int i = 0;
-                                struct ieee80211_rxb * prxb = pRxReorderEntry->prxb;
-                               if (unlikely(!prxb))
-                               {
-                                       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
-                                       return;
-                               }
-                                for(i =0; i < prxb->nr_subframes; i++) {
-                                        dev_kfree_skb(prxb->subframes[i]);
-                                }
-                                kfree(prxb);
-                                prxb = NULL;
-                        }
-                        list_add_tail(&pRxReorderEntry->List,&ieee->RxReorder_Unused_List);
-                        //PlatformReleaseSpinLock(Adapter, RT_RX_SPINLOCK);
-                        spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
-                }
-
-//#endif
-       }
-       else
-       {
-               PTX_TS_RECORD pTxTS = (PTX_TS_RECORD)pTs;
-               del_timer_sync(&pTxTS->TsAddBaTimer);
-       }
-}
-
-void RemovePeerTS(struct ieee80211_device* ieee, u8* Addr)
-{
-       PTS_COMMON_INFO pTS, pTmpTS;
-
-       printk("===========>RemovePeerTS,%pM\n", Addr);
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List)
-       {
-               if (memcmp(pTS->Addr, Addr, 6) == 0)
-               {
-                       RemoveTsEntry(ieee, pTS, TX_DIR);
-                       list_del_init(&pTS->List);
-                       list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
-               }
-       }
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List)
-       {
-               if (memcmp(pTS->Addr, Addr, 6) == 0)
-               {
-                       printk("====>remove Tx_TS_admin_list\n");
-                       RemoveTsEntry(ieee, pTS, TX_DIR);
-                       list_del_init(&pTS->List);
-                       list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
-               }
-       }
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List)
-       {
-               if (memcmp(pTS->Addr, Addr, 6) == 0)
-               {
-                       RemoveTsEntry(ieee, pTS, RX_DIR);
-                       list_del_init(&pTS->List);
-                       list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
-               }
-       }
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List)
-       {
-               if (memcmp(pTS->Addr, Addr, 6) == 0)
-               {
-                       RemoveTsEntry(ieee, pTS, RX_DIR);
-                       list_del_init(&pTS->List);
-                       list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
-               }
-       }
-}
-
-void RemoveAllTS(struct ieee80211_device* ieee)
-{
-       PTS_COMMON_INFO pTS, pTmpTS;
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List)
-       {
-               RemoveTsEntry(ieee, pTS, TX_DIR);
-               list_del_init(&pTS->List);
-               list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
-       }
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List)
-       {
-               RemoveTsEntry(ieee, pTS, TX_DIR);
-               list_del_init(&pTS->List);
-               list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
-       }
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List)
-       {
-               RemoveTsEntry(ieee, pTS, RX_DIR);
-               list_del_init(&pTS->List);
-               list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
-       }
-
-       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List)
-       {
-               RemoveTsEntry(ieee, pTS, RX_DIR);
-               list_del_init(&pTS->List);
-               list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
-       }
-}
-
-void TsStartAddBaProcess(struct ieee80211_device* ieee, PTX_TS_RECORD  pTxTS)
-{
-       if(pTxTS->bAddBaReqInProgress == false)
-       {
-               pTxTS->bAddBaReqInProgress = true;
-               if(pTxTS->bAddBaReqDelayed)
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_BA, "TsStartAddBaProcess(): Delayed Start ADDBA after 60 sec!!\n");
-                       mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY));
-               }
-               else
-               {
-                       IEEE80211_DEBUG(IEEE80211_DL_BA,"TsStartAddBaProcess(): Immediately Start ADDBA now!!\n");
-                       mod_timer(&pTxTS->TsAddBaTimer, jiffies+10); //set 10 ticks
-               }
-       }
-       else
-               IEEE80211_DEBUG(IEEE80211_DL_ERR, "%s()==>BA timer is already added\n", __FUNCTION__);
-}
diff --git a/drivers/staging/rtl8192e/ieee80211/rtl_crypto.h b/drivers/staging/rtl8192e/ieee80211/rtl_crypto.h
deleted file mode 100644 (file)
index ccf6ae7..0000000
+++ /dev/null
@@ -1,399 +0,0 @@
-/*
- * Scatterlist Cryptographic API.
- *
- * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
- * Copyright (c) 2002 David S. Miller (davem@redhat.com)
- *
- * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no>
- * and Nettle, by Niels Mé°ˆler.
- *
- * 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.
- *
- */
-#ifndef _LINUX_CRYPTO_H
-#define _LINUX_CRYPTO_H
-
-#include <linux/module.h>
-#include <linux/kernel.h>
-#include <linux/types.h>
-#include <linux/list.h>
-#include <linux/string.h>
-#include <asm/page.h>
-#include <asm/errno.h>
-
-#define crypto_register_alg crypto_register_alg_rsl
-#define crypto_unregister_alg crypto_unregister_alg_rsl
-#define crypto_alloc_tfm crypto_alloc_tfm_rsl
-#define crypto_free_tfm crypto_free_tfm_rsl
-#define crypto_alg_available crypto_alg_available_rsl
-
-/*
- * Algorithm masks and types.
- */
-#define CRYPTO_ALG_TYPE_MASK           0x000000ff
-#define CRYPTO_ALG_TYPE_CIPHER         0x00000001
-#define CRYPTO_ALG_TYPE_DIGEST         0x00000002
-#define CRYPTO_ALG_TYPE_COMPRESS       0x00000004
-
-/*
- * Transform masks and values (for crt_flags).
- */
-#define CRYPTO_TFM_MODE_MASK           0x000000ff
-#define CRYPTO_TFM_REQ_MASK            0x000fff00
-#define CRYPTO_TFM_RES_MASK            0xfff00000
-
-#define CRYPTO_TFM_MODE_ECB            0x00000001
-#define CRYPTO_TFM_MODE_CBC            0x00000002
-#define CRYPTO_TFM_MODE_CFB            0x00000004
-#define CRYPTO_TFM_MODE_CTR            0x00000008
-
-#define CRYPTO_TFM_REQ_WEAK_KEY                0x00000100
-#define CRYPTO_TFM_RES_WEAK_KEY                0x00100000
-#define CRYPTO_TFM_RES_BAD_KEY_LEN     0x00200000
-#define CRYPTO_TFM_RES_BAD_KEY_SCHED   0x00400000
-#define CRYPTO_TFM_RES_BAD_BLOCK_LEN   0x00800000
-#define CRYPTO_TFM_RES_BAD_FLAGS       0x01000000
-
-/*
- * Miscellaneous stuff.
- */
-#define CRYPTO_UNSPEC                  0
-#define CRYPTO_MAX_ALG_NAME            64
-
-struct scatterlist;
-
-/*
- * Algorithms: modular crypto algorithm implementations, managed
- * via crypto_register_alg() and crypto_unregister_alg().
- */
-struct cipher_alg {
-       unsigned int cia_min_keysize;
-       unsigned int cia_max_keysize;
-       int (*cia_setkey)(void *ctx, const u8 *key,
-                         unsigned int keylen, u32 *flags);
-       void (*cia_encrypt)(void *ctx, u8 *dst, const u8 *src);
-       void (*cia_decrypt)(void *ctx, u8 *dst, const u8 *src);
-};
-
-struct digest_alg {
-       unsigned int dia_digestsize;
-       void (*dia_init)(void *ctx);
-       void (*dia_update)(void *ctx, const u8 *data, unsigned int len);
-       void (*dia_final)(void *ctx, u8 *out);
-       int (*dia_setkey)(void *ctx, const u8 *key,
-                         unsigned int keylen, u32 *flags);
-};
-
-struct compress_alg {
-       int (*coa_init)(void *ctx);
-       void (*coa_exit)(void *ctx);
-       int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen,
-                           u8 *dst, unsigned int *dlen);
-       int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen,
-                             u8 *dst, unsigned int *dlen);
-};
-
-#define cra_cipher     cra_u.cipher
-#define cra_digest     cra_u.digest
-#define cra_compress   cra_u.compress
-
-struct crypto_alg {
-       struct list_head cra_list;
-       u32 cra_flags;
-       unsigned int cra_blocksize;
-       unsigned int cra_ctxsize;
-       const char cra_name[CRYPTO_MAX_ALG_NAME];
-
-       union {
-               struct cipher_alg cipher;
-               struct digest_alg digest;
-               struct compress_alg compress;
-       } cra_u;
-
-       struct module *cra_module;
-};
-
-/*
- * Algorithm registration interface.
- */
-int crypto_register_alg(struct crypto_alg *alg);
-int crypto_unregister_alg(struct crypto_alg *alg);
-
-/*
- * Algorithm query interface.
- */
-int crypto_alg_available(const char *name, u32 flags);
-
-/*
- * Transforms: user-instantiated objects which encapsulate algorithms
- * and core processing logic.  Managed via crypto_alloc_tfm() and
- * crypto_free_tfm(), as well as the various helpers below.
- */
-struct crypto_tfm;
-
-struct cipher_tfm {
-       void *cit_iv;
-       unsigned int cit_ivsize;
-       u32 cit_mode;
-       int (*cit_setkey)(struct crypto_tfm *tfm,
-                         const u8 *key, unsigned int keylen);
-       int (*cit_encrypt)(struct crypto_tfm *tfm,
-                          struct scatterlist *dst,
-                          struct scatterlist *src,
-                          unsigned int nbytes);
-       int (*cit_encrypt_iv)(struct crypto_tfm *tfm,
-                             struct scatterlist *dst,
-                             struct scatterlist *src,
-                             unsigned int nbytes, u8 *iv);
-       int (*cit_decrypt)(struct crypto_tfm *tfm,
-                          struct scatterlist *dst,
-                          struct scatterlist *src,
-                          unsigned int nbytes);
-       int (*cit_decrypt_iv)(struct crypto_tfm *tfm,
-                          struct scatterlist *dst,
-                          struct scatterlist *src,
-                          unsigned int nbytes, u8 *iv);
-       void (*cit_xor_block)(u8 *dst, const u8 *src);
-};
-
-struct digest_tfm {
-       void (*dit_init)(struct crypto_tfm *tfm);
-       void (*dit_update)(struct crypto_tfm *tfm,
-                          struct scatterlist *sg, unsigned int nsg);
-       void (*dit_final)(struct crypto_tfm *tfm, u8 *out);
-       void (*dit_digest)(struct crypto_tfm *tfm, struct scatterlist *sg,
-                          unsigned int nsg, u8 *out);
-       int (*dit_setkey)(struct crypto_tfm *tfm,
-                         const u8 *key, unsigned int keylen);
-#ifdef CONFIG_CRYPTO_HMAC
-       void *dit_hmac_block;
-#endif
-};
-
-struct compress_tfm {
-       int (*cot_compress)(struct crypto_tfm *tfm,
-                           const u8 *src, unsigned int slen,
-                           u8 *dst, unsigned int *dlen);
-       int (*cot_decompress)(struct crypto_tfm *tfm,
-                             const u8 *src, unsigned int slen,
-                             u8 *dst, unsigned int *dlen);
-};
-
-#define crt_cipher     crt_u.cipher
-#define crt_digest     crt_u.digest
-#define crt_compress   crt_u.compress
-
-struct crypto_tfm {
-
-       u32 crt_flags;
-
-       union {
-               struct cipher_tfm cipher;
-               struct digest_tfm digest;
-               struct compress_tfm compress;
-       } crt_u;
-
-       struct crypto_alg *__crt_alg;
-};
-
-/*
- * Transform user interface.
- */
-
-/*
- * crypto_alloc_tfm() will first attempt to locate an already loaded algorithm.
- * If that fails and the kernel supports dynamically loadable modules, it
- * will then attempt to load a module of the same name or alias.  A refcount
- * is grabbed on the algorithm which is then associated with the new transform.
- *
- * crypto_free_tfm() frees up the transform and any associated resources,
- * then drops the refcount on the associated algorithm.
- */
-struct crypto_tfm *crypto_alloc_tfm(const char *alg_name, u32 tfm_flags);
-void crypto_free_tfm(struct crypto_tfm *tfm);
-
-/*
- * Transform helpers which query the underlying algorithm.
- */
-static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm)
-{
-       return tfm->__crt_alg->cra_name;
-}
-
-static inline const char *crypto_tfm_alg_modname(struct crypto_tfm *tfm)
-{
-       struct crypto_alg *alg = tfm->__crt_alg;
-
-       if (alg->cra_module)
-               return alg->cra_module->name;
-       else
-               return NULL;
-}
-
-static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm)
-{
-       return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK;
-}
-
-static inline unsigned int crypto_tfm_alg_min_keysize(struct crypto_tfm *tfm)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       return tfm->__crt_alg->cra_cipher.cia_min_keysize;
-}
-
-static inline unsigned int crypto_tfm_alg_max_keysize(struct crypto_tfm *tfm)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       return tfm->__crt_alg->cra_cipher.cia_max_keysize;
-}
-
-static inline unsigned int crypto_tfm_alg_ivsize(struct crypto_tfm *tfm)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       return tfm->crt_cipher.cit_ivsize;
-}
-
-static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm)
-{
-       return tfm->__crt_alg->cra_blocksize;
-}
-
-static inline unsigned int crypto_tfm_alg_digestsize(struct crypto_tfm *tfm)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-       return tfm->__crt_alg->cra_digest.dia_digestsize;
-}
-
-/*
- * API wrappers.
- */
-static inline void crypto_digest_init(struct crypto_tfm *tfm)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-       tfm->crt_digest.dit_init(tfm);
-}
-
-static inline void crypto_digest_update(struct crypto_tfm *tfm,
-                                        struct scatterlist *sg,
-                                        unsigned int nsg)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-       tfm->crt_digest.dit_update(tfm, sg, nsg);
-}
-
-static inline void crypto_digest_final(struct crypto_tfm *tfm, u8 *out)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-       tfm->crt_digest.dit_final(tfm, out);
-}
-
-static inline void crypto_digest_digest(struct crypto_tfm *tfm,
-                                        struct scatterlist *sg,
-                                        unsigned int nsg, u8 *out)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-       tfm->crt_digest.dit_digest(tfm, sg, nsg, out);
-}
-
-static inline int crypto_digest_setkey(struct crypto_tfm *tfm,
-                                       const u8 *key, unsigned int keylen)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
-       if (tfm->crt_digest.dit_setkey == NULL)
-               return -ENOSYS;
-       return tfm->crt_digest.dit_setkey(tfm, key, keylen);
-}
-
-static inline int crypto_cipher_setkey(struct crypto_tfm *tfm,
-                                       const u8 *key, unsigned int keylen)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       return tfm->crt_cipher.cit_setkey(tfm, key, keylen);
-}
-
-static inline int crypto_cipher_encrypt(struct crypto_tfm *tfm,
-                                        struct scatterlist *dst,
-                                        struct scatterlist *src,
-                                        unsigned int nbytes)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       return tfm->crt_cipher.cit_encrypt(tfm, dst, src, nbytes);
-}
-
-static inline int crypto_cipher_encrypt_iv(struct crypto_tfm *tfm,
-                                           struct scatterlist *dst,
-                                           struct scatterlist *src,
-                                           unsigned int nbytes, u8 *iv)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
-       return tfm->crt_cipher.cit_encrypt_iv(tfm, dst, src, nbytes, iv);
-}
-
-static inline int crypto_cipher_decrypt(struct crypto_tfm *tfm,
-                                        struct scatterlist *dst,
-                                        struct scatterlist *src,
-                                        unsigned int nbytes)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       return tfm->crt_cipher.cit_decrypt(tfm, dst, src, nbytes);
-}
-
-static inline int crypto_cipher_decrypt_iv(struct crypto_tfm *tfm,
-                                           struct scatterlist *dst,
-                                           struct scatterlist *src,
-                                           unsigned int nbytes, u8 *iv)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
-       return tfm->crt_cipher.cit_decrypt_iv(tfm, dst, src, nbytes, iv);
-}
-
-static inline void crypto_cipher_set_iv(struct crypto_tfm *tfm,
-                                        const u8 *src, unsigned int len)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       memcpy(tfm->crt_cipher.cit_iv, src, len);
-}
-
-static inline void crypto_cipher_get_iv(struct crypto_tfm *tfm,
-                                        u8 *dst, unsigned int len)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
-       memcpy(dst, tfm->crt_cipher.cit_iv, len);
-}
-
-static inline int crypto_comp_compress(struct crypto_tfm *tfm,
-                                       const u8 *src, unsigned int slen,
-                                       u8 *dst, unsigned int *dlen)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
-       return tfm->crt_compress.cot_compress(tfm, src, slen, dst, dlen);
-}
-
-static inline int crypto_comp_decompress(struct crypto_tfm *tfm,
-                                         const u8 *src, unsigned int slen,
-                                         u8 *dst, unsigned int *dlen)
-{
-       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
-       return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen);
-}
-
-/*
- * HMAC support.
- */
-#ifdef CONFIG_CRYPTO_HMAC
-void crypto_hmac_init(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen);
-void crypto_hmac_update(struct crypto_tfm *tfm,
-                        struct scatterlist *sg, unsigned int nsg);
-void crypto_hmac_final(struct crypto_tfm *tfm, u8 *key,
-                       unsigned int *keylen, u8 *out);
-void crypto_hmac(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen,
-                 struct scatterlist *sg, unsigned int nsg, u8 *out);
-#endif /* CONFIG_CRYPTO_HMAC */
-
-#endif /* _LINUX_CRYPTO_H */
-
diff --git a/drivers/staging/rtl8192e/internal.h b/drivers/staging/rtl8192e/internal.h
new file mode 100644 (file)
index 0000000..1c39c00
--- /dev/null
@@ -0,0 +1,129 @@
+/*
+ * Cryptographic API.
+ *
+ * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
+ *
+ * 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.
+ *
+ */
+#ifndef _CRYPTO_INTERNAL_H
+#define _CRYPTO_INTERNAL_H
+
+
+#include <linux/version.h>
+#include "rtl_crypto.h"
+#include <linux/mm.h>
+#include <linux/highmem.h>
+#include <linux/init.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,12))
+#include <asm/hardirq.h>
+#else
+#include <linux/hardirq.h>
+#include <linux/sched.h>
+#endif
+#include <asm/kmap_types.h>
+
+#ifdef BUILT_IN_CRYPTO
+#ifdef CONFIG_CRYPTO_HMAC
+#undef CONFIG_CRYPTO_HMAC
+#endif
+
+#ifdef CONFIG_KMOD
+#undef CONFIG_KMOD
+#endif
+#endif /* BUILT_IN_CRYPTO */
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,20))
+#define list_for_each_entry(pos, head, member)                         \
+       for (pos = list_entry((head)->next, typeof(*pos), member),      \
+                    prefetch(pos->member.next);                        \
+            &pos->member != (head);                                    \
+            pos = list_entry(pos->member.next, typeof(*pos), member),  \
+                    prefetch(pos->member.next))
+
+static inline void cond_resched(void)
+{
+       if (need_resched()) {
+               set_current_state(TASK_RUNNING);
+               schedule();
+       }
+}
+#endif
+
+extern enum km_type crypto_km_types[];
+
+static inline enum km_type crypto_kmap_type(int out)
+{
+       return crypto_km_types[(in_softirq() ? 2 : 0) + out];
+}
+
+static inline void *crypto_kmap(struct page *page, int out)
+{
+       return kmap_atomic(page, crypto_kmap_type(out));
+}
+
+static inline void crypto_kunmap(void *vaddr, int out)
+{
+       kunmap_atomic(vaddr, crypto_kmap_type(out));
+}
+
+static inline void crypto_yield(struct crypto_tfm *tfm)
+{
+       if (!in_softirq())
+               cond_resched();
+}
+
+static inline void *crypto_tfm_ctx(struct crypto_tfm *tfm)
+{
+       return (void *)&tfm[1];
+}
+
+struct crypto_alg *crypto_alg_lookup(const char *name);
+
+#ifdef CONFIG_KMOD
+void crypto_alg_autoload(const char *name);
+struct crypto_alg *crypto_alg_mod_lookup(const char *name);
+#else
+static inline struct crypto_alg *crypto_alg_mod_lookup(const char *name)
+{
+       return crypto_alg_lookup(name);
+}
+#endif
+
+#ifdef CONFIG_CRYPTO_HMAC
+int crypto_alloc_hmac_block(struct crypto_tfm *tfm);
+void crypto_free_hmac_block(struct crypto_tfm *tfm);
+#else
+static inline int crypto_alloc_hmac_block(struct crypto_tfm *tfm)
+{
+       return 0;
+}
+
+static inline void crypto_free_hmac_block(struct crypto_tfm *tfm)
+{ }
+#endif
+
+#ifdef CONFIG_PROC_FS
+void __init crypto_init_proc(void);
+#else
+static inline void crypto_init_proc(void)
+{ }
+#endif
+
+int crypto_init_digest_flags(struct crypto_tfm *tfm, u32 flags);
+int crypto_init_cipher_flags(struct crypto_tfm *tfm, u32 flags);
+int crypto_init_compress_flags(struct crypto_tfm *tfm, u32 flags);
+
+int crypto_init_digest_ops(struct crypto_tfm *tfm);
+int crypto_init_cipher_ops(struct crypto_tfm *tfm);
+int crypto_init_compress_ops(struct crypto_tfm *tfm);
+
+void crypto_exit_digest_ops(struct crypto_tfm *tfm);
+void crypto_exit_cipher_ops(struct crypto_tfm *tfm);
+void crypto_exit_compress_ops(struct crypto_tfm *tfm);
+
+#endif /* _CRYPTO_INTERNAL_H */
diff --git a/drivers/staging/rtl8192e/kmap_types.h b/drivers/staging/rtl8192e/kmap_types.h
new file mode 100644 (file)
index 0000000..de67bb0
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef __KMAP_TYPES_H
+
+#define __KMAP_TYPES_H
+
+
+enum km_type {
+       KM_BOUNCE_READ,
+       KM_SKB_SUNRPC_DATA,
+       KM_SKB_DATA_SOFTIRQ,
+       KM_USER0,
+       KM_USER1,
+       KM_BH_IRQ,
+       KM_SOFTIRQ0,
+       KM_SOFTIRQ1,
+       KM_TYPE_NR
+};
+
+#define _ASM_KMAP_TYPES_H
+
+#endif
diff --git a/drivers/staging/rtl8192e/license b/drivers/staging/rtl8192e/license
new file mode 100644 (file)
index 0000000..4bea9fa
--- /dev/null
@@ -0,0 +1,339 @@
+
+"This software program is licensed subject to the GNU General Public License
+(GPL). Version 2, June 1991, available at
+<http:
+
+GNU General Public License
+
+Version 2, June 1991
+
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place - Suite 330, Boston, MA  02111-1307, USA
+
+Everyone is permitted to copy and distribute verbatim copies of this license
+document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to
+share and change it. By contrast, the GNU General Public License is intended
+to guarantee your freedom to share and change free software--to make sure
+the software is free for all its users. This General Public License applies
+to most of the Free Software Foundation's software and to any other program
+whose authors commit to using it. (Some other Free Software Foundation
+software is covered by the GNU Library General Public License instead.) You
+can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our
+General Public Licenses are designed to make sure that you have the freedom
+to distribute copies of free software (and charge for this service if you
+wish), that you receive source code or can get it if you want it, that you
+can change the software or use pieces of it in new free programs; and that
+you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to
+deny you these rights or to ask you to surrender the rights. These
+restrictions translate to certain responsibilities for you if you distribute
+copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or
+for a fee, you must give the recipients all the rights that you have. You
+must make sure that they, too, receive or can get the source code. And you
+must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2)
+offer you this license which gives you legal permission to copy, distribute
+and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that
+everyone understands that there is no warranty for this free software. If
+the software is modified by someone else and passed on, we want its
+recipients to know that what they have is not the original, so that any
+problems introduced by others will not reflect on the original authors'
+reputations.
+
+Finally, any free program is threatened constantly by software patents. We
+wish to avoid the danger that redistributors of a free program will
+individually obtain patent licenses, in effect making the program
+proprietary. To prevent this, we have made it clear that any patent must be
+licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification
+follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice
+   placed by the copyright holder saying it may be distributed under the
+   terms of this General Public License. The "Program", below, refers to any
+   such program or work, and a "work based on the Program" means either the
+   Program or any derivative work under copyright law: that is to say, a
+   work containing the Program or a portion of it, either verbatim or with
+   modifications and/or translated into another language. (Hereinafter,
+   translation is included without limitation in the term "modification".)
+   Each licensee is addressed as "you".
+
+   Activities other than copying, distribution and modification are not
+   covered by this License; they are outside its scope. The act of running
+   the Program is not restricted, and the output from the Program is covered
+   only if its contents constitute a work based on the Program (independent
+   of having been made by running the Program). Whether that is true depends
+   on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code
+   as you receive it, in any medium, provided that you conspicuously and
+   appropriately publish on each copy an appropriate copyright notice and
+   disclaimer of warranty; keep intact all the notices that refer to this
+   License and to the absence of any warranty; and give any other recipients
+   of the Program a copy of this License along with the Program.
+
+   You may charge a fee for the physical act of transferring a copy, and you
+   may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it,
+   thus forming a work based on the Program, and copy and distribute such
+   modifications or work under the terms of Section 1 above, provided that
+   you also meet all of these conditions:
+
+   * a) You must cause the modified files to carry prominent notices stating
+        that you changed the files and the date of any change.
+
+   * b) You must cause any work that you distribute or publish, that in
+        whole or in part contains or is derived from the Program or any part
+        thereof, to be licensed as a whole at no charge to all third parties
+        under the terms of this License.
+
+   * c) If the modified program normally reads commands interactively when
+        run, you must cause it, when started running for such interactive
+        use in the most ordinary way, to print or display an announcement
+        including an appropriate copyright notice and a notice that there is
+        no warranty (or else, saying that you provide a warranty) and that
+        users may redistribute the program under these conditions, and
+        telling the user how to view a copy of this License. (Exception: if
+        the Program itself is interactive but does not normally print such
+        an announcement, your work based on the Program is not required to
+        print an announcement.)
+
+   These requirements apply to the modified work as a whole. If identifiable
+   sections of that work are not derived from the Program, and can be
+   reasonably considered independent and separate works in themselves, then
+   this License, and its terms, do not apply to those sections when you
+   distribute them as separate works. But when you distribute the same
+   sections as part of a whole which is a work based on the Program, the
+   distribution of the whole must be on the terms of this License, whose
+   permissions for other licensees extend to the entire whole, and thus to
+   each and every part regardless of who wrote it.
+
+   Thus, it is not the intent of this section to claim rights or contest
+   your rights to work written entirely by you; rather, the intent is to
+   exercise the right to control the distribution of derivative or
+   collective works based on the Program.
+
+   In addition, mere aggregation of another work not based on the Program
+   with the Program (or with a work based on the Program) on a volume of a
+   storage or distribution medium does not bring the other work under the
+   scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under
+   Section 2) in object code or executable form under the terms of Sections
+   1 and 2 above provided that you also do one of the following:
+
+   * a) Accompany it with the complete corresponding machine-readable source
+        code, which must be distributed under the terms of Sections 1 and 2
+        above on a medium customarily used for software interchange; or,
+
+   * b) Accompany it with a written offer, valid for at least three years,
+        to give any third party, for a charge no more than your cost of
+        physically performing source distribution, a complete machine-
+        readable copy of the corresponding source code, to be distributed
+        under the terms of Sections 1 and 2 above on a medium customarily
+        used for software interchange; or,
+
+   * c) Accompany it with the information you received as to the offer to
+        distribute corresponding source code. (This alternative is allowed
+        only for noncommercial distribution and only if you received the
+        program in object code or executable form with such an offer, in
+        accord with Subsection b above.)
+
+   The source code for a work means the preferred form of the work for
+   making modifications to it. For an executable work, complete source code
+   means all the source code for all modules it contains, plus any
+   associated interface definition files, plus the scripts used to control
+   compilation and installation of the executable. However, as a special
+   exception, the source code distributed need not include anything that is
+   normally distributed (in either source or binary form) with the major
+   components (compiler, kernel, and so on) of the operating system on which
+   the executable runs, unless that component itself accompanies the
+   executable.
+
+   If distribution of executable or object code is made by offering access
+   to copy from a designated place, then offering equivalent access to copy
+   the source code from the same place counts as distribution of the source
+   code, even though third parties are not compelled to copy the source
+   along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as
+   expressly provided under this License. Any attempt otherwise to copy,
+   modify, sublicense or distribute the Program is void, and will
+   automatically terminate your rights under this License. However, parties
+   who have received copies, or rights, from you under this License will not
+   have their licenses terminated so long as such parties remain in full
+   compliance.
+
+5. You are not required to accept this License, since you have not signed
+   it. However, nothing else grants you permission to modify or distribute
+   the Program or its derivative works. These actions are prohibited by law
+   if you do not accept this License. Therefore, by modifying or
+   distributing the Program (or any work based on the Program), you
+   indicate your acceptance of this License to do so, and all its terms and
+   conditions for copying, distributing or modifying the Program or works
+   based on it.
+
+6. Each time you redistribute the Program (or any work based on the
+   Program), the recipient automatically receives a license from the
+   original licensor to copy, distribute or modify the Program subject to
+   these terms and conditions. You may not impose any further restrictions
+   on the recipients' exercise of the rights granted herein. You are not
+   responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent
+   infringement or for any other reason (not limited to patent issues),
+   conditions are imposed on you (whether by court order, agreement or
+   otherwise) that contradict the conditions of this License, they do not
+   excuse you from the conditions of this License. If you cannot distribute
+   so as to satisfy simultaneously your obligations under this License and
+   any other pertinent obligations, then as a consequence you may not
+   distribute the Program at all. For example, if a patent license would
+   not permit royalty-free redistribution of the Program by all those who
+   receive copies directly or indirectly through you, then the only way you
+   could satisfy both it and this License would be to refrain entirely from
+   distribution of the Program.
+
+   If any portion of this section is held invalid or unenforceable under any
+   particular circumstance, the balance of the section is intended to apply
+   and the section as a whole is intended to apply in other circumstances.
+
+   It is not the purpose of this section to induce you to infringe any
+   patents or other property right claims or to contest validity of any
+   such claims; this section has the sole purpose of protecting the
+   integrity of the free software distribution system, which is implemented
+   by public license practices. Many people have made generous contributions
+   to the wide range of software distributed through that system in
+   reliance on consistent application of that system; it is up to the
+   author/donor to decide if he or she is willing to distribute software
+   through any other system and a licensee cannot impose that choice.
+
+   This section is intended to make thoroughly clear what is believed to be
+   a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain
+   countries either by patents or by copyrighted interfaces, the original
+   copyright holder who places the Program under this License may add an
+   explicit geographical distribution limitation excluding those countries,
+   so that distribution is permitted only in or among countries not thus
+   excluded. In such case, this License incorporates the limitation as if
+   written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of
+   the General Public License from time to time. Such new versions will be
+   similar in spirit to the present version, but may differ in detail to
+   address new problems or concerns.
+
+   Each version is given a distinguishing version number. If the Program
+   specifies a version number of this License which applies to it and "any
+   later version", you have the option of following the terms and
+   conditions either of that version or of any later version published by
+   the Free Software Foundation. If the Program does not specify a version
+   number of this License, you may choose any version ever published by the
+   Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs
+    whose distribution conditions are different, write to the author to ask
+    for permission. For software which is copyrighted by the Free Software
+    Foundation, write to the Free Software Foundation; we sometimes make
+    exceptions for this. Our decision will be guided by the two goals of
+    preserving the free status of all derivatives of our free software and
+    of promoting the sharing and reuse of software generally.
+
+   NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+    FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+    OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+    PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
+    EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
+    ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
+    YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
+    NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+    WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+    REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
+    DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
+    DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
+    (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
+    INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
+    THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
+    OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it free
+software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to
+attach them to the start of each source file to most effectively convey the
+exclusion of warranty; and each file should have at least the "copyright"
+line and a pointer to where the full notice is found.
+
+one line to give the program's name and an idea of what it does.
+Copyright (C) yyyy  name of author
+
+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.
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when
+it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes
+with ABSOLUTELY NO WARRANTY; for details type 'show w'.  This is free
+software, and you are welcome to redistribute it under certain conditions;
+type 'show c' for details.
+
+The hypothetical commands 'show w' and 'show c' should show the appropriate
+parts of the General Public License. Of course, the commands you use may be
+called something other than 'show w' and 'show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+'Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General Public
+License instead of this License.
diff --git a/drivers/staging/rtl8192e/r8190P_def.h b/drivers/staging/rtl8192e/r8190P_def.h
new file mode 100644 (file)
index 0000000..52c00a1
--- /dev/null
@@ -0,0 +1,415 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+
+#ifndef R8190P_DEF_H
+#define R8190P_DEF_H
+
+#include <linux/types.h>
+
+#define                MAX_SILENT_RESET_RX_SLOT_NUM    10
+
+#define RX_MPDU_QUEUE                          0
+#define RX_CMD_QUEUE                           1
+
+
+typedef enum _rtl819x_loopback{
+       RTL819X_NO_LOOPBACK = 0,
+       RTL819X_MAC_LOOPBACK = 1,
+       RTL819X_DMA_LOOPBACK = 2,
+       RTL819X_CCK_LOOPBACK = 3,
+}rtl819x_loopback_e;
+
+
+#define RESET_DELAY_8185                       20
+
+#define RT_IBSS_INT_MASKS                      (IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER)
+
+#define DESC90_RATE1M                          0x00
+#define DESC90_RATE2M                          0x01
+#define DESC90_RATE5_5M                                0x02
+#define DESC90_RATE11M                         0x03
+#define DESC90_RATE6M                          0x04
+#define DESC90_RATE9M                          0x05
+#define DESC90_RATE12M                         0x06
+#define DESC90_RATE18M                         0x07
+#define DESC90_RATE24M                         0x08
+#define DESC90_RATE36M                         0x09
+#define DESC90_RATE48M                         0x0a
+#define DESC90_RATE54M                         0x0b
+#define DESC90_RATEMCS0                                0x00
+#define DESC90_RATEMCS1                                0x01
+#define DESC90_RATEMCS2                                0x02
+#define DESC90_RATEMCS3                                0x03
+#define DESC90_RATEMCS4                                0x04
+#define DESC90_RATEMCS5                                0x05
+#define DESC90_RATEMCS6                                0x06
+#define DESC90_RATEMCS7                                0x07
+#define DESC90_RATEMCS8                                0x08
+#define DESC90_RATEMCS9                                0x09
+#define DESC90_RATEMCS10                       0x0a
+#define DESC90_RATEMCS11                       0x0b
+#define DESC90_RATEMCS12                       0x0c
+#define DESC90_RATEMCS13                       0x0d
+#define DESC90_RATEMCS14                       0x0e
+#define DESC90_RATEMCS15                       0x0f
+#define DESC90_RATEMCS32                       0x20
+
+#define SHORT_SLOT_TIME                                9
+#define NON_SHORT_SLOT_TIME            20
+
+
+#define        MAX_LINES_HWCONFIG_TXT                  1000
+#define MAX_BYTES_LINE_HWCONFIG_TXT            128
+
+#define SW_THREE_WIRE                  0
+#define HW_THREE_WIRE                  2
+
+#define BT_DEMO_BOARD                  0
+#define BT_QA_BOARD                            1
+#define BT_FPGA                                        2
+
+#define        Rx_Smooth_Factor                        20
+
+#define QSLT_BK                                        0x1
+#define QSLT_BE                                        0x0
+#define QSLT_VI                                        0x4
+#define QSLT_VO                                        0x6
+#define        QSLT_BEACON                     0x10
+#define        QSLT_HIGH                               0x11
+#define        QSLT_MGNT                               0x12
+#define        QSLT_CMD                                0x13
+
+#define NUM_OF_FIRMWARE_QUEUE                          10
+#define NUM_OF_PAGES_IN_FW                                     0x100
+#define NUM_OF_PAGE_IN_FW_QUEUE_BK             0x007
+#define NUM_OF_PAGE_IN_FW_QUEUE_BE             0x0aa
+#define NUM_OF_PAGE_IN_FW_QUEUE_VI             0x024
+#define NUM_OF_PAGE_IN_FW_QUEUE_VO             0x007
+#define NUM_OF_PAGE_IN_FW_QUEUE_HCCA           0
+#define NUM_OF_PAGE_IN_FW_QUEUE_CMD            0x2
+#define NUM_OF_PAGE_IN_FW_QUEUE_MGNT           0x10
+#define NUM_OF_PAGE_IN_FW_QUEUE_HIGH           0
+#define NUM_OF_PAGE_IN_FW_QUEUE_BCN            0x4
+#define NUM_OF_PAGE_IN_FW_QUEUE_PUB            0xd
+
+#define NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM 0x026
+#define NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM 0x048
+#define NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM 0x048
+#define NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM 0x026
+#define NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM        0x00
+
+#define APPLIED_RESERVED_QUEUE_IN_FW           0x80000000
+#define RSVD_FW_QUEUE_PAGE_BK_SHIFT            0x00
+#define RSVD_FW_QUEUE_PAGE_BE_SHIFT            0x08
+#define RSVD_FW_QUEUE_PAGE_VI_SHIFT            0x10
+#define RSVD_FW_QUEUE_PAGE_VO_SHIFT            0x18
+#define RSVD_FW_QUEUE_PAGE_MGNT_SHIFT  0x10
+#define RSVD_FW_QUEUE_PAGE_BCN_SHIFT           0x00
+#define RSVD_FW_QUEUE_PAGE_PUB_SHIFT           0x08
+
+#define HAL_PRIME_CHNL_OFFSET_DONT_CARE        0
+#define HAL_PRIME_CHNL_OFFSET_LOWER            1
+#define HAL_PRIME_CHNL_OFFSET_UPPER            2
+
+
+typedef enum _VERSION_8190{
+       VERSION_8190_BD=0x3,
+       VERSION_8190_BE
+}VERSION_8190,*PVERSION_8190;
+
+#define IC_VersionCut_C        0x2
+#define IC_VersionCut_D        0x3
+#define IC_VersionCut_E        0x4
+
+typedef enum tag_Rf_OpType
+{
+    RF_OP_By_SW_3wire = 0,
+    RF_OP_By_FW,
+    RF_OP_MAX
+}RF_OpType_E;
+
+
+typedef        enum _POWER_SAVE_MODE
+{
+       POWER_SAVE_MODE_ACTIVE,
+       POWER_SAVE_MODE_SAVE,
+}POWER_SAVE_MODE;
+
+typedef        enum _INTERFACE_SELECT_8190PCI{
+       INTF_SEL1_MINICARD              = 0,
+       INTF_SEL0_PCIE                  = 1,
+       INTF_SEL2_RSV                   = 2,
+       INTF_SEL3_RSV                   = 3,
+} INTERFACE_SELECT_8190PCI, *PINTERFACE_SELECT_8190PCI;
+
+typedef struct _BB_REGISTER_DEFINITION{
+       u32 rfintfs;
+       u32 rfintfi;
+       u32 rfintfo;
+       u32 rfintfe;
+       u32 rf3wireOffset;
+       u32 rfLSSI_Select;
+       u32 rfTxGainStage;
+       u32 rfHSSIPara1;
+       u32 rfHSSIPara2;
+       u32 rfSwitchControl;
+       u32 rfAGCControl1;
+       u32 rfAGCControl2;
+       u32 rfRxIQImbalance;
+       u32 rfRxAFE;
+       u32 rfTxIQImbalance;
+       u32 rfTxAFE;
+       u32 rfLSSIReadBack;
+       u32 rfLSSIReadBackPi;
+}BB_REGISTER_DEFINITION_T, *PBB_REGISTER_DEFINITION_T;
+
+typedef struct _TX_FWINFO_STRUCUTRE{
+       u8                      TxRate:7;
+       u8                      CtsEnable:1;
+       u8                      RtsRate:7;
+       u8                      RtsEnable:1;
+       u8                      TxHT:1;
+       u8                      Short:1;
+       u8                      TxBandwidth:1;
+       u8                      TxSubCarrier:2;
+       u8                      STBC:2;
+       u8                      AllowAggregation:1;
+       u8                      RtsHT:1;
+       u8                      RtsShort:1;
+       u8                      RtsBandwidth:1;
+       u8                      RtsSubcarrier:2;
+       u8                      RtsSTBC:2;
+       u8                      EnableCPUDur:1;
+
+       u32                     RxMF:2;
+       u32                     RxAMD:3;
+       u32                     Reserved1:3;
+       u32                     TxAGCOffset:4;
+       u32                     TxAGCSign:1;
+       u32                     Tx_INFO_RSVD:6;
+       u32                     PacketID:13;
+}TX_FWINFO_T;
+
+typedef struct _TX_FWINFO_8190PCI{
+       u8                      TxRate:7;
+       u8                      CtsEnable:1;
+       u8                      RtsRate:7;
+       u8                      RtsEnable:1;
+       u8                      TxHT:1;
+       u8                      Short:1;
+       u8                      TxBandwidth:1;
+       u8                      TxSubCarrier:2;
+       u8                      STBC:2;
+       u8                      AllowAggregation:1;
+       u8                      RtsHT:1;
+       u8                      RtsShort:1;
+       u8                      RtsBandwidth:1;
+       u8                      RtsSubcarrier:2;
+       u8                      RtsSTBC:2;
+       u8                      EnableCPUDur:1;
+
+       u32                     RxMF:2;
+       u32                     RxAMD:3;
+       u32                     TxPerPktInfoFeedback:1;
+       u32                     Reserved1:2;
+       u32                     TxAGCOffset:4;
+       u32                     TxAGCSign:1;
+       u32                     RAW_TXD:1;
+       u32                     Retry_Limit:4;
+       u32                     Reserved2:1;
+       u32                     PacketID:13;
+
+
+}TX_FWINFO_8190PCI, *PTX_FWINFO_8190PCI;
+
+
+#define TX_DESC_SIZE                   32
+
+#define TX_DESC_CMD_SIZE       32
+
+
+#define TX_STATUS_DESC_SIZE    32
+
+#define TX_FWINFO_SIZE 8
+
+
+#define RX_DESC_SIZE   16
+
+#define RX_STATUS_DESC_SIZE    16
+
+#define RX_DRIVER_INFO_SIZE    8
+
+typedef struct _LOG_INTERRUPT_8190
+{
+       u32     nIMR_COMDOK;
+       u32     nIMR_MGNTDOK;
+       u32     nIMR_HIGH;
+       u32     nIMR_VODOK;
+       u32     nIMR_VIDOK;
+       u32     nIMR_BEDOK;
+       u32     nIMR_BKDOK;
+       u32     nIMR_ROK;
+       u32     nIMR_RCOK;
+       u32     nIMR_TBDOK;
+       u32     nIMR_BDOK;
+       u32     nIMR_RXFOVW;
+} LOG_INTERRUPT_8190_T, *PLOG_INTERRUPT_8190_T;
+
+typedef struct _phy_ofdm_rx_status_rxsc_sgien_exintfflag{
+       u8                      reserved:4;
+       u8                      rxsc:2;
+       u8                      sgi_en:1;
+       u8                      ex_intf_flag:1;
+}phy_ofdm_rx_status_rxsc_sgien_exintfflag;
+
+typedef struct _phy_ofdm_rx_status_report_819xpci
+{
+       u8      trsw_gain_X[4];
+       u8      pwdb_all;
+       u8      cfosho_X[4];
+       u8      cfotail_X[4];
+       u8      rxevm_X[2];
+       u8      rxsnr_X[4];
+       u8      pdsnr_X[2];
+       u8      csi_current_X[2];
+       u8      csi_target_X[2];
+       u8      sigevm;
+       u8      max_ex_pwr;
+       u8      sgi_en;
+       u8      rxsc_sgien_exflg;
+}phy_sts_ofdm_819xpci_t;
+
+typedef struct _phy_cck_rx_status_report_819xpci
+{
+       u8      adc_pwdb_X[4];
+       u8      sq_rpt;
+       u8      cck_agc_rpt;
+}phy_sts_cck_819xpci_t, phy_sts_cck_8192s_t;
+
+
+#define                PHY_RSSI_SLID_WIN_MAX                           100
+#define                PHY_Beacon_RSSI_SLID_WIN_MAX            10
+
+typedef struct _tx_desc_819x_pci {
+        u16    PktSize;
+        u8     Offset;
+        u8     Reserved1:3;
+        u8     CmdInit:1;
+        u8     LastSeg:1;
+        u8     FirstSeg:1;
+        u8     LINIP:1;
+        u8     OWN:1;
+
+        u8     TxFWInfoSize;
+        u8     RATid:3;
+        u8     DISFB:1;
+        u8     USERATE:1;
+        u8     MOREFRAG:1;
+        u8     NoEnc:1;
+        u8     PIFS:1;
+        u8     QueueSelect:5;
+        u8     NoACM:1;
+        u8     Resv:2;
+        u8     SecCAMID:5;
+        u8     SecDescAssign:1;
+        u8     SecType:2;
+
+        u16    TxBufferSize;
+        u8     PktId:7;
+        u8     Resv1:1;
+        u8     Reserved2;
+
+       u32     TxBuffAddr;
+
+       u32     NextDescAddress;
+
+        u32    Reserved5;
+        u32    Reserved6;
+        u32    Reserved7;
+}tx_desc, *ptx_desc;
+
+
+typedef struct _tx_desc_cmd_819x_pci {
+       u16     PktSize;
+       u8      Reserved1;
+       u8      CmdType:3;
+       u8      CmdInit:1;
+       u8      LastSeg:1;
+       u8      FirstSeg:1;
+       u8      LINIP:1;
+       u8      OWN:1;
+
+       u16     ElementReport;
+       u16     Reserved2;
+
+       u16     TxBufferSize;
+       u16     Reserved3;
+
+       u32     TxBuffAddr;
+       u32     NextDescAddress;
+       u32     Reserved4;
+       u32     Reserved5;
+       u32     Reserved6;
+}tx_desc_cmd, *ptx_desc_cmd;
+
+typedef struct _rx_desc_819x_pci{
+       u16                     Length:14;
+       u16                     CRC32:1;
+       u16                     ICV:1;
+       u8                      RxDrvInfoSize;
+       u8                      Shift:2;
+       u8                      PHYStatus:1;
+       u8                      SWDec:1;
+       u8                      LastSeg:1;
+       u8                      FirstSeg:1;
+       u8                      EOR:1;
+       u8                      OWN:1;
+
+       u32                     Reserved2;
+
+       u32                     Reserved3;
+
+       u32     BufferAddress;
+
+}rx_desc, *prx_desc;
+
+
+typedef struct _rx_fwinfo_819x_pci{
+       u16                     Reserved1:12;
+       u16                     PartAggr:1;
+       u16                     FirstAGGR:1;
+       u16                     Reserved2:2;
+
+       u8                      RxRate:7;
+       u8                      RxHT:1;
+
+       u8                      BW:1;
+       u8                      SPLCP:1;
+       u8                      Reserved3:2;
+       u8                      PAM:1;
+       u8                      Mcast:1;
+       u8                      Bcast:1;
+       u8                      Reserved4:1;
+
+       u32                     TSFL;
+
+}rx_fwinfo, *prx_fwinfo;
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8190P_hwimg.c b/drivers/staging/rtl8192e/r8190P_hwimg.c
new file mode 100644 (file)
index 0000000..d8c575a
--- /dev/null
@@ -0,0 +1,4538 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef __INC_R819XU_FIRMWARE_IMG_H
+#define __INC_R819XU_FIRMWARE_IMG_H
+/*Created on  2008/ 5/19,  6:38*/
+
+#include "r8190P_hwimg.h"
+
+u8 Rtl8190PciFwBootArray[BootArrayLengthPci] = {
+0x10,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x08,0xbf,0xc0,0x25,0x08,0x00,0x08,
+0x3c,0x09,0xb0,0x03,0xad,0x28,0x00,0x20,0x40,0x80,0x68,0x00,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0xd0,0x00,0x40,0x8a,0x60,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x80,0x01,
+0x25,0x08,0xd8,0xdc,0x24,0x09,0x00,0x01,0x3c,0x01,0x7f,0xff,0x34,0x21,0xff,0xff,
+0x01,0x01,0x50,0x24,0x00,0x09,0x48,0x40,0x35,0x29,0x00,0x01,0x01,0x2a,0x10,0x2b,
+0x14,0x40,0xff,0xfc,0x00,0x00,0x00,0x00,0x3c,0x0a,0x00,0x00,0x25,0x4a,0x00,0x00,
+0x4c,0x8a,0x00,0x00,0x4c,0x89,0x08,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x80,0x01,
+0x25,0x08,0xd8,0xdc,0x3c,0x01,0x80,0x00,0x01,0x21,0x48,0x25,0x3c,0x0a,0xbf,0xc0,
+0x25,0x4a,0x00,0x7c,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0xad,0x00,0x00,0x00,
+0x21,0x08,0x00,0x04,0x01,0x09,0x10,0x2b,0x14,0x40,0xff,0xf8,0x00,0x00,0x00,0x00,
+0x3c,0x08,0x80,0x01,0x25,0x08,0x7f,0xff,0x24,0x09,0x00,0x01,0x3c,0x01,0x7f,0xff,
+0x34,0x21,0xff,0xff,0x01,0x01,0x50,0x24,0x00,0x09,0x48,0x40,0x35,0x29,0x00,0x01,
+0x01,0x2a,0x10,0x2b,0x14,0x40,0xff,0xfc,0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x01,
+0x25,0x4a,0x00,0x00,0x3c,0x01,0x7f,0xff,0x34,0x21,0xff,0xff,0x01,0x41,0x50,0x24,
+0x3c,0x09,0x00,0x01,0x35,0x29,0x7f,0xff,0x4c,0x8a,0x20,0x00,0x4c,0x89,0x28,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x08,0x04,0x10,
+0x00,0x00,0x00,0x00,0x40,0x88,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x3c,0x08,0xbf,0xc0,0x00,0x00,0x00,0x00,0x8d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0xbf,0xc0,0x25,0x4a,0x01,0x20,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,
+0x3c,0x08,0xb0,0x03,0x8d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x29,0x00,0x10,
+0xad,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x80,0x00,0x25,0x08,0x6b,0x18,
+0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,};
+
+u8 Rtl8190PciFwMainArray[MainArrayLengthPci] = {
+0x40,0x04,0x68,0x00,0x40,0x05,0x70,0x00,0x40,0x06,0x40,0x00,0x0c,0x00,0x1a,0x35,
+0x00,0x00,0x00,0x00,0x40,0x1a,0x68,0x00,0x33,0x5b,0x00,0x3c,0x17,0x60,0x00,0x09,
+0x00,0x00,0x00,0x00,0x40,0x1b,0x60,0x00,0x00,0x00,0x00,0x00,0x03,0x5b,0xd0,0x24,
+0x40,0x1a,0x70,0x00,0x03,0x40,0x00,0x08,0x42,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0xff,0x34,0x42,0xff,0xff,0x8c,0x43,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x00,0xd0,
+0xac,0x62,0x00,0x00,0x00,0x00,0x20,0x21,0x27,0x85,0x94,0x50,0x00,0x85,0x18,0x21,
+0x24,0x84,0x00,0x01,0x28,0x82,0x00,0x0a,0x14,0x40,0xff,0xfc,0xa0,0x60,0x00,0x00,
+0x27,0x82,0x94,0x5a,0x24,0x04,0x00,0x06,0x24,0x84,0xff,0xff,0xa4,0x40,0x00,0x00,
+0x04,0x81,0xff,0xfd,0x24,0x42,0x00,0x02,0x24,0x02,0x00,0x03,0xa3,0x82,0x94,0x50,
+0x24,0x02,0x00,0x0a,0x24,0x03,0x09,0xc4,0xa3,0x82,0x94,0x52,0x24,0x02,0x00,0x04,
+0x24,0x04,0x00,0x01,0x24,0x05,0x00,0x02,0xa7,0x83,0x94,0x66,0xa3,0x82,0x94,0x58,
+0x24,0x03,0x04,0x00,0x24,0x02,0x02,0x00,0xaf,0x83,0x94,0x6c,0xa3,0x85,0x94,0x59,
+0xa7,0x82,0x94,0x5a,0xa7,0x84,0x94,0x5c,0xaf,0x84,0x94,0x68,0xa3,0x84,0x94,0x51,
+0xa3,0x80,0x94,0x53,0xa3,0x80,0x94,0x54,0xa3,0x80,0x94,0x55,0xa3,0x84,0x94,0x56,
+0xa3,0x85,0x94,0x57,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x24,0x42,0x01,0x7c,0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,
+0x27,0x84,0x94,0x78,0x00,0x00,0x10,0x21,0x24,0x42,0x00,0x01,0x00,0x02,0x16,0x00,
+0x00,0x02,0x16,0x03,0x28,0x43,0x00,0x03,0xac,0x80,0xff,0xfc,0xa0,0x80,0x00,0x00,
+0x14,0x60,0xff,0xf9,0x24,0x84,0x00,0x0c,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x01,0xc0,
+0x3c,0x08,0xb0,0x03,0xac,0x62,0x00,0x00,0x35,0x08,0x00,0x70,0x8d,0x02,0x00,0x00,
+0x00,0xa0,0x48,0x21,0x00,0x04,0x26,0x00,0x00,0x02,0x2a,0x43,0x00,0x06,0x36,0x00,
+0x00,0x07,0x3e,0x00,0x00,0x02,0x12,0x03,0x29,0x23,0x00,0x03,0x00,0x04,0x56,0x03,
+0x00,0x06,0x36,0x03,0x00,0x07,0x3e,0x03,0x30,0x48,0x00,0x01,0x10,0x60,0x00,0x11,
+0x30,0xa5,0x00,0x07,0x24,0x02,0x00,0x02,0x00,0x49,0x10,0x23,0x00,0x45,0x10,0x07,
+0x30,0x42,0x00,0x01,0x10,0x40,0x00,0x66,0x00,0x00,0x00,0x00,0x8f,0xa2,0x00,0x10,
+0x00,0x00,0x00,0x00,0x00,0x02,0x21,0x43,0x11,0x00,0x00,0x10,0x00,0x07,0x20,0x0b,
+0x15,0x20,0x00,0x06,0x24,0x02,0x00,0x01,0x3c,0x02,0xb0,0x05,0x34,0x42,0x01,0x20,
+0xa4,0x44,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x11,0x22,0x00,0x04,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x05,0x08,0x00,0x00,0x94,0x34,0x42,0x01,0x24,
+0x3c,0x02,0xb0,0x05,0x08,0x00,0x00,0x94,0x34,0x42,0x01,0x22,0x15,0x20,0x00,0x54,
+0x24,0x02,0x00,0x01,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x74,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0xaf,0x83,0x94,0x74,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x70,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x6b,0x00,0x08,0x11,0x60,0x00,0x18,
+0x00,0x09,0x28,0x40,0x00,0x00,0x40,0x21,0x27,0x85,0x94,0x70,0x8c,0xa3,0x00,0x00,
+0x8c,0xa2,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x62,0x38,0x23,0x00,0x43,0x10,0x2a,
+0x10,0x40,0x00,0x3d,0x00,0x00,0x00,0x00,0xac,0xa7,0x00,0x00,0x25,0x02,0x00,0x01,
+0x00,0x02,0x16,0x00,0x00,0x02,0x46,0x03,0x29,0x03,0x00,0x03,0x14,0x60,0xff,0xf3,
+0x24,0xa5,0x00,0x0c,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x70,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x4b,0x10,0x23,0xa0,0x62,0x00,0x00,0x00,0x09,0x28,0x40,
+0x00,0xa9,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x94,0x78,0x00,0x0a,0x20,0x0b,
+0x00,0x43,0x18,0x21,0x10,0xc0,0x00,0x05,0x00,0x00,0x38,0x21,0x80,0x62,0x00,0x01,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x80,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x03,0x00,0xa9,0x10,0x21,0x24,0x07,0x00,0x01,
+0x00,0xa9,0x10,0x21,0x00,0x02,0x30,0x80,0x27,0x82,0x94,0x78,0xa0,0x67,0x00,0x01,
+0x00,0xc2,0x38,0x21,0x80,0xe3,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x07,
+0x00,0x00,0x00,0x00,0x27,0x83,0x94,0x70,0x00,0xc3,0x18,0x21,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x21,0xac,0x62,0x00,0x00,0x27,0x85,0x94,0x74,
+0x27,0x82,0x94,0x70,0x00,0xc5,0x28,0x21,0x00,0xc2,0x10,0x21,0x8c,0x43,0x00,0x00,
+0x8c,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x18,0x2a,0x14,0x60,0x00,0x03,
+0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0xa0,0xe2,0x00,0x00,0xa0,0xe0,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xb7,0xac,0xa0,0x00,0x00,
+0x11,0x22,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x7c,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x83,0x94,0x8c,0x08,0x00,0x00,0xa7,
+0x3c,0x02,0xb0,0x03,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x78,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0xaf,0x83,0x94,0x80,0x08,0x00,0x00,0xa7,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x04,0x10,
+0x3c,0x05,0xb0,0x03,0xac,0x62,0x00,0x00,0x34,0xa5,0x00,0x70,0x8c,0xa2,0x00,0x00,
+0x90,0x84,0x00,0x08,0x3c,0x06,0xb0,0x03,0x00,0x02,0x16,0x00,0x2c,0x83,0x00,0x03,
+0x34,0xc6,0x00,0x72,0x24,0x07,0x00,0x01,0x10,0x60,0x00,0x11,0x00,0x02,0x2f,0xc2,
+0x90,0xc2,0x00,0x00,0x00,0x00,0x18,0x21,0x00,0x02,0x16,0x00,0x10,0xa7,0x00,0x09,
+0x00,0x02,0x16,0x03,0x14,0x80,0x00,0x0c,0x30,0x43,0x00,0x03,0x83,0x82,0x94,0x78,
+0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x00,0x02,0x16,0x00,
+0x00,0x02,0x1e,0x03,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x72,0xa0,0x43,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0x45,0x00,0x05,0x10,0x87,0x00,0x04,
+0x30,0x43,0x00,0x06,0x93,0x82,0x94,0x90,0x08,0x00,0x01,0x1f,0x00,0x43,0x10,0x21,
+0x83,0x82,0x94,0x84,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x40,0x08,0x00,0x01,0x1f,
+0x00,0x45,0x10,0x21,0x10,0x80,0x00,0x05,0x00,0x00,0x18,0x21,0x24,0x63,0x00,0x01,
+0x00,0x64,0x10,0x2b,0x14,0x40,0xff,0xfd,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x24,0x42,0x04,0xe4,
+0x3c,0x04,0xb0,0x02,0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,0x34,0x84,0x00,0x08,
+0x24,0x02,0x00,0x01,0xaf,0x84,0x94,0xa0,0xa3,0x82,0x94,0xb0,0xa7,0x80,0x94,0xa4,
+0xa7,0x80,0x94,0xa6,0xaf,0x80,0x94,0xa8,0xaf,0x80,0x94,0xac,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,
+0x24,0x42,0x05,0x24,0x3c,0x04,0xb0,0x03,0xac,0x62,0x00,0x00,0x34,0x84,0x00,0xac,
+0x80,0xa2,0x00,0x15,0x8c,0x83,0x00,0x00,0x27,0xbd,0xff,0xf0,0x00,0x43,0x10,0x21,
+0xac,0x82,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x10,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x00,0x34,0x42,0x00,0x20,0x24,0x63,0x05,0x5c,0x27,0xbd,0xff,0xe0,
+0xac,0x43,0x00,0x00,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x18,
+0x8f,0x90,0x94,0xa0,0x0c,0x00,0x02,0x90,0x00,0x80,0x88,0x21,0x14,0x40,0x00,0x2a,
+0x3c,0x02,0x00,0x80,0x16,0x20,0x00,0x02,0x34,0x42,0x02,0x01,0x24,0x02,0x02,0x01,
+0xae,0x02,0x00,0x00,0x97,0x84,0x94,0xa4,0x97,0x82,0x94,0xa6,0x3c,0x03,0xb0,0x02,
+0x00,0x83,0x20,0x21,0x24,0x42,0x00,0x04,0xa7,0x82,0x94,0xa6,0xa4,0x82,0x00,0x00,
+0x8f,0x84,0x94,0xa8,0x8f,0x82,0x94,0xa0,0x93,0x85,0x94,0x52,0x24,0x84,0x00,0x01,
+0x24,0x42,0x00,0x04,0x24,0x03,0x8f,0xff,0x3c,0x07,0xb0,0x06,0x3c,0x06,0xb0,0x03,
+0x00,0x43,0x10,0x24,0x00,0x85,0x28,0x2a,0x34,0xe7,0x80,0x18,0xaf,0x82,0x94,0xa0,
+0xaf,0x84,0x94,0xa8,0x10,0xa0,0x00,0x08,0x34,0xc6,0x01,0x08,0x8f,0x83,0x94,0xac,
+0x8f,0x84,0x94,0x6c,0x8c,0xc2,0x00,0x00,0x00,0x64,0x18,0x21,0x00,0x43,0x10,0x2b,
+0x14,0x40,0x00,0x09,0x00,0x00,0x00,0x00,0x8c,0xe2,0x00,0x00,0x3c,0x03,0x0f,0x00,
+0x3c,0x04,0x04,0x00,0x00,0x43,0x10,0x24,0x10,0x44,0x00,0x03,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x04,0x8e,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x27,0xbd,0xff,0xd8,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x00,0x24,0x63,0x06,0x48,0xaf,0xb0,0x00,0x10,0x34,0x42,0x00,0x20,
+0x8f,0x90,0x94,0xa0,0xac,0x43,0x00,0x00,0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x20,0x00,0x80,0x88,0x21,0x00,0xa0,0x90,0x21,
+0x0c,0x00,0x02,0x90,0x00,0xc0,0x98,0x21,0x24,0x07,0x8f,0xff,0x14,0x40,0x00,0x19,
+0x26,0x03,0x00,0x04,0x24,0x02,0x0e,0x03,0xae,0x02,0x00,0x00,0x00,0x67,0x80,0x24,
+0x26,0x02,0x00,0x04,0xae,0x11,0x00,0x00,0x00,0x47,0x80,0x24,0x97,0x86,0x94,0xa4,
+0x26,0x03,0x00,0x04,0xae,0x12,0x00,0x00,0x00,0x67,0x80,0x24,0xae,0x13,0x00,0x00,
+0x8f,0x84,0x94,0xa0,0x3c,0x02,0xb0,0x02,0x97,0x85,0x94,0xa6,0x00,0xc2,0x30,0x21,
+0x8f,0x82,0x94,0xa8,0x24,0x84,0x00,0x10,0x24,0xa5,0x00,0x10,0x00,0x87,0x20,0x24,
+0x24,0x42,0x00,0x01,0xa7,0x85,0x94,0xa6,0xaf,0x84,0x94,0xa0,0xaf,0x82,0x94,0xa8,
+0xa4,0xc5,0x00,0x00,0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,
+0x94,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x42,0xe0,0x00,0x14,0x40,0x00,0x14,
+0x00,0x00,0x00,0x00,0x90,0x82,0x00,0x02,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfc,
+0x00,0x82,0x28,0x21,0x8c,0xa4,0x00,0x00,0x3c,0x02,0x00,0x70,0x8c,0xa6,0x00,0x08,
+0x00,0x82,0x10,0x21,0x2c,0x43,0x00,0x06,0x10,0x60,0x00,0x09,0x3c,0x03,0x80,0x01,
+0x00,0x02,0x10,0x80,0x24,0x63,0x08,0x94,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0xaf,0x86,0x80,0x14,
+0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x8c,0xa4,0x00,0x00,0x0c,0x00,0x1f,0x4f,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0xdc,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x2c,0x0d,0x00,0xc0,0x20,0x21,0x08,0x00,0x01,0xdc,
+0x00,0x00,0x00,0x00,0x87,0x83,0x88,0x06,0x93,0x82,0x80,0x18,0x00,0x00,0x00,0x00,
+0x10,0x62,0x00,0x08,0x00,0x00,0x00,0x00,0x93,0x83,0x88,0x07,0x24,0x02,0x00,0x01,
+0xa3,0x82,0x80,0x11,0xa3,0x83,0x80,0x19,0xa3,0x83,0x80,0x18,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x93,0x82,0x80,0x19,0x00,0x00,0x00,0x00,0x14,0x62,0xff,0xf6,
+0x00,0x00,0x00,0x00,0x08,0x00,0x01,0xf3,0x00,0x00,0x00,0x00,0x30,0x84,0x00,0xff,
+0x14,0x80,0x00,0x2f,0x00,0x00,0x00,0x00,0x8f,0x82,0x80,0x14,0xa3,0x85,0x8b,0xcb,
+0x10,0x40,0x00,0x2b,0x2c,0xa2,0x00,0x04,0x14,0x40,0x00,0x06,0x00,0x05,0x10,0x40,
+0x24,0xa2,0xff,0xfc,0x2c,0x42,0x00,0x08,0x10,0x40,0x00,0x09,0x24,0xa2,0xff,0xf0,
+0x00,0x05,0x10,0x40,0x27,0x84,0x8b,0xd4,0x00,0x44,0x10,0x21,0x94,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,0x03,0xe0,0x00,0x08,0xa4,0x43,0x00,0x00,
+0x2c,0x42,0x00,0x10,0x14,0x40,0x00,0x0a,0x00,0x05,0x10,0x40,0x24,0xa2,0xff,0xe0,
+0x2c,0x42,0x00,0x10,0x14,0x40,0x00,0x06,0x00,0x05,0x10,0x40,0x24,0xa2,0xff,0xd0,
+0x2c,0x42,0x00,0x10,0x10,0x40,0x00,0x09,0x24,0xa2,0xff,0xc0,0x00,0x05,0x10,0x40,
+0x27,0x84,0x8b,0xd4,0x00,0x44,0x10,0x21,0x94,0x43,0xff,0xf8,0x00,0x00,0x00,0x00,
+0x24,0x63,0x00,0x01,0x03,0xe0,0x00,0x08,0xa4,0x43,0xff,0xf8,0x2c,0x42,0x00,0x10,
+0x10,0x40,0x00,0x07,0x00,0x05,0x10,0x40,0x27,0x84,0x8b,0xd4,0x00,0x44,0x10,0x21,
+0x94,0x43,0xff,0xf8,0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,0xa4,0x43,0xff,0xf8,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x8f,0x86,0x94,0xa0,0x8f,0x82,0x80,0x14,
+0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x10,0x40,0x00,0x2a,0x00,0xc0,0x38,0x21,
+0x24,0x02,0x00,0x07,0x24,0x03,0xff,0x9c,0xa3,0x82,0x8b,0xd3,0xa3,0x83,0x8b,0xd2,
+0x27,0x8a,0x8b,0xd0,0x00,0x00,0x20,0x21,0x24,0x09,0x8f,0xff,0x00,0x04,0x10,0x80,
+0x00,0x4a,0x28,0x21,0x8c,0xa2,0x00,0x00,0x24,0xe3,0x00,0x04,0x24,0x88,0x00,0x01,
+0xac,0xe2,0x00,0x00,0x10,0x80,0x00,0x02,0x00,0x69,0x38,0x24,0xac,0xa0,0x00,0x00,
+0x31,0x04,0x00,0xff,0x2c,0x82,0x00,0x27,0x14,0x40,0xff,0xf5,0x00,0x04,0x10,0x80,
+0x97,0x83,0x94,0xa6,0x97,0x85,0x94,0xa4,0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x9c,
+0x00,0xa2,0x28,0x21,0x3c,0x04,0xb0,0x06,0xa7,0x83,0x94,0xa6,0x34,0x84,0x80,0x18,
+0xa4,0xa3,0x00,0x00,0x8c,0x85,0x00,0x00,0x24,0x02,0x8f,0xff,0x24,0xc6,0x00,0x9c,
+0x3c,0x03,0x0f,0x00,0x00,0xc2,0x30,0x24,0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,
+0xaf,0x86,0x94,0xa0,0x10,0xa2,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x8e,
+0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x8f,0x86,0x94,0xa0,0x27,0xbd,0xff,0xc8,0x24,0x02,0x00,0x08,
+0x24,0x03,0x00,0x20,0xaf,0xbf,0x00,0x30,0xa3,0xa2,0x00,0x13,0xa3,0xa3,0x00,0x12,
+0xa7,0xa4,0x00,0x10,0x00,0xc0,0x28,0x21,0x27,0xa9,0x00,0x10,0x00,0x00,0x38,0x21,
+0x24,0x08,0x8f,0xff,0x00,0x07,0x10,0x80,0x00,0x49,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x24,0xe3,0x00,0x01,0x30,0x67,0x00,0xff,0x24,0xa2,0x00,0x04,0x2c,0xe3,0x00,0x08,
+0xac,0xa4,0x00,0x00,0x14,0x60,0xff,0xf7,0x00,0x48,0x28,0x24,0x97,0x83,0x94,0xa6,
+0x97,0x85,0x94,0xa4,0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x20,0x00,0xa2,0x28,0x21,
+0x3c,0x04,0xb0,0x06,0xa7,0x83,0x94,0xa6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,
+0x8c,0x85,0x00,0x00,0x24,0x02,0x8f,0xff,0x24,0xc6,0x00,0x20,0x3c,0x03,0x0f,0x00,
+0x00,0xc2,0x30,0x24,0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,0xaf,0x86,0x94,0xa0,
+0x10,0xa2,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x8e,0x00,0x00,0x00,0x00,
+0x8f,0xbf,0x00,0x30,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,
+0x93,0x82,0x94,0xb0,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x11,0x24,0x06,0x00,0x01,
+0x8f,0x82,0x94,0xa8,0x3c,0x05,0xb0,0x06,0x3c,0x04,0xb0,0x03,0x34,0xa5,0x80,0x18,
+0x34,0x84,0x01,0x08,0x14,0x40,0x00,0x09,0x00,0x00,0x30,0x21,0x97,0x82,0x94,0xa4,
+0x8c,0x84,0x00,0x00,0x3c,0x03,0xb0,0x02,0x00,0x43,0x10,0x21,0xaf,0x84,0x94,0xac,
+0xa7,0x80,0x94,0xa6,0xac,0x40,0x00,0x00,0xac,0x40,0x00,0x04,0x8c,0xa2,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0xc0,0x10,0x21,0x8f,0x86,0x94,0xa0,0x8f,0x82,0x94,0xa8,
+0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x00,0xc0,0x40,0x21,0x14,0x40,0x00,0x0a,
+0x00,0x40,0x50,0x21,0x00,0x00,0x38,0x21,0x27,0x89,0x8b,0xa0,0x24,0xe2,0x00,0x01,
+0x00,0x07,0x18,0x80,0x30,0x47,0x00,0xff,0x00,0x69,0x18,0x21,0x2c,0xe2,0x00,0x0a,
+0x14,0x40,0xff,0xfa,0xac,0x60,0x00,0x00,0x3c,0x02,0x00,0x80,0x10,0x82,0x00,0x6f,
+0x00,0x00,0x00,0x00,0x97,0x82,0x8b,0xa6,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,
+0xa7,0x82,0x8b,0xa6,0x90,0xa3,0x00,0x15,0x97,0x82,0x8b,0xa8,0x00,0x03,0x1e,0x00,
+0x00,0x03,0x1e,0x03,0x00,0x43,0x10,0x21,0xa7,0x82,0x8b,0xa8,0x8c,0xa4,0x00,0x20,
+0x3c,0x02,0x00,0x60,0x3c,0x03,0x00,0x20,0x00,0x82,0x20,0x24,0x10,0x83,0x00,0x54,
+0x00,0x00,0x00,0x00,0x14,0x80,0x00,0x47,0x00,0x00,0x00,0x00,0x97,0x82,0x8b,0xac,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xa7,0x82,0x8b,0xac,0x84,0xa3,0x00,0x06,
+0x8f,0x82,0x8b,0xbc,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x21,0xaf,0x82,0x8b,0xbc,
+0x25,0x42,0x00,0x01,0x28,0x43,0x27,0x10,0xaf,0x82,0x94,0xa8,0x10,0x60,0x00,0x09,
+0x24,0x02,0x00,0x04,0x93,0x83,0x80,0x11,0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x05,
+0x24,0x02,0x00,0x04,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x24,0x03,0x00,0x28,0xa3,0x83,0x8b,0xa2,0xa3,0x82,0x8b,0xa3,
+0x90,0xa2,0x00,0x18,0x93,0x83,0x8b,0xcb,0x00,0x00,0x38,0x21,0x00,0x02,0x16,0x00,
+0x00,0x02,0x16,0x03,0xa7,0x82,0x8b,0xb6,0xa3,0x83,0x8b,0xc4,0x27,0x89,0x8b,0xa0,
+0x24,0x05,0x8f,0xff,0x00,0x07,0x10,0x80,0x00,0x49,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x24,0xe3,0x00,0x01,0x30,0x67,0x00,0xff,0x25,0x02,0x00,0x04,0x2c,0xe3,0x00,0x0a,
+0xad,0x04,0x00,0x00,0x14,0x60,0xff,0xf7,0x00,0x45,0x40,0x24,0x97,0x83,0x94,0xa6,
+0x97,0x85,0x94,0xa4,0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x28,0x00,0xa2,0x28,0x21,
+0x3c,0x04,0xb0,0x06,0xa7,0x83,0x94,0xa6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,
+0x8c,0x85,0x00,0x00,0x24,0x02,0x8f,0xff,0x24,0xc6,0x00,0x28,0x3c,0x03,0x0f,0x00,
+0x00,0xc2,0x30,0x24,0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,0xaf,0x86,0x94,0xa0,
+0x10,0xa2,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x8e,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x02,0x2e,0x00,0x00,0x00,0x00,0xa3,0x80,0x80,0x11,0x08,0x00,0x02,0xdd,
+0x00,0x00,0x00,0x00,0x97,0x82,0x8b,0xae,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,
+0xa7,0x82,0x8b,0xae,0x84,0xa3,0x00,0x06,0x8f,0x82,0x8b,0xc0,0x00,0x00,0x00,0x00,
+0x00,0x43,0x10,0x21,0xaf,0x82,0x8b,0xc0,0x08,0x00,0x02,0xd5,0x25,0x42,0x00,0x01,
+0x97,0x82,0x8b,0xaa,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xa7,0x82,0x8b,0xaa,
+0x84,0xa3,0x00,0x06,0x8f,0x82,0x8b,0xb8,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x21,
+0xaf,0x82,0x8b,0xb8,0x08,0x00,0x02,0xd5,0x25,0x42,0x00,0x01,0x97,0x82,0x8b,0xa4,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xa7,0x82,0x8b,0xa4,0x08,0x00,0x02,0xbd,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xd0,0xaf,0xbf,0x00,0x28,0x8c,0xa3,0x00,0x20,
+0x8f,0x8a,0x94,0xa0,0x3c,0x02,0x00,0x10,0x00,0x62,0x10,0x24,0x00,0xa0,0x38,0x21,
+0x01,0x40,0x48,0x21,0x10,0x40,0x00,0x3d,0x00,0x80,0x28,0x21,0x8c,0xe4,0x00,0x1c,
+0x34,0xa5,0x12,0x06,0xaf,0xa5,0x00,0x10,0x8c,0x82,0x00,0x08,0x00,0x03,0x1c,0x42,
+0x30,0x63,0x00,0x30,0x00,0x02,0x13,0x02,0x30,0x42,0x00,0x40,0x00,0x43,0x10,0x25,
+0x90,0xe6,0x00,0x10,0x90,0xe4,0x00,0x13,0x94,0xe8,0x00,0x0c,0x94,0xe3,0x00,0x1a,
+0x00,0x02,0x16,0x00,0x90,0xe7,0x00,0x12,0x00,0xa2,0x28,0x25,0x24,0x02,0x12,0x34,
+0xa7,0xa2,0x00,0x1c,0x24,0x02,0x56,0x78,0xaf,0xa5,0x00,0x10,0xa3,0xa6,0x00,0x18,
+0xa3,0xa7,0x00,0x1f,0xa7,0xa3,0x00,0x1a,0xa3,0xa4,0x00,0x19,0xa7,0xa8,0x00,0x20,
+0xa7,0xa2,0x00,0x22,0x00,0x00,0x28,0x21,0x27,0xa7,0x00,0x10,0x24,0x06,0x8f,0xff,
+0x00,0x05,0x10,0x80,0x00,0x47,0x10,0x21,0x8c,0x44,0x00,0x00,0x24,0xa3,0x00,0x01,
+0x30,0x65,0x00,0xff,0x25,0x22,0x00,0x04,0x2c,0xa3,0x00,0x05,0xad,0x24,0x00,0x00,
+0x14,0x60,0xff,0xf7,0x00,0x46,0x48,0x24,0x97,0x83,0x94,0xa6,0x97,0x85,0x94,0xa4,
+0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x14,0x00,0xa2,0x28,0x21,0x3c,0x04,0xb0,0x06,
+0xa7,0x83,0x94,0xa6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,0x8c,0x85,0x00,0x00,
+0x24,0x02,0x8f,0xff,0x25,0x46,0x00,0x14,0x3c,0x03,0x0f,0x00,0x00,0xc2,0x50,0x24,
+0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,0xaf,0x8a,0x94,0xa0,0x10,0xa2,0x00,0x03,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x8e,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x28,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,0x3c,0x05,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xc8,0x00,0x04,0x22,0x00,0x34,0xa5,0x00,0x20,
+0x24,0x42,0x0d,0xdc,0x3c,0x03,0xb0,0x00,0xaf,0xb5,0x00,0x24,0xaf,0xb4,0x00,0x20,
+0xaf,0xb2,0x00,0x18,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x30,0x00,0x83,0x80,0x21,
+0xaf,0xb7,0x00,0x2c,0xaf,0xb6,0x00,0x28,0xaf,0xb3,0x00,0x1c,0xaf,0xb1,0x00,0x14,
+0xac,0xa2,0x00,0x00,0x8e,0x09,0x00,0x00,0x00,0x00,0x90,0x21,0x26,0x10,0x00,0x08,
+0x00,0x09,0xa6,0x02,0x12,0x80,0x00,0x13,0x00,0x00,0xa8,0x21,0x24,0x13,0x00,0x02,
+0x3c,0x16,0x00,0xff,0x3c,0x17,0xff,0x00,0x8e,0x09,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x09,0x12,0x02,0x24,0x42,0x00,0x02,0x31,0x25,0x00,0xff,0x10,0xb3,0x00,0x76,
+0x30,0x51,0x00,0xff,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x18,0x00,0x00,0x00,0x00,
+0x02,0x51,0x10,0x21,0x30,0x52,0xff,0xff,0x02,0x54,0x18,0x2b,0x14,0x60,0xff,0xf2,
+0x02,0x11,0x80,0x21,0x12,0xa0,0x00,0x0a,0x3c,0x02,0xb0,0x06,0x34,0x42,0x80,0x18,
+0x8c,0x43,0x00,0x00,0x3c,0x04,0x0f,0x00,0x3c,0x02,0x04,0x00,0x00,0x64,0x18,0x24,
+0x10,0x62,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x8e,0x00,0x00,0x00,0x00,
+0x8f,0xbf,0x00,0x30,0x7b,0xb6,0x01,0x7c,0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0x8e,0x09,0x00,0x04,
+0x24,0x15,0x00,0x01,0x8e,0x06,0x00,0x0c,0x00,0x09,0x11,0x42,0x00,0x09,0x18,0xc2,
+0x30,0x48,0x00,0x03,0x00,0x09,0x14,0x02,0x30,0x6c,0x00,0x03,0x00,0x09,0x26,0x02,
+0x11,0x15,0x00,0x45,0x30,0x43,0x00,0x0f,0x29,0x02,0x00,0x02,0x14,0x40,0x00,0x26,
+0x00,0x00,0x00,0x00,0x11,0x13,0x00,0x0f,0x00,0x00,0x38,0x21,0x00,0x07,0x22,0x02,
+0x30,0x84,0xff,0x00,0x3c,0x03,0x00,0xff,0x00,0x07,0x2e,0x02,0x00,0x07,0x12,0x00,
+0x00,0x43,0x10,0x24,0x00,0xa4,0x28,0x25,0x00,0xa2,0x28,0x25,0x00,0x07,0x1e,0x00,
+0x00,0xa3,0x28,0x25,0x0c,0x00,0x01,0x92,0x01,0x20,0x20,0x21,0x08,0x00,0x03,0x9d,
+0x02,0x51,0x10,0x21,0x11,0x95,0x00,0x0f,0x00,0x00,0x00,0x00,0x11,0x88,0x00,0x07,
+0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x80,0x27,0x83,0x94,0x50,0x00,0x43,0x10,0x21,
+0x8c,0x47,0x00,0x18,0x08,0x00,0x03,0xc4,0x00,0x07,0x22,0x02,0x00,0x04,0x10,0x40,
+0x27,0x83,0x94,0x58,0x00,0x43,0x10,0x21,0x94,0x47,0x00,0x02,0x08,0x00,0x03,0xc4,
+0x00,0x07,0x22,0x02,0x27,0x82,0x94,0x50,0x00,0x82,0x10,0x21,0x90,0x47,0x00,0x00,
+0x08,0x00,0x03,0xc4,0x00,0x07,0x22,0x02,0x15,0x00,0xff,0xdc,0x00,0x00,0x38,0x21,
+0x10,0x75,0x00,0x05,0x00,0x80,0x38,0x21,0x00,0x65,0x18,0x26,0x24,0x82,0x01,0x00,
+0x00,0x00,0x38,0x21,0x00,0x43,0x38,0x0a,0x24,0x02,0x00,0x01,0x11,0x82,0x00,0x0e,
+0x3c,0x02,0xb0,0x03,0x24,0x02,0x00,0x02,0x11,0x82,0x00,0x06,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x00,0xe2,0x10,0x21,0x8c,0x47,0x00,0x00,0x08,0x00,0x03,0xc4,
+0x00,0x07,0x22,0x02,0x3c,0x02,0xb0,0x03,0x00,0xe2,0x10,0x21,0x94,0x43,0x00,0x00,
+0x08,0x00,0x03,0xc3,0x30,0x67,0xff,0xff,0x00,0xe2,0x10,0x21,0x90,0x43,0x00,0x00,
+0x08,0x00,0x03,0xc3,0x30,0x67,0x00,0xff,0x30,0x62,0x00,0x03,0x00,0x02,0x12,0x00,
+0x11,0x95,0x00,0x07,0x00,0x44,0x38,0x21,0x11,0x93,0x00,0x03,0x00,0x00,0x00,0x00,
+0x08,0x00,0x03,0xf5,0x3c,0x02,0xb0,0x0a,0x08,0x00,0x03,0xfa,0x3c,0x02,0xb0,0x0a,
+0x08,0x00,0x03,0xfe,0x3c,0x02,0xb0,0x0a,0x8e,0x09,0x00,0x04,0x8e,0x02,0x00,0x08,
+0x8e,0x03,0x00,0x0c,0x00,0x09,0x41,0x42,0x00,0x02,0x22,0x02,0x00,0x03,0x3a,0x02,
+0x30,0x84,0xff,0x00,0x30,0xe7,0xff,0x00,0x00,0x02,0x5e,0x02,0x00,0x02,0x32,0x00,
+0x00,0x03,0x56,0x02,0x00,0x03,0x2a,0x00,0x01,0x64,0x58,0x25,0x00,0xd6,0x30,0x24,
+0x01,0x47,0x50,0x25,0x00,0x02,0x16,0x00,0x00,0xb6,0x28,0x24,0x00,0x03,0x1e,0x00,
+0x01,0x66,0x58,0x25,0x01,0x45,0x50,0x25,0x00,0x57,0x10,0x24,0x00,0x77,0x18,0x24,
+0x01,0x62,0x38,0x25,0x01,0x43,0x30,0x25,0x00,0x09,0x10,0xc2,0x00,0x09,0x1c,0x02,
+0x31,0x08,0x00,0x03,0x30,0x4c,0x00,0x03,0x30,0x63,0x00,0x0f,0x00,0x09,0x26,0x02,
+0x00,0xe0,0x58,0x21,0x15,0x00,0x00,0x28,0x00,0xc0,0x50,0x21,0x24,0x02,0x00,0x01,
+0x10,0x62,0x00,0x06,0x00,0x80,0x28,0x21,0x24,0x02,0x00,0x03,0x14,0x62,0xff,0x69,
+0x02,0x51,0x10,0x21,0x24,0x85,0x01,0x00,0x24,0x02,0x00,0x01,0x11,0x82,0x00,0x15,
+0x24,0x02,0x00,0x02,0x11,0x82,0x00,0x0a,0x3c,0x03,0xb0,0x03,0x00,0xa3,0x18,0x21,
+0x8c,0x62,0x00,0x00,0x00,0x0a,0x20,0x27,0x01,0x6a,0x28,0x24,0x00,0x44,0x10,0x24,
+0x00,0x45,0x10,0x25,0xac,0x62,0x00,0x00,0x08,0x00,0x03,0x9d,0x02,0x51,0x10,0x21,
+0x00,0xa3,0x18,0x21,0x94,0x62,0x00,0x00,0x00,0x0a,0x20,0x27,0x01,0x6a,0x28,0x24,
+0x00,0x44,0x10,0x24,0x00,0x45,0x10,0x25,0xa4,0x62,0x00,0x00,0x08,0x00,0x03,0x9d,
+0x02,0x51,0x10,0x21,0x3c,0x03,0xb0,0x03,0x00,0xa3,0x18,0x21,0x90,0x62,0x00,0x00,
+0x00,0x0a,0x20,0x27,0x01,0x6a,0x28,0x24,0x00,0x44,0x10,0x24,0x00,0x45,0x10,0x25,
+0x08,0x00,0x03,0x9c,0xa0,0x62,0x00,0x00,0x24,0x02,0x00,0x01,0x11,0x02,0x00,0x21,
+0x00,0x00,0x00,0x00,0x15,0x13,0xff,0x42,0x00,0x00,0x00,0x00,0x11,0x82,0x00,0x17,
+0x00,0x00,0x00,0x00,0x11,0x88,0x00,0x0b,0x00,0x00,0x00,0x00,0x27,0x83,0x94,0x50,
+0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,0x8c,0x82,0x00,0x18,0x00,0x06,0x18,0x27,
+0x00,0xe6,0x28,0x24,0x00,0x43,0x10,0x24,0x00,0x45,0x10,0x25,0x08,0x00,0x03,0x9c,
+0xac,0x82,0x00,0x18,0x27,0x83,0x94,0x58,0x00,0x04,0x20,0x40,0x00,0x83,0x20,0x21,
+0x94,0x82,0x00,0x02,0x00,0x06,0x18,0x27,0x00,0xe6,0x28,0x24,0x00,0x43,0x10,0x24,
+0x00,0x45,0x10,0x25,0x08,0x00,0x03,0x9c,0xa4,0x82,0x00,0x02,0x27,0x83,0x94,0x50,
+0x00,0x83,0x18,0x21,0x90,0x62,0x00,0x00,0x00,0x06,0x20,0x27,0x08,0x00,0x04,0x52,
+0x00,0xe6,0x28,0x24,0x30,0x62,0x00,0x07,0x00,0x02,0x12,0x00,0x11,0x88,0x00,0x0f,
+0x00,0x44,0x10,0x21,0x11,0x93,0x00,0x07,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,
+0x00,0x43,0x18,0x21,0x8c,0x62,0x00,0x00,0x00,0x06,0x20,0x27,0x08,0x00,0x04,0x3f,
+0x00,0xe6,0x28,0x24,0x3c,0x03,0xb0,0x0a,0x00,0x43,0x18,0x21,0x94,0x62,0x00,0x00,
+0x00,0x06,0x20,0x27,0x08,0x00,0x04,0x48,0x00,0xe6,0x28,0x24,0x3c,0x03,0xb0,0x0a,
+0x08,0x00,0x04,0x75,0x00,0x43,0x18,0x21,0x97,0x85,0x94,0xa4,0x3c,0x07,0xb0,0x02,
+0x3c,0x04,0xb0,0x03,0x3c,0x02,0x80,0x00,0x00,0xa7,0x28,0x21,0x34,0x84,0x00,0x20,
+0x24,0x42,0x12,0x38,0x24,0x03,0xff,0x80,0xac,0x82,0x00,0x00,0xa0,0xa3,0x00,0x07,
+0x97,0x82,0x94,0xa6,0x97,0x85,0x94,0xa4,0x3c,0x06,0xb0,0x06,0x30,0x42,0xff,0xf8,
+0x24,0x42,0x00,0x10,0x00,0xa2,0x10,0x21,0x30,0x42,0x0f,0xff,0x24,0x44,0x00,0x08,
+0x30,0x84,0x0f,0xff,0x00,0x05,0x28,0xc2,0x3c,0x03,0x00,0x40,0x00,0xa3,0x28,0x25,
+0x00,0x87,0x20,0x21,0x34,0xc6,0x80,0x18,0xac,0xc5,0x00,0x00,0xaf,0x84,0x94,0xa0,
+0xa7,0x82,0x94,0xa4,0xa7,0x80,0x94,0xa6,0xaf,0x80,0x94,0xa8,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0xa5,0x00,0xff,0x30,0x84,0x00,0xff,0x24,0x02,0x00,0x01,
+0x00,0xe0,0x48,0x21,0x30,0xc6,0x00,0xff,0x8f,0xa7,0x00,0x10,0x10,0x82,0x00,0x07,
+0x00,0xa0,0x40,0x21,0x24,0x02,0x00,0x03,0x10,0x82,0x00,0x03,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x24,0xa8,0x01,0x00,0x3c,0x03,0xb0,0x03,
+0x24,0x02,0x00,0x01,0x00,0x07,0x20,0x27,0x01,0x27,0x28,0x24,0x10,0xc2,0x00,0x14,
+0x01,0x03,0x18,0x21,0x24,0x02,0x00,0x02,0x10,0xc2,0x00,0x09,0x00,0x07,0x50,0x27,
+0x3c,0x03,0xb0,0x03,0x01,0x03,0x18,0x21,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x4a,0x10,0x24,0x00,0x45,0x10,0x25,0x08,0x00,0x04,0xd9,0xac,0x62,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x01,0x03,0x18,0x21,0x94,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x4a,0x10,0x24,0x00,0x45,0x10,0x25,0x03,0xe0,0x00,0x08,0xa4,0x62,0x00,0x00,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x24,0x00,0x45,0x10,0x25,
+0xa0,0x62,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0x84,0x00,0x07,
+0x00,0x04,0x22,0x00,0x30,0xa5,0x00,0xff,0x00,0x85,0x28,0x21,0x3c,0x02,0xb0,0x0a,
+0x00,0xa2,0x40,0x21,0x30,0xc6,0x00,0xff,0x24,0x02,0x00,0x01,0x8f,0xa4,0x00,0x10,
+0x10,0xc2,0x00,0x14,0x24,0x02,0x00,0x02,0x00,0x04,0x50,0x27,0x10,0xc2,0x00,0x09,
+0x00,0xe4,0x48,0x24,0x3c,0x03,0xb0,0x0a,0x00,0xa3,0x18,0x21,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x4a,0x10,0x24,0x00,0x49,0x10,0x25,0x03,0xe0,0x00,0x08,
+0xac,0x62,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x00,0xa3,0x18,0x21,0x94,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x4a,0x10,0x24,0x00,0x49,0x10,0x25,0x03,0xe0,0x00,0x08,
+0xa4,0x62,0x00,0x00,0x91,0x02,0x00,0x00,0x00,0x04,0x18,0x27,0x00,0xe4,0x20,0x24,
+0x00,0x43,0x10,0x24,0x00,0x44,0x10,0x25,0x03,0xe0,0x00,0x08,0xa1,0x02,0x00,0x00,
+0x30,0xa9,0x00,0xff,0x27,0x83,0x94,0x50,0x30,0x85,0x00,0xff,0x24,0x02,0x00,0x01,
+0x00,0x07,0x50,0x27,0x00,0xc7,0x40,0x24,0x11,0x22,0x00,0x17,0x00,0xa3,0x18,0x21,
+0x00,0x05,0x20,0x40,0x27,0x82,0x94,0x50,0x00,0x05,0x28,0x80,0x27,0x83,0x94,0x58,
+0x00,0x83,0x50,0x21,0x00,0xa2,0x20,0x21,0x24,0x02,0x00,0x02,0x00,0x07,0x40,0x27,
+0x11,0x22,0x00,0x07,0x00,0xc7,0x28,0x24,0x8c,0x82,0x00,0x18,0x00,0x00,0x00,0x00,
+0x00,0x48,0x10,0x24,0x00,0x45,0x10,0x25,0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x18,
+0x95,0x42,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x48,0x10,0x24,0x00,0x45,0x10,0x25,
+0x03,0xe0,0x00,0x08,0xa5,0x42,0x00,0x02,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x4a,0x10,0x24,0x00,0x48,0x10,0x25,0x03,0xe0,0x00,0x08,0xa0,0x62,0x00,0x00,
+0x00,0x04,0x32,0x02,0x30,0xc6,0xff,0x00,0x00,0x04,0x16,0x02,0x00,0x04,0x1a,0x00,
+0x3c,0x05,0x00,0xff,0x00,0x65,0x18,0x24,0x00,0x46,0x10,0x25,0x00,0x43,0x10,0x25,
+0x00,0x04,0x26,0x00,0x03,0xe0,0x00,0x08,0x00,0x44,0x10,0x25,0x3c,0x02,0xb0,0x02,
+0x34,0x42,0x00,0x08,0x3c,0x03,0xb0,0x02,0xaf,0x82,0x8c,0x78,0xaf,0x83,0x8c,0x7c,
+0xa7,0x80,0x8c,0x80,0xa7,0x80,0x8c,0x82,0xaf,0x80,0x8c,0x84,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xd8,0xaf,0xbf,0x00,0x20,0x94,0x82,0x00,0x04,
+0x3c,0x05,0xff,0x8f,0x00,0x80,0x18,0x21,0x30,0x42,0xe0,0x00,0x14,0x40,0x00,0x0a,
+0x34,0xa5,0xff,0xff,0x90,0x84,0x00,0x02,0x00,0x00,0x00,0x00,0x30,0x84,0x00,0xfc,
+0x00,0x64,0x20,0x21,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa2,0x10,0x2b,
+0x10,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x20,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x0c,0x00,0x07,0xc9,0x00,0x00,0x00,0x00,
+0x08,0x00,0x05,0x4a,0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xd8,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,
+0x8f,0x90,0x94,0xa0,0x0c,0x00,0x31,0x0a,0x00,0x80,0x90,0x21,0x00,0x40,0x88,0x21,
+0x93,0x82,0x82,0x28,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x1b,0x24,0x02,0x00,0x01,
+0xa3,0x82,0x82,0x28,0x24,0x03,0x00,0x05,0x24,0x02,0x00,0x04,0xa3,0x83,0x8c,0x73,
+0xa3,0x82,0x8c,0x72,0xa7,0x80,0x82,0x2a,0x00,0x00,0x28,0x21,0x27,0x86,0x8c,0x70,
+0x00,0x05,0x10,0x80,0x00,0x46,0x10,0x21,0x8c,0x44,0x00,0x00,0x24,0xa3,0x00,0x01,
+0x30,0x65,0xff,0xff,0xae,0x04,0x00,0x00,0x10,0xa0,0xff,0xfa,0x00,0x05,0x10,0x80,
+0x8f,0x83,0x94,0xa0,0x97,0x82,0x94,0xa6,0x24,0x05,0x8f,0xff,0x24,0x63,0x00,0x04,
+0x00,0x65,0x18,0x24,0x26,0x04,0x00,0x04,0x24,0x42,0x00,0x04,0xaf,0x83,0x94,0xa0,
+0xa7,0x82,0x94,0xa6,0x00,0x85,0x80,0x24,0x97,0x84,0x82,0x2a,0x27,0x93,0x80,0x34,
+0x02,0x40,0x28,0x21,0x00,0x93,0x20,0x21,0x0c,0x00,0x31,0x8e,0x02,0x20,0x30,0x21,
+0x97,0x87,0x82,0x2a,0x24,0x02,0x00,0x52,0x00,0xf1,0x18,0x21,0xa7,0x83,0x82,0x2a,
+0x82,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x82,0x00,0x06,0x00,0x60,0x38,0x21,
+0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x28,0x82,0x43,0x00,0x01,0x24,0x02,0x00,0x54,0x14,0x62,0xff,0xf8,
+0x24,0x02,0x00,0x4c,0x82,0x43,0x00,0x02,0x00,0x00,0x00,0x00,0x14,0x62,0xff,0xf4,
+0x00,0x00,0x00,0x00,0x30,0xe6,0xff,0xff,0x10,0xc0,0x00,0x0c,0x00,0x00,0x28,0x21,
+0x02,0x60,0x48,0x21,0x24,0x08,0x8f,0xff,0x00,0xa9,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x24,0xa3,0x00,0x04,0x30,0x65,0xff,0xff,0x26,0x02,0x00,0x04,0x00,0xa6,0x18,0x2b,
+0xae,0x04,0x00,0x00,0x14,0x60,0xff,0xf8,0x00,0x48,0x80,0x24,0x97,0x83,0x94,0xa6,
+0x97,0x85,0x94,0xa4,0x3c,0x02,0xb0,0x02,0x00,0x67,0x18,0x21,0x00,0xa2,0x28,0x21,
+0x3c,0x04,0xb0,0x06,0xa7,0x83,0x94,0xa6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,
+0x8f,0x82,0x94,0xa0,0x8c,0x86,0x00,0x00,0x30,0xe5,0xff,0xff,0x24,0x03,0x8f,0xff,
+0x00,0x45,0x10,0x21,0x3c,0x04,0x0f,0x00,0x00,0x43,0x10,0x24,0x00,0xc4,0x30,0x24,
+0x3c,0x03,0x04,0x00,0xaf,0x82,0x94,0xa0,0x10,0xc3,0xff,0xd1,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x04,0x8e,0x00,0x00,0x00,0x00,0xa3,0x80,0x82,0x28,0x08,0x00,0x05,0x88,
+0x00,0x00,0x00,0x00,0x8f,0x82,0x8c,0x7c,0x97,0x83,0x8c,0x80,0x8f,0x87,0x8c,0x78,
+0x3c,0x06,0xff,0xff,0xac,0x43,0x00,0x00,0x8f,0x82,0x8c,0x7c,0x3c,0x03,0x80,0x00,
+0x24,0xe5,0x00,0x08,0xac,0x43,0x00,0x04,0x8f,0x82,0x8c,0x7c,0x34,0xc6,0x1f,0xff,
+0x3c,0x03,0x00,0x40,0x30,0x42,0x0f,0xff,0x3c,0x04,0xb0,0x06,0x00,0x02,0x10,0xc2,
+0x00,0x43,0x10,0x25,0x00,0xa6,0x28,0x24,0x34,0x84,0x80,0x18,0x27,0xbd,0xff,0xf8,
+0xac,0x82,0x00,0x00,0xaf,0x85,0x8c,0x78,0xaf,0x87,0x8c,0x7c,0xa7,0x80,0x8c,0x80,
+0xa7,0x80,0x8c,0x82,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x08,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe0,
+0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x8f,0x91,0x8c,0x78,
+0x00,0x80,0x80,0x21,0xaf,0xbf,0x00,0x1c,0x0c,0x00,0x06,0x78,0x00,0xa0,0x90,0x21,
+0x97,0x82,0x8c,0x80,0x36,0x10,0x12,0x00,0x26,0x2a,0x00,0x04,0x24,0x4c,0x00,0x14,
+0x2c,0x42,0x04,0x01,0x14,0x40,0x00,0x0a,0x24,0x09,0x8f,0xff,0x8f,0x82,0x80,0x20,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xaf,0x82,0x80,0x20,0x8f,0xbf,0x00,0x1c,
+0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,
+0x8e,0x44,0x00,0x1c,0x86,0x47,0x00,0x06,0x97,0x86,0x8c,0x82,0x8c,0x82,0x00,0x08,
+0x00,0x07,0x3c,0x00,0x8f,0x85,0x8c,0x78,0x00,0x02,0x11,0x02,0x30,0x42,0x40,0x00,
+0x02,0x02,0x80,0x25,0xae,0x30,0x00,0x00,0x8c,0x82,0x00,0x04,0x82,0x43,0x00,0x15,
+0x01,0x49,0x88,0x24,0x00,0x02,0x14,0xc2,0x00,0x03,0x1a,0x00,0x00,0x02,0x14,0x00,
+0x00,0x62,0x80,0x25,0xae,0x30,0x00,0x00,0x92,0x43,0x00,0x13,0x92,0x44,0x00,0x10,
+0x96,0x50,0x00,0x1a,0x00,0x03,0x1c,0x00,0x00,0x04,0x26,0x00,0x02,0x03,0x80,0x25,
+0x26,0x22,0x00,0x04,0x00,0x49,0x88,0x24,0x02,0x04,0x80,0x25,0xae,0x30,0x00,0x00,
+0x92,0x42,0x00,0x0f,0x92,0x43,0x00,0x11,0x26,0x24,0x00,0x04,0x00,0x02,0x12,0x00,
+0x00,0x89,0x88,0x24,0x00,0x62,0x80,0x25,0x02,0x07,0x80,0x25,0x26,0x22,0x00,0x04,
+0xae,0x30,0x00,0x00,0x00,0x49,0x88,0x24,0xae,0x20,0x00,0x00,0x8f,0x82,0x80,0x1c,
+0x24,0xc6,0x00,0x01,0x24,0xa5,0x00,0x14,0x30,0xc8,0xff,0xff,0x3c,0x0b,0xb0,0x03,
+0x00,0xa9,0x28,0x24,0x24,0x42,0x00,0x01,0x2d,0x08,0x00,0x0a,0xaf,0x85,0x8c,0x78,
+0xa7,0x8c,0x8c,0x80,0xaf,0x82,0x80,0x1c,0xa7,0x86,0x8c,0x82,0x11,0x00,0x00,0x07,
+0x35,0x6b,0x01,0x08,0x8f,0x82,0x8c,0x84,0x8d,0x63,0x00,0x00,0x24,0x42,0x04,0x00,
+0x00,0x62,0x18,0x2b,0x14,0x60,0xff,0xc1,0x00,0x00,0x00,0x00,0x0c,0x00,0x05,0xbd,
+0x00,0x00,0x00,0x00,0x08,0x00,0x05,0xf3,0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe8,
+0xaf,0xbf,0x00,0x10,0x0c,0x00,0x06,0x78,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x10,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x27,0xbd,0xff,0xe0,
+0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x1c,
+0x8f,0x90,0x8c,0x78,0x0c,0x00,0x06,0x78,0x00,0x80,0x90,0x21,0x97,0x82,0x8c,0x80,
+0x24,0x11,0x8f,0xff,0x2c,0x42,0x04,0x01,0x14,0x40,0x00,0x06,0x26,0x03,0x00,0x04,
+0x8f,0xbf,0x00,0x1c,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x24,0x02,0x0e,0x03,0xae,0x02,0x00,0x00,0x00,0x71,0x80,0x24,
+0xae,0x00,0x00,0x00,0x8e,0x44,0x00,0x08,0x26,0x02,0x00,0x04,0x0c,0x00,0x06,0x86,
+0x00,0x51,0x80,0x24,0x97,0x86,0x8c,0x82,0x8f,0x83,0x8c,0x78,0xae,0x02,0x00,0x00,
+0x97,0x82,0x8c,0x80,0x24,0xc6,0x00,0x01,0x8e,0x47,0x00,0x0c,0x24,0x63,0x00,0x10,
+0x30,0xc5,0xff,0xff,0x26,0x04,0x00,0x04,0x3c,0x08,0xb0,0x03,0x00,0x71,0x18,0x24,
+0x00,0x91,0x80,0x24,0x24,0x42,0x00,0x10,0x2c,0xa5,0x00,0x0a,0x35,0x08,0x01,0x08,
+0xae,0x07,0x00,0x00,0xaf,0x83,0x8c,0x78,0xa7,0x82,0x8c,0x80,0xa7,0x86,0x8c,0x82,
+0x10,0xa0,0x00,0x07,0x00,0x00,0x00,0x00,0x8f,0x82,0x8c,0x84,0x8d,0x03,0x00,0x00,
+0x24,0x42,0x04,0x00,0x00,0x62,0x18,0x2b,0x14,0x60,0xff,0xd9,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x05,0xbd,0x00,0x00,0x00,0x00,0x08,0x00,0x06,0x4c,0x00,0x00,0x00,0x00,
+0x97,0x82,0x8c,0x82,0x3c,0x03,0xb0,0x03,0x14,0x40,0x00,0x09,0x34,0x63,0x01,0x08,
+0x8c,0x62,0x00,0x00,0x8f,0x83,0x8c,0x7c,0xa7,0x80,0x8c,0x80,0xaf,0x82,0x8c,0x84,
+0xac,0x60,0x00,0x00,0x8f,0x82,0x8c,0x7c,0x00,0x00,0x00,0x00,0xac,0x40,0x00,0x04,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x32,0x02,0x30,0xc6,0xff,0x00,
+0x00,0x04,0x16,0x02,0x00,0x04,0x1a,0x00,0x3c,0x05,0x00,0xff,0x00,0x65,0x18,0x24,
+0x00,0x46,0x10,0x25,0x00,0x43,0x10,0x25,0x00,0x04,0x26,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x44,0x10,0x25,0x80,0x82,0x00,0x00,0x90,0x83,0x00,0x00,0x10,0x40,0x00,0x0c,
+0x00,0x80,0x28,0x21,0x24,0x62,0xff,0x9f,0x30,0x42,0x00,0xff,0x2c,0x42,0x00,0x1a,
+0x10,0x40,0x00,0x02,0x24,0x63,0xff,0xe0,0xa0,0xa3,0x00,0x00,0x24,0xa5,0x00,0x01,
+0x90,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xf6,0x00,0x40,0x18,0x21,
+0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x80,0x82,0x00,0x00,0x90,0x83,0x00,0x00,
+0x10,0x40,0x00,0x0c,0x00,0x80,0x28,0x21,0x24,0x62,0xff,0xbf,0x30,0x42,0x00,0xff,
+0x2c,0x42,0x00,0x1a,0x10,0x40,0x00,0x02,0x24,0x63,0x00,0x20,0xa0,0xa3,0x00,0x00,
+0x24,0xa5,0x00,0x01,0x90,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xf6,
+0x00,0x40,0x18,0x21,0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x27,0xbd,0xff,0xe8,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0x24,0x10,0xff,0xff,0x0c,0x00,0x2e,0x4a,
+0x00,0x00,0x00,0x00,0x10,0x50,0xff,0xfd,0x00,0x02,0x16,0x00,0x00,0x02,0x16,0x03,
+0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x27,0xbd,0xff,0xc8,0xaf,0xb3,0x00,0x1c,0x00,0x00,0x98,0x21,0xaf,0xb1,0x00,0x14,
+0x02,0x65,0x88,0x2b,0xaf,0xb6,0x00,0x28,0xaf,0xb5,0x00,0x24,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x34,0xaf,0xbe,0x00,0x30,0xaf,0xb7,0x00,0x2c,0xaf,0xb4,0x00,0x20,
+0xaf,0xb2,0x00,0x18,0x00,0xa0,0xb0,0x21,0xaf,0xa4,0x00,0x38,0x00,0xc0,0xa8,0x21,
+0x12,0x20,0x00,0x17,0x00,0x80,0x80,0x21,0x24,0x17,0xff,0xff,0x24,0x1e,0x00,0x0a,
+0x0c,0x00,0x2e,0x4a,0x00,0x00,0x00,0x00,0x10,0x57,0x00,0x0f,0x00,0x02,0x16,0x00,
+0x00,0x02,0x26,0x03,0x10,0x9e,0x00,0x0e,0x24,0x02,0x00,0x0d,0x10,0x82,0x00,0x34,
+0x24,0x02,0x00,0x08,0x10,0x82,0x00,0x25,0x24,0x02,0x00,0x09,0x10,0x82,0x00,0x13,
+0x00,0x00,0x90,0x21,0xa2,0x04,0x00,0x00,0x26,0x73,0x00,0x01,0x16,0xa0,0x00,0x0b,
+0x26,0x10,0x00,0x01,0x02,0x76,0x88,0x2b,0x16,0x20,0xff,0xed,0x00,0x00,0x00,0x00,
+0x7b,0xbe,0x01,0xbc,0x7b,0xb6,0x01,0x7c,0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0x0c,0x00,0x2e,0x3d,
+0x02,0x76,0x88,0x2b,0x08,0x00,0x06,0xe6,0x00,0x00,0x00,0x00,0x24,0x14,0x00,0x20,
+0xa2,0x14,0x00,0x00,0x26,0x52,0x00,0x01,0x24,0x04,0x00,0x20,0x26,0x73,0x00,0x01,
+0x16,0xa0,0x00,0x06,0x26,0x10,0x00,0x01,0x2a,0x42,0x00,0x08,0x10,0x40,0xff,0xea,
+0x02,0x76,0x88,0x2b,0x08,0x00,0x06,0xf5,0xa2,0x14,0x00,0x00,0x0c,0x00,0x2e,0x3d,
+0x00,0x00,0x00,0x00,0x08,0x00,0x06,0xfb,0x2a,0x42,0x00,0x08,0x8f,0xa2,0x00,0x38,
+0x00,0x00,0x00,0x00,0x12,0x02,0xff,0xe0,0x00,0x00,0x00,0x00,0x26,0x10,0xff,0xff,
+0x12,0xa0,0xff,0xdc,0x26,0x73,0xff,0xff,0x0c,0x00,0x2e,0x3d,0x24,0x04,0x00,0x08,
+0x0c,0x00,0x2e,0x3d,0x24,0x04,0x00,0x20,0x08,0x00,0x06,0xef,0x24,0x04,0x00,0x08,
+0x08,0x00,0x06,0xe8,0xa2,0x00,0x00,0x00,0x90,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0x1e,0x00,0x10,0x60,0x00,0x16,0x00,0x00,0x30,0x21,0x24,0x07,0x00,0x20,
+0x00,0x03,0x1e,0x03,0x10,0x67,0x00,0x17,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x15,
+0x00,0x00,0x00,0x00,0x10,0x67,0x00,0x0b,0x24,0xc6,0x00,0x01,0x10,0x60,0x00,0x0a,
+0x00,0x02,0x1e,0x00,0x24,0x05,0x00,0x20,0x24,0x84,0x00,0x01,0x80,0x83,0x00,0x00,
+0x90,0x82,0x00,0x00,0x10,0x65,0x00,0x03,0x00,0x00,0x00,0x00,0x14,0x60,0xff,0xfa,
+0x00,0x00,0x00,0x00,0x00,0x02,0x1e,0x00,0x14,0x60,0xff,0xed,0x00,0x00,0x00,0x00,
+0x28,0xc3,0x00,0x08,0x24,0x02,0x00,0x07,0x00,0x43,0x30,0x0a,0x03,0xe0,0x00,0x08,
+0x00,0xc0,0x10,0x21,0x24,0x84,0x00,0x01,0x90,0x82,0x00,0x00,0x08,0x00,0x07,0x2a,
+0x00,0x02,0x1e,0x00,0x27,0xbd,0xff,0xe0,0xaf,0xb1,0x00,0x14,0x27,0x91,0x8c,0x88,
+0xaf,0xb0,0x00,0x10,0x24,0x06,0x00,0x20,0x00,0x80,0x80,0x21,0x00,0x00,0x28,0x21,
+0xaf,0xbf,0x00,0x18,0x0c,0x00,0x31,0x84,0x02,0x20,0x20,0x21,0x82,0x02,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x1f,0x00,0x00,0x30,0x21,0x02,0x20,0x20,0x21,
+0x24,0x09,0x00,0x20,0x24,0x08,0x00,0x20,0x24,0x07,0x00,0x08,0xac,0x90,0x00,0x00,
+0x82,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x49,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x08,0x24,0x03,0x00,0x20,0x26,0x10,0x00,0x01,0x82,0x02,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x43,0x00,0x03,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xfa,
+0x00,0x00,0x00,0x00,0xa2,0x00,0x00,0x00,0x26,0x10,0x00,0x01,0x82,0x02,0x00,0x00,
+0x92,0x03,0x00,0x00,0x10,0x48,0x00,0x0c,0x24,0x05,0x00,0x20,0x24,0xc6,0x00,0x01,
+0x10,0xc7,0x00,0x04,0x24,0x84,0x00,0x04,0x00,0x03,0x16,0x00,0x14,0x40,0xff,0xe7,
+0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x27,0x82,0x8c,0x88,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x26,0x10,0x00,0x01,0x82,0x02,0x00,0x00,
+0x92,0x03,0x00,0x00,0x10,0x45,0xff,0xfc,0x00,0x00,0x00,0x00,0x08,0x00,0x07,0x5c,
+0x24,0xc6,0x00,0x01,0x00,0x80,0x30,0x21,0x90,0x84,0x00,0x00,0x00,0x00,0x38,0x21,
+0x10,0x80,0x00,0x19,0x24,0xc6,0x00,0x01,0x24,0x82,0xff,0xd0,0x30,0x42,0x00,0xff,
+0x2c,0x43,0x00,0x0a,0x14,0x60,0x00,0x0c,0x00,0x07,0x19,0x00,0x24,0x83,0xff,0x9f,
+0x24,0x82,0xff,0xa9,0x24,0x88,0xff,0xc9,0x2c,0x63,0x00,0x06,0x24,0x84,0xff,0xbf,
+0x2c,0x84,0x00,0x06,0x14,0x60,0x00,0x03,0x30,0x42,0x00,0xff,0x10,0x80,0x00,0x0e,
+0x31,0x02,0x00,0xff,0x00,0x07,0x19,0x00,0x00,0x62,0x18,0x21,0x00,0x67,0x10,0x2b,
+0x14,0x40,0x00,0x07,0x00,0x00,0x20,0x21,0x90,0xc4,0x00,0x00,0x00,0x60,0x38,0x21,
+0x14,0x80,0xff,0xe9,0x24,0xc6,0x00,0x01,0xac,0xa7,0x00,0x00,0x24,0x04,0x00,0x01,
+0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x08,0x00,0x07,0x8c,0x00,0x00,0x20,0x21,
+0x00,0x00,0x20,0x21,0x27,0x85,0x94,0xc0,0x24,0x82,0x00,0x01,0x00,0x04,0x18,0x80,
+0x30,0x44,0x00,0xff,0x00,0x65,0x18,0x21,0x2c,0x82,0x00,0x0b,0x14,0x40,0xff,0xfa,
+0xac,0x60,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0xaf,0x84,0x8d,0x08,
+0xaf,0x85,0x8d,0x0c,0xaf,0x86,0x8d,0x10,0xaf,0x87,0x8d,0x14,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x8f,0x82,0x84,0x98,0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,
+0x2c,0x43,0x00,0x64,0x24,0x42,0x00,0x01,0x27,0x84,0x8c,0xa8,0xaf,0x82,0x84,0x98,
+0x10,0x60,0x00,0x05,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0xaf,0x80,0x84,0x98,0x0c,0x00,0x07,0xf6,
+0x00,0x00,0x00,0x00,0x00,0x40,0x18,0x21,0x28,0x44,0x00,0x08,0x24,0x02,0x00,0x07,
+0x10,0x62,0x00,0x08,0x00,0x00,0x00,0x00,0x14,0x80,0xff,0xf3,0x24,0x02,0x00,0x08,
+0x27,0x84,0x8c,0xa8,0x14,0x62,0xff,0xf0,0x00,0x00,0x00,0x00,0x0c,0x00,0x1a,0x95,
+0x00,0x00,0x00,0x00,0x27,0x84,0x8c,0xa8,0x0c,0x00,0x08,0x54,0x00,0x00,0x00,0x00,
+0x8f,0x83,0x84,0x9c,0x3c,0x04,0x80,0x01,0x00,0x60,0x28,0x21,0x24,0x63,0x00,0x01,
+0xaf,0x83,0x84,0x9c,0x0c,0x00,0x1a,0x82,0x24,0x84,0x04,0x90,0x08,0x00,0x07,0xaa,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xc0,0xaf,0xbf,0x00,0x38,0x8c,0x85,0x00,0x0c,
+0x8c,0x88,0x00,0x08,0x18,0xa0,0x00,0x0e,0x00,0x00,0x30,0x21,0x24,0x87,0x00,0x08,
+0x27,0xa9,0x00,0x10,0x00,0x06,0x10,0x80,0x00,0x06,0x19,0x00,0x00,0x49,0x10,0x21,
+0x14,0xc0,0x00,0x1f,0x00,0x83,0x18,0x21,0xaf,0xa7,0x00,0x10,0x24,0xc2,0x00,0x01,
+0x30,0x46,0x00,0xff,0x00,0xc5,0x18,0x2a,0x14,0x60,0xff,0xf7,0x00,0x06,0x10,0x80,
+0x29,0x02,0x00,0x0a,0x14,0x40,0x00,0x05,0x00,0x08,0x18,0x40,0x8f,0xbf,0x00,0x38,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,0x00,0x68,0x18,0x21,
+0x27,0x82,0x83,0x94,0x00,0x03,0x18,0xc0,0x00,0x62,0x18,0x21,0x8c,0x62,0x00,0x10,
+0x01,0x00,0x20,0x21,0x00,0x40,0xf8,0x09,0x27,0xa6,0x00,0x10,0x8f,0x83,0x84,0xb0,
+0x3c,0x04,0x80,0x01,0x00,0x60,0x28,0x21,0x24,0x63,0x00,0x01,0xaf,0x83,0x84,0xb0,
+0x0c,0x00,0x1a,0x82,0x24,0x84,0x04,0xa4,0x08,0x00,0x07,0xdf,0x00,0x00,0x00,0x00,
+0x08,0x00,0x07,0xd7,0xac,0x43,0x00,0x00,0x27,0xbd,0xff,0xe0,0xaf,0xb1,0x00,0x14,
+0xaf,0xbf,0x00,0x18,0x00,0x80,0x88,0x21,0x0c,0x00,0x1a,0xb9,0xaf,0xb0,0x00,0x10,
+0x00,0x40,0x20,0x21,0x24,0x02,0xff,0xff,0x10,0x82,0x00,0x1f,0x24,0x03,0x00,0x06,
+0x8f,0x85,0x84,0xc4,0x00,0x00,0x00,0x00,0x14,0xa0,0x00,0x0a,0x24,0x02,0x00,0x08,
+0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x3b,0x28,0x82,0x00,0x03,0x10,0x40,0x00,0x32,
+0x24,0x02,0x00,0x1b,0x24,0x02,0x00,0x01,0x10,0x82,0x00,0x13,0x24,0x03,0x00,0x08,
+0x24,0x02,0x00,0x08,0x10,0x82,0x00,0x23,0x24,0x02,0x00,0x0d,0x10,0x82,0x00,0x18,
+0x02,0x25,0x10,0x21,0x24,0xa3,0x00,0x01,0xa0,0x44,0x00,0x00,0xaf,0x83,0x84,0xc4,
+0x18,0x60,0x00,0x08,0x24,0x02,0x00,0x43,0x82,0x23,0x00,0x00,0x00,0x00,0x00,0x00,
+0x10,0x62,0x00,0x0a,0x00,0x00,0x00,0x00,0x30,0x84,0xff,0xff,0x0c,0x00,0x1a,0xb5,
+0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x06,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x00,0x60,0x10,0x21,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x3c,0x04,0x80,0x01,
+0x0c,0x00,0x1a,0x95,0x24,0x84,0x04,0xb8,0x08,0x00,0x08,0x1e,0x24,0x03,0x00,0x06,
+0xa0,0x40,0x00,0x00,0x24,0xa5,0x00,0x01,0xaf,0x85,0x84,0xc4,0x0c,0x00,0x1a,0xb5,
+0x24,0x04,0x00,0x0d,0x24,0x03,0x00,0x07,0xaf,0x80,0x84,0xc4,0x08,0x00,0x08,0x1e,
+0x00,0x00,0x00,0x00,0x18,0xa0,0xff,0xeb,0x24,0xa5,0xff,0xff,0xaf,0x85,0x84,0xc4,
+0x0c,0x00,0x1a,0xb5,0x24,0x04,0x00,0x08,0x0c,0x00,0x1a,0xb5,0x24,0x04,0x00,0x20,
+0x08,0x00,0x08,0x1b,0x24,0x04,0x00,0x08,0x14,0x82,0xff,0xd2,0x24,0x02,0x00,0x08,
+0x0c,0x00,0x07,0x90,0x00,0x00,0x00,0x00,0x8f,0x85,0x84,0xc4,0x08,0x00,0x08,0x0c,
+0x24,0x04,0x00,0x0d,0x0c,0x00,0x31,0x0a,0x02,0x20,0x20,0x21,0xaf,0x82,0x84,0xc4,
+0x04,0x40,0x00,0x0d,0x00,0x00,0x80,0x21,0x02,0x30,0x10,0x21,0x90,0x44,0x00,0x00,
+0x26,0x10,0x00,0x01,0x00,0x04,0x26,0x00,0x00,0x04,0x26,0x03,0x0c,0x00,0x1a,0xb5,
+0x30,0x84,0xff,0xff,0x8f,0x83,0x84,0xc4,0x00,0x00,0x00,0x00,0x00,0x70,0x18,0x2a,
+0x10,0x60,0xff,0xf6,0x02,0x30,0x10,0x21,0x08,0x00,0x08,0x2e,0x24,0x03,0x00,0x06,
+0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x27,0x83,0x8c,0xe8,0x24,0x02,0x00,0x07,
+0x24,0x42,0xff,0xff,0xac,0x60,0x00,0x00,0x04,0x41,0xff,0xfd,0x24,0x63,0x00,0x04,
+0x0c,0x00,0x08,0x66,0x00,0x00,0x00,0x00,0x8f,0x84,0x8c,0xe8,0x27,0x86,0x8c,0xe8,
+0x0c,0x00,0x08,0x83,0x00,0x40,0x28,0x21,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x27,0xbd,0xff,0xe0,0x00,0x80,0x28,0x21,
+0x27,0x84,0x8c,0xc8,0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x18,0x0c,0x00,0x31,0x9b,
+0xaf,0xb0,0x00,0x10,0x8f,0x85,0x83,0x34,0x27,0x84,0x8c,0xc8,0x0c,0x00,0x31,0x5f,
+0x00,0x00,0x88,0x21,0x10,0x40,0x00,0x0c,0x00,0x00,0x00,0x00,0x27,0x90,0x8c,0xe8,
+0x8f,0x85,0x83,0x34,0x00,0x00,0x20,0x21,0xae,0x02,0x00,0x00,0x0c,0x00,0x31,0x5f,
+0x26,0x31,0x00,0x01,0x26,0x10,0x00,0x04,0x10,0x40,0x00,0x03,0x2a,0x23,0x00,0x64,
+0x14,0x60,0xff,0xf7,0x00,0x00,0x00,0x00,0x02,0x20,0x10,0x21,0x8f,0xbf,0x00,0x18,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x27,0xbd,0xff,0xd0,
+0xaf,0xb6,0x00,0x28,0xaf,0xb5,0x00,0x24,0xaf,0xb4,0x00,0x20,0xaf,0xbf,0x00,0x2c,
+0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,
+0x00,0xa0,0xa8,0x21,0x00,0x80,0xa0,0x21,0x00,0xc0,0xb0,0x21,0x10,0xa0,0x00,0x1d,
+0x24,0x02,0x00,0x05,0x3c,0x02,0x80,0x00,0x24,0x43,0x2c,0x80,0x8f,0x82,0x83,0xa4,
+0x00,0x00,0x00,0x00,0x10,0x43,0x00,0x1e,0x00,0x00,0x88,0x21,0x00,0x60,0x98,0x21,
+0x00,0x00,0x90,0x21,0x27,0x90,0x83,0xa4,0x8e,0x05,0xff,0xec,0x02,0x80,0x20,0x21,
+0x0c,0x00,0x31,0xa3,0x26,0x10,0x00,0x18,0x10,0x40,0x00,0x06,0x02,0x51,0x18,0x21,
+0x8e,0x02,0x00,0x00,0x26,0x31,0x00,0x01,0x14,0x53,0xff,0xf7,0x00,0x11,0x90,0x40,
+0x02,0x51,0x18,0x21,0x27,0x82,0x83,0x94,0x00,0x03,0x18,0xc0,0x00,0x62,0x18,0x21,
+0x8c,0x62,0x00,0x10,0x02,0x20,0x20,0x21,0x02,0xa0,0x28,0x21,0x00,0x40,0xf8,0x09,
+0x02,0xc0,0x30,0x21,0x8f,0xbf,0x00,0x2c,0x8f,0xb6,0x00,0x28,0x7b,0xb4,0x01,0x3c,
+0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,
+0x08,0x00,0x08,0xa4,0x00,0x00,0x90,0x21,0x27,0xbd,0xff,0xc0,0xaf,0xb5,0x00,0x34,
+0xaf,0xb3,0x00,0x2c,0xaf,0xb1,0x00,0x24,0xaf,0xbf,0x00,0x38,0xaf,0xb4,0x00,0x30,
+0xaf,0xb2,0x00,0x28,0xaf,0xb0,0x00,0x20,0x00,0xc0,0x98,0x21,0x30,0xa5,0x00,0xff,
+0xac,0xc0,0x00,0x00,0x24,0x15,0x00,0x0a,0x00,0x00,0x88,0x21,0x27,0xa8,0x00,0x10,
+0x00,0x91,0x18,0x21,0x80,0x62,0x00,0x00,0x26,0x27,0x00,0x01,0x10,0x40,0x00,0x0c,
+0x01,0x11,0x30,0x21,0x90,0x63,0x00,0x00,0x30,0xf1,0x00,0xff,0x2e,0x22,0x00,0x0a,
+0x14,0x40,0xff,0xf7,0xa0,0xc3,0x00,0x00,0x8f,0xbf,0x00,0x38,0x7b,0xb4,0x01,0xbc,
+0x7b,0xb2,0x01,0x7c,0x7b,0xb0,0x01,0x3c,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,
+0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x23,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x1f,
+0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x1a,0x00,0x00,0x00,0x00,0x02,0x20,0x90,0x21,
+0x12,0x40,0xff,0xf1,0x00,0x00,0x88,0x21,0x27,0xb4,0x00,0x10,0x02,0x91,0x10,0x21,
+0x90,0x44,0x00,0x00,0x0c,0x00,0x09,0x0a,0x00,0x00,0x00,0x00,0x02,0x51,0x20,0x23,
+0x24,0x84,0xff,0xff,0x30,0x84,0x00,0xff,0x02,0xa0,0x28,0x21,0x0c,0x00,0x08,0xfb,
+0x00,0x40,0x80,0x21,0x02,0x02,0x00,0x18,0x8e,0x63,0x00,0x00,0x26,0x22,0x00,0x01,
+0x30,0x51,0x00,0xff,0x02,0x32,0x20,0x2b,0x00,0x00,0x80,0x12,0x00,0x70,0x18,0x21,
+0x14,0x80,0xff,0xee,0xae,0x63,0x00,0x00,0x08,0x00,0x08,0xce,0x00,0x00,0x00,0x00,
+0x80,0x82,0x00,0x00,0x08,0x00,0x08,0xce,0xae,0x62,0x00,0x00,0x08,0x00,0x08,0xdb,
+0x24,0x15,0x00,0x10,0x08,0x00,0x08,0xdb,0x24,0x15,0x00,0x0a,0x30,0x84,0x00,0xff,
+0x30,0xa5,0x00,0xff,0x24,0x06,0x00,0x01,0x10,0x80,0x00,0x09,0x00,0x00,0x10,0x21,
+0x00,0xc5,0x00,0x18,0x24,0x42,0x00,0x01,0x30,0x42,0x00,0xff,0x00,0x44,0x18,0x2b,
+0x00,0x00,0x30,0x12,0x00,0x00,0x00,0x00,0x14,0x60,0xff,0xfa,0x00,0xc5,0x00,0x18,
+0x03,0xe0,0x00,0x08,0x00,0xc0,0x10,0x21,0x30,0x84,0x00,0xff,0x24,0x83,0xff,0xd0,
+0x30,0x62,0x00,0xff,0x2c,0x42,0x00,0x0a,0x14,0x40,0x00,0x06,0x00,0x00,0x00,0x00,
+0x24,0x82,0xff,0xbf,0x2c,0x42,0x00,0x06,0x14,0x40,0x00,0x02,0x24,0x83,0xff,0xc9,
+0x24,0x83,0xff,0xa9,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,0x27,0xbd,0xff,0xc8,
+0x24,0x02,0x00,0x01,0xaf,0xbf,0x00,0x30,0xaf,0xb5,0x00,0x2c,0xaf,0xb4,0x00,0x28,
+0xaf,0xb3,0x00,0x24,0xaf,0xb2,0x00,0x20,0xaf,0xb1,0x00,0x1c,0x10,0xa2,0x00,0x3e,
+0xaf,0xb0,0x00,0x18,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x08,0x24,0x05,0x00,0x01,
+0x00,0x00,0x10,0x21,0x8f,0xbf,0x00,0x30,0x7b,0xb4,0x01,0x7c,0x7b,0xb2,0x01,0x3c,
+0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0x8c,0xc4,0x00,0x04,
+0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x10,0x8f,0xa2,0x00,0x10,0x00,0x00,0x00,0x00,
+0x28,0x42,0x00,0x65,0x14,0x40,0x00,0x06,0x00,0x00,0x00,0x00,0x3c,0x04,0x80,0x01,
+0x0c,0x00,0x1a,0x95,0x24,0x84,0x04,0xbc,0x08,0x00,0x09,0x25,0x24,0x02,0x00,0x01,
+0x3c,0x04,0x80,0x01,0x0c,0x00,0x1a,0x95,0x24,0x84,0x04,0xc8,0x8f,0x83,0x83,0xa4,
+0x3c,0x02,0x80,0x00,0x24,0x42,0x2c,0x80,0x10,0x62,0xff,0xe5,0x00,0x40,0x90,0x21,
+0x3c,0x13,0x80,0x01,0x27,0x95,0x83,0x90,0x3c,0x14,0x80,0x01,0x27,0x90,0x83,0x94,
+0x00,0x00,0x88,0x21,0x8e,0x03,0x00,0x08,0x8f,0xa2,0x00,0x10,0x00,0x00,0x00,0x00,
+0x10,0x62,0x00,0x08,0x26,0x64,0x04,0xd4,0x26,0x10,0x00,0x18,0x8e,0x02,0x00,0x10,
+0x00,0x00,0x00,0x00,0x14,0x52,0xff,0xf7,0x26,0x31,0x00,0x18,0x08,0x00,0x09,0x25,
+0x00,0x00,0x10,0x21,0x0c,0x00,0x1a,0x95,0x00,0x00,0x00,0x00,0x02,0x35,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x0c,0x00,0x1a,0x95,0x00,0x00,0x00,0x00,0x0c,0x00,0x1a,0x95,
+0x26,0x84,0x04,0xd8,0x8e,0x04,0x00,0x00,0x0c,0x00,0x1a,0x95,0x26,0x10,0x00,0x18,
+0x08,0x00,0x09,0x4b,0x00,0x00,0x00,0x00,0x3c,0x04,0x80,0x01,0x0c,0x00,0x1a,0x95,
+0x24,0x84,0x04,0xdc,0x3c,0x04,0x80,0x01,0x0c,0x00,0x1a,0x82,0x24,0x84,0x04,0xec,
+0x24,0x11,0x00,0x05,0x3c,0x12,0x80,0x01,0x27,0x90,0x88,0x0e,0x86,0x05,0x00,0x00,
+0x26,0x44,0x05,0x0c,0x0c,0x00,0x1a,0x82,0x26,0x31,0xff,0xff,0x06,0x21,0xff,0xfb,
+0x26,0x10,0xff,0xfe,0x08,0x00,0x09,0x25,0x00,0x00,0x10,0x21,0x27,0xbd,0xff,0xd0,
+0x28,0xa2,0x00,0x02,0xaf,0xb1,0x00,0x1c,0xaf,0xb0,0x00,0x18,0xaf,0xbf,0x00,0x2c,
+0xaf,0xb4,0x00,0x28,0xaf,0xb3,0x00,0x24,0xaf,0xb2,0x00,0x20,0x00,0xa0,0x80,0x21,
+0x14,0x40,0x00,0x51,0x00,0xc0,0x88,0x21,0x8c,0xc4,0x00,0x04,0x24,0x05,0x00,0x02,
+0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x10,0x24,0x02,0x00,0x02,0x12,0x02,0x00,0x48,
+0x24,0x05,0x00,0x01,0x8e,0x24,0x00,0x08,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x14,
+0x8f,0xa2,0x00,0x14,0x00,0x00,0x00,0x00,0x30,0x42,0x0f,0xff,0xaf,0xa2,0x00,0x14,
+0x7b,0xa4,0x00,0xbc,0x0c,0x00,0x0a,0x06,0x24,0x06,0x00,0x04,0x24,0x03,0x00,0x04,
+0x10,0x43,0x00,0x2a,0x24,0x04,0x00,0x04,0x8f,0xa2,0x00,0x10,0x3c,0x04,0x80,0x01,
+0x24,0x84,0x05,0x10,0x00,0x02,0x19,0x02,0x00,0x03,0x81,0x00,0x8f,0xa3,0x00,0x14,
+0x00,0x50,0x10,0x23,0x00,0x02,0x10,0x82,0x00,0x62,0x18,0x21,0x0c,0x00,0x1a,0x95,
+0xaf,0xa3,0x00,0x14,0x3c,0x04,0x80,0x01,0x0c,0x00,0x1a,0x95,0x24,0x84,0x05,0x38,
+0x8f,0xa2,0x00,0x14,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x17,0x00,0x00,0x88,0x21,
+0x3c,0x13,0x80,0x01,0x3c,0x12,0x80,0x01,0x3c,0x14,0x80,0x01,0x0c,0x00,0x2e,0xda,
+0x24,0x04,0x27,0x10,0x32,0x23,0x00,0x03,0x02,0x00,0x28,0x21,0x10,0x60,0x00,0x1c,
+0x26,0x64,0x05,0x64,0x8f,0xa2,0x00,0x10,0x00,0x00,0x00,0x00,0x02,0x02,0x10,0x23,
+0x28,0x42,0xff,0xfd,0x10,0x40,0x00,0x10,0x26,0x44,0x05,0x70,0x0c,0x00,0x1a,0x95,
+0x26,0x10,0x00,0x04,0x8f,0xa2,0x00,0x14,0x26,0x31,0x00,0x01,0x02,0x22,0x10,0x2b,
+0x14,0x40,0xff,0xee,0x00,0x00,0x00,0x00,0x00,0x00,0x20,0x21,0x8f,0xbf,0x00,0x2c,
+0x8f,0xb4,0x00,0x28,0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x00,0x80,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,0x8e,0x05,0x00,0x00,0x26,0x84,0x05,0x74,
+0x0c,0x00,0x1a,0x82,0x26,0x10,0x00,0x04,0x08,0x00,0x09,0xb1,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x1a,0x82,0x00,0x00,0x00,0x00,0x08,0x00,0x09,0xa9,0x00,0x00,0x00,0x00,
+0x08,0x00,0x09,0x87,0x24,0x02,0x00,0x01,0x0c,0x00,0x0b,0x2b,0x00,0x00,0x00,0x00,
+0x08,0x00,0x09,0xb7,0x24,0x04,0x00,0x04,0x27,0xbd,0xff,0xd0,0x28,0xa2,0x00,0x03,
+0xaf,0xb1,0x00,0x24,0xaf,0xb0,0x00,0x20,0xaf,0xbf,0x00,0x28,0x00,0xa0,0x88,0x21,
+0x10,0x40,0x00,0x09,0x00,0xc0,0x80,0x21,0x0c,0x00,0x0b,0x2b,0x00,0x00,0x00,0x00,
+0x24,0x04,0x00,0x04,0x8f,0xbf,0x00,0x28,0x7b,0xb0,0x01,0x3c,0x00,0x80,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,0x8c,0xc4,0x00,0x04,0x24,0x05,0x00,0x02,
+0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x10,0x8e,0x04,0x00,0x08,0x24,0x05,0x00,0x02,
+0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x14,0x24,0x02,0x00,0x03,0x12,0x22,0x00,0x1b,
+0x24,0x05,0x00,0x01,0x8e,0x04,0x00,0x0c,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x18,
+0x8f,0xa4,0x00,0x10,0x8f,0xa5,0x00,0x18,0x0c,0x00,0x0a,0x06,0x24,0x06,0x00,0x04,
+0x24,0x03,0x00,0x04,0x10,0x43,0xff,0xe7,0x24,0x04,0x00,0x04,0x8f,0xa2,0x00,0x18,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0b,0x00,0x00,0x28,0x21,0x8f,0xa2,0x00,0x10,
+0x8f,0xa4,0x00,0x14,0x24,0xa5,0x00,0x01,0xac,0x44,0x00,0x00,0x8f,0xa3,0x00,0x10,
+0x8f,0xa2,0x00,0x18,0x24,0x63,0x00,0x04,0x00,0xa2,0x10,0x2b,0x14,0x40,0xff,0xf7,
+0xaf,0xa3,0x00,0x10,0x08,0x00,0x09,0xd9,0x00,0x00,0x20,0x21,0x24,0x02,0x00,0x01,
+0x08,0x00,0x09,0xec,0xaf,0xa2,0x00,0x18,0x30,0xc6,0x00,0xff,0x00,0xa6,0x00,0x18,
+0x00,0x00,0x28,0x12,0x04,0x81,0x00,0x07,0x00,0x00,0x30,0x21,0x3c,0x02,0x80,0x01,
+0x00,0x85,0x18,0x21,0x34,0x42,0x7f,0xff,0x00,0x43,0x10,0x2b,0x10,0x40,0x00,0x0b,
+0x3c,0x02,0xb0,0x03,0x3c,0x02,0xaf,0xff,0x34,0x42,0xff,0xff,0x00,0x44,0x10,0x2b,
+0x10,0x40,0x00,0x17,0x3c,0x02,0xb0,0x0a,0x00,0x85,0x18,0x21,0x34,0x42,0xff,0xff,
+0x00,0x43,0x10,0x2b,0x14,0x40,0x00,0x12,0x3c,0x02,0xb0,0x03,0x34,0x42,0xff,0xff,
+0x00,0x44,0x10,0x2b,0x10,0x40,0x00,0x06,0x3c,0x02,0xb0,0x07,0x3c,0x02,0xb0,0x04,
+0x34,0x42,0xff,0xff,0x00,0x43,0x10,0x2b,0x10,0x40,0x00,0x09,0x3c,0x02,0xb0,0x07,
+0x34,0x42,0x00,0x3f,0x00,0x44,0x10,0x2b,0x10,0x40,0x00,0x06,0x3c,0x02,0xb0,0x07,
+0x34,0x42,0xff,0xff,0x00,0x43,0x10,0x2b,0x14,0x40,0x00,0x02,0x00,0x00,0x00,0x00,
+0x24,0x06,0x00,0x01,0x14,0xc0,0x00,0x11,0x24,0x02,0x00,0x04,0x3c,0x02,0xb0,0x08,
+0x34,0x42,0x0f,0xff,0x00,0x44,0x10,0x2b,0x14,0x40,0x00,0x08,0x3c,0x02,0x4f,0xf7,
+0x00,0x85,0x20,0x21,0x34,0x42,0xf0,0x00,0x00,0x82,0x20,0x21,0x34,0x03,0xef,0xff,
+0x00,0x64,0x18,0x2b,0x14,0x60,0x00,0x02,0x00,0x00,0x00,0x00,0x24,0x06,0x00,0x02,
+0x10,0xc0,0x00,0x02,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x04,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe0,0x24,0x02,0x00,0x02,0xaf,0xb0,0x00,0x18,
+0xaf,0xbf,0x00,0x1c,0x10,0xa2,0x00,0x23,0x00,0xc0,0x80,0x21,0x28,0xa2,0x00,0x03,
+0x10,0x40,0x00,0x0c,0x24,0x02,0x00,0x03,0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x04,
+0x00,0x00,0x18,0x21,0x0c,0x00,0x0b,0x2b,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x21,
+0x8f,0xbf,0x00,0x1c,0x8f,0xb0,0x00,0x18,0x00,0x60,0x10,0x21,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x14,0xa2,0xff,0xf7,0x24,0x05,0x00,0x01,0x8c,0xc4,0x00,0x04,
+0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x10,0x8e,0x04,0x00,0x08,0x24,0x05,0x00,0x02,
+0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x14,0x8f,0xa4,0x00,0x10,0x00,0x00,0x00,0x00,
+0x2c,0x82,0x00,0x0b,0x10,0x40,0xff,0xee,0x24,0x03,0x00,0x04,0x00,0x04,0x10,0x80,
+0x8f,0xa4,0x00,0x14,0x27,0x83,0x94,0xc0,0x00,0x43,0x10,0x21,0x08,0x00,0x0a,0x4f,
+0xac,0x44,0x00,0x00,0x8c,0xc4,0x00,0x04,0x24,0x05,0x00,0x01,0x0c,0x00,0x08,0xb6,
+0x27,0xa6,0x00,0x10,0x8f,0xa5,0x00,0x10,0x27,0x83,0x94,0xc0,0x3c,0x04,0x80,0x01,
+0x00,0x05,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x46,0x00,0x00,0x0c,0x00,0x1a,0x82,
+0x24,0x84,0x05,0x7c,0x08,0x00,0x0a,0x50,0x00,0x00,0x18,0x21,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xb8,0x28,0xa5,0x00,0x04,0xaf,0xb0,0x00,0x20,
+0xaf,0xbf,0x00,0x40,0xaf,0xb7,0x00,0x3c,0xaf,0xb6,0x00,0x38,0xaf,0xb5,0x00,0x34,
+0xaf,0xb4,0x00,0x30,0xaf,0xb3,0x00,0x2c,0xaf,0xb2,0x00,0x28,0xaf,0xb1,0x00,0x24,
+0x10,0xa0,0x00,0x0b,0x00,0xc0,0x80,0x21,0x0c,0x00,0x0b,0x2b,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x04,0x8f,0xbf,0x00,0x40,0x7b,0xb6,0x01,0xfc,0x7b,0xb4,0x01,0xbc,
+0x7b,0xb2,0x01,0x7c,0x7b,0xb0,0x01,0x3c,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x48,
+0x8c,0xc4,0x00,0x04,0x24,0x05,0x00,0x01,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x10,
+0x8e,0x04,0x00,0x08,0x24,0x05,0x00,0x01,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x14,
+0x8e,0x04,0x00,0x0c,0x24,0x05,0x00,0x01,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x18,
+0x8f,0xa3,0x00,0x18,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x3a,0x24,0x02,0x00,0x01,
+0x10,0x62,0x00,0x33,0x3c,0x04,0x80,0x01,0x97,0xb0,0x00,0x12,0x8f,0xa2,0x00,0x14,
+0x00,0x00,0x00,0x00,0x02,0x02,0x10,0x2b,0x10,0x40,0xff,0xe2,0x3c,0x15,0x80,0x01,
+0x3c,0x02,0x80,0x01,0x24,0x52,0x05,0xbc,0x3c,0x14,0xb0,0x06,0x24,0x13,0x00,0x01,
+0x3c,0x17,0xb0,0x08,0x3c,0x16,0x80,0x01,0x32,0x02,0x00,0x01,0x02,0x00,0x28,0x21,
+0x10,0x40,0x00,0x1f,0x26,0xa4,0x05,0xb0,0x8f,0xa3,0x00,0x18,0x00,0x10,0x10,0xc0,
+0x00,0x54,0x10,0x21,0x10,0x60,0x00,0x14,0x02,0x40,0x20,0x21,0x00,0x10,0x10,0xc0,
+0x00,0x57,0x10,0x21,0x10,0x73,0x00,0x09,0x26,0xc4,0x05,0xc4,0x8f,0xa2,0x00,0x14,
+0x26,0x03,0x00,0x01,0x30,0x70,0xff,0xff,0x02,0x02,0x10,0x2b,0x14,0x40,0xff,0xee,
+0x00,0x00,0x00,0x00,0x08,0x00,0x0a,0x8d,0x00,0x00,0x00,0x00,0x8c,0x51,0x00,0x00,
+0x00,0x00,0x00,0x00,0x32,0x25,0x00,0xff,0x0c,0x00,0x1a,0x82,0x00,0x00,0x00,0x00,
+0x08,0x00,0x0a,0xbf,0x00,0x00,0x00,0x00,0x8c,0x51,0x00,0x00,0x0c,0x00,0x1a,0x82,
+0x00,0x11,0x2c,0x02,0x32,0x25,0x00,0xff,0x08,0x00,0x0a,0xca,0x02,0x40,0x20,0x21,
+0x0c,0x00,0x1a,0x82,0x00,0x00,0x00,0x00,0x08,0x00,0x0a,0xb6,0x00,0x00,0x00,0x00,
+0x24,0x84,0x05,0x90,0x0c,0x00,0x1a,0x95,0x00,0x00,0x00,0x00,0x08,0x00,0x0a,0xa6,
+0x00,0x00,0x00,0x00,0x3c,0x04,0x80,0x01,0x08,0x00,0x0a,0xd9,0x24,0x84,0x05,0xd0,
+0x00,0xa0,0x10,0x21,0x27,0xbd,0xff,0xd8,0x28,0x42,0x00,0x04,0xaf,0xb0,0x00,0x20,
+0xaf,0xbf,0x00,0x24,0x00,0xc0,0x80,0x21,0x24,0x05,0x00,0x01,0x10,0x40,0x00,0x08,
+0x27,0xa6,0x00,0x10,0x0c,0x00,0x0b,0x2b,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x04,
+0x8f,0xbf,0x00,0x24,0x8f,0xb0,0x00,0x20,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,
+0x8e,0x04,0x00,0x04,0x0c,0x00,0x08,0xb6,0x00,0x00,0x00,0x00,0x8e,0x04,0x00,0x08,
+0x24,0x05,0x00,0x01,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x14,0x8e,0x04,0x00,0x0c,
+0x24,0x05,0x00,0x01,0x0c,0x00,0x08,0xb6,0x27,0xa6,0x00,0x18,0x08,0x00,0x0a,0xec,
+0x24,0x02,0x00,0x01,0x24,0x03,0x00,0x01,0x00,0x65,0x10,0x2a,0x27,0xbd,0xff,0xd8,
+0x00,0xa0,0x40,0x21,0x10,0x40,0x00,0x0b,0x00,0xc0,0x38,0x21,0x00,0x03,0x20,0x80,
+0x00,0x87,0x10,0x21,0x8c,0x45,0x00,0x00,0x24,0x63,0x00,0x01,0x30,0x63,0x00,0xff,
+0x8c,0xa6,0x00,0x00,0x00,0x9d,0x20,0x21,0x00,0x68,0x10,0x2a,0x14,0x40,0xff,0xf7,
+0xac,0x86,0xff,0xfc,0x8f,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x0b,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0x62,0x00,0x03,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x93,0xa2,0x00,0x07,0x00,0x00,0x00,0x00,
+0xa3,0x82,0x87,0x6c,0x08,0x00,0x0b,0x14,0x00,0x00,0x00,0x00,0x93,0xa2,0x00,0x07,
+0x00,0x00,0x00,0x00,0xa3,0x82,0x94,0xb0,0x08,0x00,0x0b,0x14,0x00,0x00,0x00,0x00,
+0x27,0xbd,0xff,0xe8,0x3c,0x04,0x80,0x01,0xaf,0xbf,0x00,0x10,0x18,0xa0,0x00,0x03,
+0x24,0x84,0x05,0xf8,0x0c,0x00,0x1a,0x95,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x10,
+0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x27,0xbd,0xff,0xe8,
+0xaf,0xb0,0x00,0x10,0x00,0x80,0x80,0x21,0x3c,0x04,0x80,0x01,0xaf,0xbf,0x00,0x14,
+0x0c,0x00,0x1a,0x95,0x24,0x84,0x06,0x0c,0x00,0x10,0x10,0x40,0x00,0x50,0x10,0x21,
+0x27,0x83,0x83,0x90,0x00,0x02,0x10,0xc0,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x08,
+0x0c,0x00,0x1a,0x95,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x2c,0xf8,0x3c,0x04,0xb0,0x03,0xac,0x62,0x00,0x00,
+0x34,0x84,0x00,0x2c,0x8c,0x86,0x00,0x00,0x3c,0x05,0xb0,0x0a,0x34,0xa5,0x1a,0x00,
+0x00,0x06,0x1a,0x02,0x30,0x63,0x0f,0xff,0x00,0x06,0x25,0x02,0x24,0x02,0xff,0xff,
+0xac,0xa2,0x00,0x00,0xa7,0x83,0xc5,0x4a,0xa7,0x84,0xc5,0x4c,0xa3,0x86,0xc5,0x48,
+0xa7,0x80,0xc5,0x40,0xa7,0x80,0xc5,0x42,0xa7,0x80,0xc5,0x44,0xa7,0x80,0xc5,0x46,
+0x00,0xa0,0x38,0x21,0x24,0x03,0x00,0x01,0x8c,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x0a,0x00,0x8c,0x45,0x00,0x00,
+0x3c,0x04,0xb0,0x0a,0x34,0x84,0x1a,0x00,0xa0,0x45,0x00,0x00,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x34,0x42,0x0a,0x00,0x3c,0x04,0xb0,0x0a,0xa0,0x45,0x00,0x00,0x34,0x84,0x1a,0x00,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x04,0xb0,0x03,0x34,0x63,0x01,0x08,
+0x34,0x84,0x01,0x18,0x8c,0x65,0x00,0x00,0x8c,0x82,0x00,0x00,0xaf,0x85,0xc5,0x50,
+0x30,0x42,0x02,0x00,0x10,0x40,0x00,0x06,0x3c,0x02,0x00,0x0f,0x3c,0x02,0x00,0x4c,
+0x34,0x42,0x4b,0x40,0xaf,0x82,0xc5,0x54,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x08,0x00,0x0b,0x79,0x34,0x42,0x42,0x40,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x2d,0xf8,0x30,0x84,0x00,0xff,0xac,0x62,0x00,0x00,
+0x14,0x80,0x02,0xb3,0x24,0x02,0x00,0x02,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x1b,0x40,
+0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x34,0x42,0x0b,0x40,0x8c,0x46,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x1b,0x48,
+0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x00,0x06,0x54,0x02,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x34,0x42,0x0b,0x48,0x8c,0x46,0x00,0x00,0x3c,0x03,0xb0,0x0a,
+0x34,0x63,0x1b,0x50,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,
+0x00,0x06,0x64,0x02,0x30,0xcb,0xff,0xff,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x0b,0x50,
+0x8c,0x46,0x00,0x00,0x97,0x84,0xc5,0x40,0x97,0x82,0xc5,0x42,0x97,0x83,0xc5,0x46,
+0x01,0x44,0x20,0x23,0x01,0x62,0x10,0x23,0x00,0x82,0x20,0x21,0x97,0x82,0xc5,0x44,
+0x30,0xcd,0xff,0xff,0x01,0xa3,0x18,0x23,0x01,0x82,0x10,0x23,0x00,0x82,0x20,0x21,
+0x93,0x82,0xc5,0x48,0x00,0x83,0x20,0x21,0x30,0x84,0xff,0xff,0x00,0x82,0x10,0x2b,
+0x10,0x40,0x00,0xec,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x18,0xa0,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xa0,
+0x8c,0x46,0x00,0x00,0x24,0x02,0x00,0x20,0x30,0xc8,0x00,0x7f,0x11,0x02,0x00,0x4d,
+0x2d,0x02,0x00,0x21,0x14,0x40,0x00,0x2b,0x24,0x02,0xff,0x80,0x00,0xc2,0x10,0x24,
+0x25,0x08,0xff,0xff,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x08,0xa0,0x00,0x48,0x30,0x25,
+0x3c,0x04,0xb0,0x0a,0xac,0x66,0x00,0x00,0x34,0x84,0x18,0xa0,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x34,0x42,0x08,0xb0,0x3c,0x04,0xb0,0x0a,0xac,0x46,0x00,0x00,0x34,0x84,0x18,0xb0,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xc0,0x3c,0x04,0xb0,0x0a,0xac,0x46,0x00,0x00,
+0x34,0x84,0x18,0xc0,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xd0,0x3c,0x04,0xb0,0x0a,
+0xac,0x46,0x00,0x00,0x34,0x84,0x18,0xd0,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x24,0x02,0x00,0x20,0x11,0x02,0x00,0x07,
+0x24,0x02,0xff,0xff,0xa7,0x8a,0xc5,0x40,0xa7,0x8b,0xc5,0x42,0xa7,0x8c,0xc5,0x44,
+0xa7,0x8d,0xc5,0x46,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,
+0x34,0x63,0x14,0x58,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x0a,0x34,0x63,0x04,0x58,0x8c,0x69,0x00,0x00,0x3c,0x02,0xff,0xff,
+0x34,0x42,0x3f,0xff,0x01,0x22,0x10,0x24,0x34,0x49,0x80,0x00,0x3c,0x04,0xb0,0x0a,
+0xac,0x69,0x00,0x00,0x34,0x84,0x14,0x58,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,0x08,0x00,0x0b,0xf9,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x58,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x58,
+0x8c,0x49,0x00,0x00,0x3c,0x04,0xb0,0x0a,0x34,0x84,0x14,0x58,0x35,0x29,0x40,0x00,
+0xac,0x49,0x00,0x00,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x24,0x02,0xff,0xff,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0xb0,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0xb0,
+0x8c,0x47,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0xb8,0x3c,0x05,0xb0,0x0a,
+0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x34,0xa5,0x14,0xb8,0x00,0x07,0x1e,0x02,
+0x24,0x04,0x00,0x01,0x8c,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x44,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0xb8,0x8c,0x47,0x00,0x00,0x00,0x03,0x1a,0x00,
+0x30,0xe2,0x00,0xff,0x00,0x62,0x18,0x25,0x2c,0x62,0x00,0x04,0x10,0x40,0x00,0x3a,
+0x2c,0x62,0x00,0x11,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x10,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x10,
+0x8c,0x47,0x00,0x00,0x24,0x02,0x00,0x03,0x00,0x07,0x1d,0x82,0x30,0x64,0x00,0x03,
+0x10,0x82,0x00,0x1a,0x3c,0x02,0xff,0x3f,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,
+0x3c,0x03,0xb0,0x0a,0x34,0x63,0x04,0x58,0x01,0x22,0x48,0x24,0x3c,0x04,0xb0,0x0a,
+0xac,0x69,0x00,0x00,0x34,0x84,0x14,0x58,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x35,0x29,0x80,0x00,
+0x34,0x42,0x04,0x58,0x3c,0x04,0xb0,0x0a,0xac,0x49,0x00,0x00,0x34,0x84,0x14,0x58,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x2d,0x02,0x00,0x21,0x08,0x00,0x0b,0xcd,0x00,0x00,0x00,0x00,0x34,0x42,0xff,0xff,
+0x3c,0x03,0x00,0x80,0x00,0xe2,0x10,0x24,0x00,0x43,0x38,0x25,0x3c,0x04,0xb0,0x0a,
+0x3c,0x01,0xb0,0x0a,0xac,0x27,0x04,0x10,0x34,0x84,0x14,0x10,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xff,0xff,
+0x08,0x00,0x0c,0x60,0x34,0x42,0x3f,0xff,0x14,0x40,0xff,0xd8,0x3c,0x02,0xff,0xff,
+0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x10,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,
+0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x10,0x8c,0x47,0x00,0x00,
+0x3c,0x05,0x00,0xc0,0x24,0x03,0x00,0x02,0x00,0xe5,0x10,0x24,0x00,0x02,0x25,0x82,
+0x14,0x83,0xff,0xc6,0x3c,0x02,0xff,0xff,0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,
+0x00,0xe2,0x10,0x24,0x00,0x45,0x38,0x25,0x3c,0x04,0xb0,0x0a,0x3c,0x01,0xb0,0x0a,
+0xac,0x27,0x04,0x10,0x34,0x84,0x14,0x10,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xff,0xff,0x08,0x00,0x0c,0x60,
+0x34,0x42,0x3f,0xff,0x97,0x82,0xc5,0x4c,0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x2b,
+0x10,0x40,0x00,0x74,0x34,0x63,0x18,0xa0,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,
+0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xa0,0x8c,0x46,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0xc8,0x00,0x7f,0x2d,0x02,0x00,0x32,0x10,0x40,0xff,0x3d,
+0x24,0x02,0x00,0x20,0x11,0x02,0x00,0x2b,0x24,0x02,0xff,0x80,0x00,0xc2,0x10,0x24,
+0x25,0x08,0x00,0x02,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x08,0xa0,0x00,0x48,0x30,0x25,
+0x3c,0x04,0xb0,0x0a,0xac,0x66,0x00,0x00,0x34,0x84,0x18,0xa0,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x34,0x42,0x08,0xb0,0x3c,0x04,0xb0,0x0a,0xac,0x46,0x00,0x00,0x34,0x84,0x18,0xb0,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xc0,0x3c,0x04,0xb0,0x0a,0xac,0x46,0x00,0x00,
+0x34,0x84,0x18,0xc0,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xd0,0x3c,0x04,0xb0,0x0a,
+0xac,0x46,0x00,0x00,0x34,0x84,0x18,0xd0,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,0x08,0x00,0x0b,0xf9,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x10,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x10,
+0x8c,0x47,0x00,0x00,0x3c,0x05,0x00,0xc0,0x24,0x03,0x00,0x03,0x00,0xe5,0x10,0x24,
+0x00,0x02,0x25,0x82,0x10,0x83,0x00,0x0d,0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,
+0x00,0xe2,0x10,0x24,0x00,0x45,0x38,0x25,0x3c,0x04,0xb0,0x0a,0x3c,0x01,0xb0,0x0a,
+0xac,0x27,0x04,0x10,0x34,0x84,0x14,0x10,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,
+0x34,0x63,0x14,0x58,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x04,0x58,0x8c,0x69,0x00,0x00,
+0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,0x01,0x22,0x48,0x24,0x3c,0x04,0xb0,0x0a,
+0xac,0x69,0x00,0x00,0x34,0x84,0x14,0x58,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x24,0x02,0xff,0x80,0x08,0x00,0x0c,0xc0,
+0x00,0xc2,0x10,0x24,0x97,0x82,0xc5,0x4a,0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x2b,
+0x10,0x40,0x00,0x75,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x18,0xa0,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xa0,
+0x8c,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0xc8,0x00,0x7f,0x2d,0x02,0x00,0x32,
+0x10,0x40,0xfe,0xc4,0x24,0x02,0x00,0x20,0x11,0x02,0x00,0x2b,0x24,0x02,0xff,0x80,
+0x00,0xc2,0x10,0x24,0x25,0x08,0x00,0x01,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x08,0xa0,
+0x00,0x48,0x30,0x25,0x3c,0x04,0xb0,0x0a,0xac,0x66,0x00,0x00,0x34,0x84,0x18,0xa0,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xb0,0x3c,0x04,0xb0,0x0a,0xac,0x46,0x00,0x00,
+0x34,0x84,0x18,0xb0,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xc0,0x3c,0x04,0xb0,0x0a,
+0xac,0x46,0x00,0x00,0x34,0x84,0x18,0xc0,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xd0,
+0x3c,0x04,0xb0,0x0a,0xac,0x46,0x00,0x00,0x34,0x84,0x18,0xd0,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x08,0x00,0x0b,0xf9,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x10,
+0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x34,0x42,0x04,0x10,0x8c,0x47,0x00,0x00,0x3c,0x05,0x00,0xc0,0x24,0x03,0x00,0x03,
+0x00,0xe5,0x10,0x24,0x00,0x02,0x25,0x82,0x10,0x83,0x00,0x0d,0x3c,0x02,0xff,0x3f,
+0x34,0x42,0xff,0xff,0x00,0xe2,0x10,0x24,0x00,0x45,0x38,0x25,0x3c,0x04,0xb0,0x0a,
+0x3c,0x01,0xb0,0x0a,0xac,0x27,0x04,0x10,0x34,0x84,0x14,0x10,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x58,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,
+0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x04,0x58,
+0x8c,0x69,0x00,0x00,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,0x01,0x22,0x48,0x24,
+0x3c,0x04,0xb0,0x0a,0xac,0x69,0x00,0x00,0x34,0x84,0x14,0x58,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x24,0x02,0xff,0x80,
+0x08,0x00,0x0d,0x39,0x00,0xc2,0x10,0x24,0x34,0x63,0x18,0xa0,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x08,0xa0,
+0x8c,0x46,0x00,0x00,0x24,0x02,0x00,0x20,0x30,0xc8,0x00,0x7f,0x15,0x02,0xfe,0x51,
+0x24,0x02,0xff,0xff,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x58,0xac,0x62,0x00,0x00,
+0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x58,0x8c,0x49,0x00,0x00,
+0x3c,0x04,0xb0,0x0a,0x34,0x84,0x14,0x58,0x35,0x29,0x40,0x00,0xac,0x49,0x00,0x00,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x24,0x02,0xff,0xff,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0xb0,0xac,0x62,0x00,0x00,
+0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0xb0,0x8c,0x47,0x00,0x00,
+0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0xb8,0x3c,0x05,0xb0,0x0a,0x24,0x02,0xff,0xff,
+0xac,0x62,0x00,0x00,0x34,0xa5,0x14,0xb8,0x00,0x07,0x1e,0x02,0x24,0x04,0x00,0x01,
+0x8c,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x44,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x34,0x42,0x04,0xb8,0x8c,0x47,0x00,0x00,0x00,0x03,0x1a,0x00,0x30,0xe2,0x00,0xff,
+0x00,0x62,0x18,0x25,0x2c,0x62,0x00,0x04,0x10,0x40,0x00,0x3a,0x2c,0x62,0x00,0x11,
+0x3c,0x03,0xb0,0x0a,0x34,0x63,0x14,0x10,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,
+0x00,0x60,0x20,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x10,0x8c,0x47,0x00,0x00,
+0x24,0x02,0x00,0x03,0x00,0x07,0x1d,0x82,0x30,0x64,0x00,0x03,0x10,0x82,0x00,0x1a,
+0x3c,0x02,0xff,0x3f,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,0x3c,0x03,0xb0,0x0a,
+0x34,0x63,0x04,0x58,0x01,0x22,0x48,0x24,0x3c,0x04,0xb0,0x0a,0xac,0x69,0x00,0x00,
+0x34,0x84,0x14,0x58,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xb0,0x0a,0x35,0x29,0x80,0x00,0x34,0x42,0x04,0x58,
+0x3c,0x04,0xb0,0x0a,0xac,0x49,0x00,0x00,0x34,0x84,0x14,0x58,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x08,0x00,0x0b,0xf9,0x00,0x00,0x00,0x00,0x34,0x42,0xff,0xff,0x3c,0x03,0x00,0x80,
+0x00,0xe2,0x10,0x24,0x00,0x43,0x38,0x25,0x3c,0x03,0xb0,0x0a,0x3c,0x01,0xb0,0x0a,
+0xac,0x27,0x04,0x10,0x34,0x63,0x14,0x10,0x24,0x04,0x00,0x01,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x44,0xff,0xfd,0x3c,0x02,0xff,0xff,0x08,0x00,0x0d,0xef,
+0x34,0x42,0x3f,0xff,0x14,0x40,0xff,0xd8,0x3c,0x02,0xff,0xff,0x3c,0x03,0xb0,0x0a,
+0x34,0x63,0x14,0x10,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x34,0x42,0x04,0x10,0x8c,0x47,0x00,0x00,0x3c,0x05,0x00,0xc0,
+0x24,0x03,0x00,0x02,0x00,0xe5,0x10,0x24,0x00,0x02,0x25,0x82,0x14,0x83,0xff,0xc6,
+0x3c,0x02,0xff,0xff,0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,0x00,0xe2,0x10,0x24,
+0x00,0x45,0x38,0x25,0x3c,0x03,0xb0,0x0a,0x3c,0x01,0xb0,0x0a,0xac,0x27,0x04,0x10,
+0x34,0x63,0x14,0x10,0x24,0x04,0x00,0x01,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x44,0xff,0xfd,0x3c,0x02,0xff,0xff,0x08,0x00,0x0d,0xef,0x34,0x42,0x3f,0xff,
+0x10,0x82,0x00,0x03,0x3c,0x03,0xb0,0x0a,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x34,0x63,0x1a,0x00,0x24,0x02,0xff,0xff,0xac,0x62,0x00,0x00,0x00,0x60,0x20,0x21,
+0xa7,0x80,0xc5,0x40,0xa7,0x80,0xc5,0x42,0xa7,0x80,0xc5,0x44,0xa7,0x80,0xc5,0x46,
+0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x34,0x63,0x0a,0x00,0x8c,0x66,0x00,0x00,
+0x3c,0x02,0x08,0x00,0x3c,0x04,0xb0,0x0a,0x00,0xc2,0x10,0x25,0xac,0x62,0x00,0x00,
+0x34,0x84,0x1a,0x00,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x3c,0x02,0xf7,0xff,0x3c,0x03,0xb0,0x0a,0x34,0x42,0xff,0xff,
+0x34,0x63,0x0a,0x00,0x00,0xc2,0x10,0x24,0x3c,0x04,0xb0,0x0a,0xac,0x62,0x00,0x00,
+0x34,0x84,0x1a,0x00,0x24,0x03,0x00,0x01,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,0x08,0x00,0x0e,0x3a,0x00,0x00,0x00,0x00,
+0x30,0x83,0x00,0x03,0x00,0x04,0x20,0x40,0x00,0x83,0x20,0x23,0x3c,0x02,0xb0,0x0a,
+0x00,0x82,0x20,0x21,0x3c,0x06,0x05,0xf5,0xac,0x85,0x00,0x00,0x24,0x07,0x00,0x01,
+0x00,0x00,0x28,0x21,0x34,0xc6,0xe0,0xff,0x8c,0x82,0x10,0x00,0x24,0xa5,0x00,0x01,
+0x10,0x47,0x00,0x03,0x00,0xc5,0x18,0x2b,0x10,0x60,0xff,0xfb,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0x83,0x00,0x03,0x00,0x04,0x20,0x40,
+0x3c,0x02,0xb0,0x0a,0x00,0x83,0x20,0x23,0x00,0x82,0x20,0x21,0x3c,0x06,0x05,0xf5,
+0x24,0x02,0xff,0xff,0xac,0x82,0x10,0x00,0x00,0x00,0x28,0x21,0x24,0x07,0x00,0x01,
+0x34,0xc6,0xe0,0xff,0x8c,0x82,0x10,0x00,0x24,0xa5,0x00,0x01,0x10,0x47,0x00,0x03,
+0x00,0xc5,0x18,0x2b,0x10,0x60,0xff,0xfb,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x05,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x24,0x42,0x3a,0x28,0x24,0x03,0x00,0x01,0x34,0xa5,0x00,0x20,0x3c,0x06,0xb0,0x03,
+0xac,0xa2,0x00,0x00,0x34,0xc6,0x01,0x04,0xa0,0x83,0x00,0x48,0xa0,0x80,0x00,0x04,
+0xa0,0x80,0x00,0x05,0xa0,0x80,0x00,0x06,0xa0,0x80,0x00,0x07,0xa0,0x80,0x00,0x08,
+0xa0,0x80,0x00,0x09,0xa0,0x80,0x00,0x0a,0xa0,0x80,0x00,0x11,0xa0,0x80,0x00,0x13,
+0xa0,0x80,0x00,0x49,0x94,0xc2,0x00,0x00,0xac,0x80,0x00,0x00,0xa0,0x80,0x00,0x4e,
+0x00,0x02,0x14,0x00,0x00,0x02,0x14,0x03,0x30,0x43,0x00,0xff,0x30,0x42,0xff,0x00,
+0xa4,0x82,0x00,0x44,0xa4,0x83,0x00,0x46,0xac,0x80,0x00,0x24,0xac,0x80,0x00,0x28,
+0xac,0x80,0x00,0x2c,0xac,0x80,0x00,0x30,0xac,0x80,0x00,0x34,0xac,0x80,0x00,0x38,
+0xac,0x80,0x00,0x3c,0x03,0xe0,0x00,0x08,0xac,0x80,0x00,0x40,0x84,0x83,0x00,0x0c,
+0x3c,0x07,0xb0,0x03,0x34,0xe7,0x00,0x20,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x44,0x00,0x43,0x10,0x21,0x8c,0x48,0x00,0x18,
+0x3c,0x02,0x80,0x00,0x24,0x42,0x3a,0xbc,0xac,0xe2,0x00,0x00,0x8d,0x03,0x00,0x08,
+0x80,0x82,0x00,0x13,0x00,0x05,0x2c,0x00,0x00,0x03,0x1e,0x02,0x00,0x02,0x12,0x00,
+0x30,0x63,0x00,0x7e,0x00,0x62,0x18,0x21,0x00,0x65,0x18,0x21,0x3c,0x02,0xc0,0x00,
+0x3c,0x05,0xb0,0x05,0x34,0x42,0x04,0x00,0x24,0x63,0x00,0x01,0x3c,0x07,0xb0,0x05,
+0x3c,0x08,0xb0,0x05,0x34,0xa5,0x04,0x20,0xac,0xa3,0x00,0x00,0x00,0xc2,0x30,0x21,
+0x34,0xe7,0x04,0x24,0x35,0x08,0x02,0x28,0x24,0x02,0x00,0x01,0x24,0x03,0x00,0x20,
+0xac,0xe6,0x00,0x00,0xac,0x82,0x00,0x3c,0x03,0xe0,0x00,0x08,0xa1,0x03,0x00,0x00,
+0x27,0xbd,0xff,0xa8,0x00,0x07,0x60,0x80,0x27,0x82,0xbd,0x40,0xaf,0xb7,0x00,0x4c,
+0xaf,0xb6,0x00,0x48,0xaf,0xb4,0x00,0x40,0xaf,0xb3,0x00,0x3c,0xaf,0xbf,0x00,0x54,
+0xaf,0xbe,0x00,0x50,0xaf,0xb5,0x00,0x44,0xaf,0xb2,0x00,0x38,0xaf,0xb1,0x00,0x34,
+0xaf,0xb0,0x00,0x30,0x01,0x82,0x10,0x21,0x8c,0x43,0x00,0x00,0x00,0xe0,0x70,0x21,
+0x3c,0x02,0x80,0x00,0x94,0x71,0x00,0x14,0x3c,0x07,0xb0,0x03,0x34,0xe7,0x00,0x20,
+0x24,0x42,0x3b,0x50,0x3c,0x03,0xb0,0x05,0xac,0xe2,0x00,0x00,0x34,0x63,0x01,0x28,
+0x90,0x67,0x00,0x00,0x00,0x11,0xa0,0xc0,0x02,0x91,0x18,0x21,0x27,0x82,0x99,0x44,
+0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,0x00,0x05,0x2c,0x00,0x00,0x07,0x3e,0x00,
+0x28,0xc2,0x00,0x03,0x00,0xc0,0x98,0x21,0x00,0x80,0x78,0x21,0x00,0x05,0xb4,0x03,
+0x8c,0x68,0x00,0x18,0x02,0x80,0x58,0x21,0x10,0x40,0x01,0x79,0x00,0x07,0xbe,0x03,
+0x00,0xd7,0x10,0x07,0x30,0x57,0x00,0x01,0x01,0x71,0x10,0x21,0x27,0x83,0x99,0x48,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x80,0x4d,0x00,0x06,0x8d,0x03,0x00,0x00,
+0x8d,0x02,0x00,0x04,0x8d,0x0a,0x00,0x08,0x8d,0x03,0x00,0x0c,0xaf,0xa2,0x00,0x1c,
+0x11,0xa0,0x01,0x69,0xaf,0xa3,0x00,0x18,0x27,0x82,0xbd,0x40,0x01,0x82,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x16,0x00,0x00,0x00,0x00,
+0x30,0x63,0x00,0x04,0x14,0x60,0x00,0x12,0x00,0x00,0xa8,0x21,0x3c,0x02,0xb0,0x09,
+0x34,0x42,0x01,0x46,0x90,0x43,0x00,0x00,0x2a,0x64,0x00,0x04,0x10,0x80,0x01,0x4e,
+0x30,0x65,0x00,0x01,0x91,0xe2,0x00,0x09,0x00,0x00,0x00,0x00,0x12,0x62,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x00,0x28,0x21,0x14,0xa0,0x00,0x03,0x00,0x00,0x38,0x21,
+0x12,0xe0,0x00,0x03,0x38,0xf5,0x00,0x01,0x24,0x07,0x00,0x01,0x38,0xf5,0x00,0x01,
+0x01,0x71,0x10,0x21,0x00,0x02,0x30,0x80,0x27,0x83,0x99,0x50,0x00,0xc3,0x48,0x21,
+0x91,0x25,0x00,0x00,0x8f,0xa3,0x00,0x1c,0x00,0x00,0x00,0x00,0x00,0x03,0x11,0xc3,
+0x2c,0xa3,0x00,0x04,0x30,0x42,0x00,0x01,0x00,0x03,0xa8,0x0b,0x12,0xa0,0x00,0xd2,
+0xaf,0xa2,0x00,0x20,0x93,0x90,0xc5,0x2a,0x00,0x0a,0x16,0x42,0x30,0x52,0x00,0x3f,
+0x2e,0x06,0x00,0x0c,0x10,0xc0,0x00,0xba,0x00,0xa0,0x20,0x21,0x2c,0xa2,0x00,0x10,
+0x14,0x40,0x00,0x04,0x00,0x90,0x10,0x2b,0x30,0xa2,0x00,0x07,0x24,0x44,0x00,0x04,
+0x00,0x90,0x10,0x2b,0x10,0x40,0x00,0x0b,0x01,0x71,0x10,0x21,0x27,0x85,0xc4,0x5c,
+0x00,0x10,0x10,0x40,0x00,0x50,0x10,0x21,0x00,0x45,0x10,0x21,0x90,0x50,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x90,0x18,0x2b,0x14,0x60,0xff,0xfa,0x00,0x10,0x10,0x40,
+0x01,0x71,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x48,0x00,0x43,0x10,0x21,
+0x31,0xa4,0x00,0x01,0x10,0x80,0x00,0x9f,0xa0,0x50,0x00,0x07,0x3c,0x04,0xb0,0x05,
+0x34,0x84,0x00,0x08,0x24,0x02,0x00,0x01,0x3c,0x03,0x80,0x00,0xa1,0xe2,0x00,0x4e,
+0xac,0x83,0x00,0x00,0x8c,0x85,0x00,0x00,0x3c,0x02,0x00,0xf0,0x3c,0x03,0x40,0xf0,
+0x34,0x42,0xf0,0x00,0x34,0x63,0xf0,0x00,0x24,0x16,0x00,0x0e,0x24,0x11,0x01,0x06,
+0xac,0x82,0x00,0x00,0xac,0x83,0x00,0x00,0x27,0x82,0xbd,0x40,0x01,0x82,0x10,0x21,
+0x8c,0x43,0x00,0x00,0x24,0x1e,0x00,0x01,0x00,0x11,0xa0,0xc0,0x90,0x62,0x00,0x16,
+0x00,0x00,0x00,0x00,0x34,0x42,0x00,0x04,0xa0,0x62,0x00,0x16,0x8f,0xa5,0x00,0x1c,
+0x00,0x10,0x32,0x00,0x00,0x05,0x13,0x43,0x30,0x47,0x00,0x01,0x8f,0xa2,0x00,0x18,
+0x8f,0xa5,0x00,0x20,0x00,0x02,0x22,0x02,0x00,0x12,0x10,0x40,0x00,0x05,0x19,0xc0,
+0x30,0x84,0x07,0xff,0x00,0x47,0x10,0x21,0x00,0x1e,0x2a,0x80,0x00,0x43,0x10,0x21,
+0x00,0x04,0x24,0x80,0x02,0x25,0x28,0x21,0x00,0xa4,0x28,0x21,0x00,0x46,0x10,0x21,
+0x00,0x16,0x1c,0x00,0x3c,0x04,0xc0,0x00,0x00,0x43,0x30,0x21,0x16,0x60,0x00,0x29,
+0x00,0xa4,0x28,0x21,0x3c,0x02,0xb0,0x05,0x34,0x42,0x04,0x00,0x3c,0x03,0xb0,0x05,
+0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x04,0x34,0x84,0x02,0x28,
+0x24,0x02,0x00,0x01,0xac,0x65,0x00,0x00,0xa0,0x82,0x00,0x00,0x3c,0x02,0xb0,0x09,
+0x34,0x42,0x01,0x46,0x90,0x44,0x00,0x00,0x91,0xe3,0x00,0x09,0x30,0x86,0x00,0x01,
+0x02,0x63,0x18,0x26,0x00,0x03,0x30,0x0b,0x14,0xc0,0x00,0x03,0x00,0x00,0x28,0x21,
+0x12,0xe0,0x00,0x03,0x02,0x91,0x10,0x21,0x24,0x05,0x00,0x01,0x02,0x91,0x10,0x21,
+0x27,0x83,0x99,0x48,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x84,0x48,0x00,0x04,
+0x00,0xa0,0x30,0x21,0x00,0xe0,0x20,0x21,0x02,0x60,0x28,0x21,0x02,0xa0,0x38,0x21,
+0x0c,0x00,0x00,0x70,0xaf,0xa8,0x00,0x10,0x7b,0xbe,0x02,0xbc,0x7b,0xb6,0x02,0x7c,
+0x7b,0xb4,0x02,0x3c,0x7b,0xb2,0x01,0xfc,0x7b,0xb0,0x01,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x58,0x24,0x02,0x00,0x01,0x12,0x62,0x00,0x3d,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x02,0x12,0x62,0x00,0x31,0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x03,
+0x12,0x62,0x00,0x25,0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x10,0x12,0x62,0x00,0x19,
+0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x11,0x12,0x62,0x00,0x0d,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x12,0x16,0x62,0xff,0xd1,0x3c,0x02,0xb0,0x05,0x3c,0x03,0xb0,0x05,
+0x34,0x42,0x04,0x20,0x3c,0x04,0xb0,0x05,0x34,0x63,0x04,0x24,0xac,0x46,0x00,0x00,
+0x34,0x84,0x02,0x28,0xac,0x65,0x00,0x00,0x08,0x00,0x0f,0x86,0x24,0x02,0x00,0x20,
+0x34,0x42,0x04,0x40,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,
+0x34,0x63,0x04,0x44,0x34,0x84,0x02,0x28,0x24,0x02,0x00,0x40,0x08,0x00,0x0f,0x86,
+0xac,0x65,0x00,0x00,0x34,0x42,0x04,0x28,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,
+0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x2c,0x34,0x84,0x02,0x28,0x24,0x02,0xff,0x80,
+0x08,0x00,0x0f,0x86,0xac,0x65,0x00,0x00,0x34,0x42,0x04,0x18,0x3c,0x03,0xb0,0x05,
+0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x1c,0x34,0x84,0x02,0x28,
+0x24,0x02,0x00,0x08,0x08,0x00,0x0f,0x86,0xac,0x65,0x00,0x00,0x34,0x42,0x04,0x10,
+0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x14,
+0x34,0x84,0x02,0x28,0x24,0x02,0x00,0x04,0x08,0x00,0x0f,0x86,0xac,0x65,0x00,0x00,
+0x34,0x42,0x04,0x08,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,
+0x34,0x63,0x04,0x0c,0x34,0x84,0x02,0x28,0x24,0x02,0x00,0x02,0x08,0x00,0x0f,0x86,
+0xac,0x65,0x00,0x00,0x24,0x16,0x00,0x14,0x08,0x00,0x0f,0x5e,0x24,0x11,0x01,0x02,
+0x30,0xa2,0x00,0x07,0x24,0x44,0x00,0x0c,0x00,0x90,0x18,0x2b,0x10,0x60,0x00,0x0c,
+0x26,0x02,0x00,0x04,0x27,0x85,0xc4,0x5c,0x00,0x10,0x10,0x40,0x00,0x50,0x10,0x21,
+0x00,0x45,0x10,0x21,0x90,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x18,0x2b,
+0x14,0x60,0xff,0xfa,0x00,0x10,0x10,0x40,0x2e,0x06,0x00,0x0c,0x26,0x02,0x00,0x04,
+0x08,0x00,0x0f,0x48,0x00,0x46,0x80,0x0a,0x27,0x82,0xbd,0x40,0x01,0x82,0x20,0x21,
+0x8c,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xe2,0x00,0x19,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x27,0x82,0x99,0x60,0x00,0xc2,0x10,0x21,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x12,0x00,0x00,0x00,0x00,
+0x90,0xe3,0x00,0x16,0x27,0x82,0x99,0x48,0x00,0xc2,0x10,0x21,0x34,0x63,0x00,0x20,
+0x90,0x50,0x00,0x07,0xa0,0xe3,0x00,0x16,0x8c,0x84,0x00,0x00,0x00,0x0a,0x16,0x42,
+0x30,0x52,0x00,0x3f,0x90,0x83,0x00,0x16,0x24,0x16,0x00,0x18,0x24,0x11,0x01,0x03,
+0x30,0x63,0x00,0xfb,0x24,0x1e,0x00,0x01,0x24,0x14,0x08,0x18,0x08,0x00,0x0f,0x67,
+0xa0,0x83,0x00,0x16,0x8d,0x02,0x00,0x04,0x00,0x0a,0x1c,0x42,0x30,0x42,0x00,0x10,
+0x14,0x40,0x00,0x15,0x30,0x72,0x00,0x3f,0x81,0x22,0x00,0x05,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x11,0x30,0x72,0x00,0x3e,0x27,0x83,0x99,0x58,0x00,0xc3,0x18,0x21,
+0x80,0x64,0x00,0x00,0x27,0x83,0xbe,0xb8,0x00,0x04,0x11,0x00,0x00,0x44,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,
+0x90,0x44,0x00,0x05,0x90,0x43,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x64,0x18,0x24,
+0x30,0x63,0x00,0x01,0x02,0x43,0x90,0x25,0x27,0x85,0xbd,0x40,0x01,0x85,0x28,0x21,
+0x8c,0xa6,0x00,0x00,0x01,0x71,0x10,0x21,0x27,0x83,0x99,0x50,0x90,0xc4,0x00,0x16,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x30,0x84,0x00,0xdf,0x90,0x50,0x00,0x00,
+0xa0,0xc4,0x00,0x16,0x8c,0xa3,0x00,0x00,0x2d,0xc4,0x00,0x02,0x80,0xde,0x00,0x12,
+0x90,0x62,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfb,0x14,0x80,0x00,0x06,
+0xa0,0x62,0x00,0x16,0x24,0x02,0x00,0x06,0x11,0xc2,0x00,0x03,0x24,0x02,0x00,0x04,
+0x15,0xc2,0xff,0x16,0x00,0x00,0x00,0x00,0x32,0x42,0x00,0x02,0x2e,0x03,0x00,0x0c,
+0x14,0x60,0x00,0x0f,0x00,0x02,0x20,0x2b,0x32,0x02,0x00,0x0f,0x34,0x42,0x00,0x10,
+0x00,0x04,0x19,0x00,0x00,0x43,0x18,0x21,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xe0,
+0xa0,0x43,0x00,0x00,0x00,0x00,0x20,0x21,0x02,0x00,0x28,0x21,0x0c,0x00,0x01,0xfb,
+0xaf,0xaf,0x00,0x28,0x8f,0xaf,0x00,0x28,0x08,0x00,0x0f,0x67,0x00,0x00,0x00,0x00,
+0x08,0x00,0x10,0x5a,0x32,0x03,0x00,0xff,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x42,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x0f,0x14,0x40,0xfe,0xb2,
+0x00,0x00,0x00,0x00,0x91,0xe2,0x00,0x09,0x00,0x00,0x00,0x00,0x02,0x62,0x10,0x26,
+0x08,0x00,0x0f,0x1e,0x00,0x02,0x28,0x0b,0x08,0x00,0x0f,0x24,0x00,0x00,0xa8,0x21,
+0x24,0x02,0x00,0x10,0x10,0xc2,0x00,0x08,0x24,0x02,0x00,0x11,0x10,0xc2,0xfe,0x85,
+0x00,0x07,0x17,0x83,0x24,0x02,0x00,0x12,0x14,0xc2,0xfe,0x83,0x00,0x07,0x17,0x43,
+0x08,0x00,0x0e,0xfe,0x30,0x57,0x00,0x01,0x08,0x00,0x0e,0xfe,0x00,0x07,0xbf,0xc2,
+0x00,0x04,0x10,0x40,0x27,0x83,0x86,0x30,0x00,0x43,0x10,0x21,0x00,0x80,0x40,0x21,
+0x94,0x44,0x00,0x00,0x2d,0x07,0x00,0x04,0x24,0xc2,0x00,0x03,0x00,0x47,0x30,0x0a,
+0x00,0x86,0x00,0x18,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,
+0x24,0x42,0x42,0x00,0xac,0x62,0x00,0x00,0x2d,0x06,0x00,0x10,0x00,0x00,0x20,0x12,
+0x00,0x04,0x22,0x42,0x24,0x84,0x00,0x01,0x24,0x83,0x00,0xc0,0x10,0xe0,0x00,0x0b,
+0x24,0x82,0x00,0x60,0x00,0x40,0x20,0x21,0x00,0x65,0x20,0x0a,0x3c,0x03,0xb0,0x03,
+0x34,0x63,0x01,0x00,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,
+0x00,0x44,0x20,0x04,0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x24,0x85,0x00,0x28,
+0x24,0x83,0x00,0x24,0x31,0x02,0x00,0x08,0x14,0xc0,0xff,0xf4,0x24,0x84,0x00,0x14,
+0x00,0x60,0x20,0x21,0x08,0x00,0x10,0x97,0x00,0xa2,0x20,0x0b,0x27,0xbd,0xff,0xe0,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0xaf,0xb0,0x00,0x10,0x24,0x42,0x42,0x9c,
+0x00,0x80,0x80,0x21,0x34,0x63,0x00,0x20,0x3c,0x04,0xb0,0x03,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x1c,0x83,0xb1,0x00,0x33,0x83,0xa8,0x00,0x37,
+0x34,0x84,0x01,0x10,0xac,0x62,0x00,0x00,0x2e,0x02,0x00,0x10,0x00,0xe0,0x90,0x21,
+0x8c,0x87,0x00,0x00,0x14,0x40,0x00,0x0c,0x2e,0x02,0x00,0x0c,0x3c,0x02,0x00,0x0f,
+0x34,0x42,0xf0,0x00,0x00,0xe2,0x10,0x24,0x14,0x40,0x00,0x37,0x32,0x02,0x00,0x08,
+0x32,0x02,0x00,0x07,0x27,0x83,0x86,0xe0,0x00,0x43,0x10,0x21,0x90,0x50,0x00,0x00,
+0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x0c,0x14,0x40,0x00,0x03,0x02,0x00,0x20,0x21,
+0x32,0x02,0x00,0x0f,0x24,0x44,0x00,0x0c,0x00,0x87,0x10,0x06,0x30,0x42,0x00,0x01,
+0x14,0x40,0x00,0x07,0x2c,0x82,0x00,0x0c,0x00,0x04,0x10,0x80,0x27,0x83,0xbd,0x90,
+0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x82,0x00,0x0c,
+0x14,0x40,0x00,0x05,0x00,0x05,0x10,0x40,0x00,0x46,0x10,0x21,0x00,0x02,0x11,0x00,
+0x00,0x82,0x10,0x21,0x24,0x44,0x00,0x04,0x15,0x00,0x00,0x02,0x24,0x06,0x00,0x20,
+0x24,0x06,0x00,0x0e,0x0c,0x00,0x10,0x80,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x21,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x00,0x90,0x43,0x00,0x00,0x2e,0x04,0x00,0x04,
+0x24,0x02,0x00,0x10,0x24,0x05,0x00,0x0a,0x00,0x44,0x28,0x0a,0x30,0x63,0x00,0x01,
+0x14,0x60,0x00,0x02,0x00,0x05,0x10,0x40,0x00,0xa0,0x10,0x21,0x30,0x45,0x00,0xff,
+0x00,0xc5,0x10,0x21,0x24,0x46,0x00,0x46,0x02,0x26,0x18,0x04,0xa6,0x43,0x00,0x00,
+0x8f,0xbf,0x00,0x1c,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x00,0xc0,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x10,0x40,0xff,0xcf,0x2e,0x02,0x00,0x0c,
+0x32,0x02,0x00,0x07,0x27,0x83,0x86,0xd8,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x00,
+0x08,0x00,0x10,0xc5,0x02,0x04,0x80,0x23,0x27,0xbd,0xff,0xb8,0x00,0x05,0x38,0x80,
+0x27,0x82,0xbd,0x40,0xaf,0xbe,0x00,0x40,0xaf,0xb6,0x00,0x38,0xaf,0xb3,0x00,0x2c,
+0xaf,0xbf,0x00,0x44,0xaf,0xb7,0x00,0x3c,0xaf,0xb5,0x00,0x34,0xaf,0xb4,0x00,0x30,
+0xaf,0xb2,0x00,0x28,0xaf,0xb1,0x00,0x24,0xaf,0xb0,0x00,0x20,0x00,0xe2,0x38,0x21,
+0x8c,0xe6,0x00,0x00,0xaf,0xa5,0x00,0x4c,0x3c,0x02,0x80,0x00,0x3c,0x05,0xb0,0x03,
+0x34,0xa5,0x00,0x20,0x24,0x42,0x43,0xf8,0x24,0x03,0x00,0x01,0xac,0xa2,0x00,0x00,
+0xa0,0xc3,0x00,0x12,0x8c,0xe5,0x00,0x00,0x94,0xc3,0x00,0x06,0x90,0xa2,0x00,0x16,
+0xa4,0xc3,0x00,0x14,0x27,0x83,0x99,0x40,0x34,0x42,0x00,0x08,0xa0,0xa2,0x00,0x16,
+0x8c,0xe8,0x00,0x00,0xaf,0xa4,0x00,0x48,0x27,0x82,0x99,0x44,0x95,0x11,0x00,0x14,
+0x00,0x00,0x00,0x00,0x00,0x11,0x98,0xc0,0x02,0x71,0x20,0x21,0x00,0x04,0x20,0x80,
+0x00,0x82,0x10,0x21,0x8c,0x52,0x00,0x18,0x00,0x83,0x18,0x21,0x84,0x75,0x00,0x06,
+0x8e,0x45,0x00,0x08,0x8e,0x46,0x00,0x04,0x8e,0x47,0x00,0x04,0x00,0x05,0x1c,0x82,
+0x00,0x06,0x31,0x42,0x27,0x82,0x99,0x50,0x30,0x63,0x00,0x01,0x30,0xc6,0x00,0x01,
+0x00,0x82,0x20,0x21,0xa5,0x15,0x00,0x1a,0x00,0x05,0x14,0x42,0xaf,0xa3,0x00,0x18,
+0xaf,0xa6,0x00,0x1c,0x30,0xe7,0x00,0x10,0x30,0x56,0x00,0x01,0x80,0x97,0x00,0x06,
+0x14,0xe0,0x00,0x47,0x00,0x05,0xf7,0xc2,0x80,0x82,0x00,0x05,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x44,0x02,0x71,0x10,0x21,0x93,0x90,0xc5,0x29,0x00,0x00,0x00,0x00,
+0x2e,0x02,0x00,0x0c,0x14,0x40,0x00,0x06,0x02,0x00,0x20,0x21,0x00,0x16,0x10,0x40,
+0x00,0x43,0x10,0x21,0x00,0x02,0x11,0x00,0x02,0x02,0x10,0x21,0x24,0x44,0x00,0x04,
+0x02,0x71,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,
+0x00,0x80,0x80,0x21,0xa0,0x44,0x00,0x03,0xa0,0x44,0x00,0x00,0x02,0x00,0x20,0x21,
+0x02,0xc0,0x28,0x21,0x0c,0x00,0x10,0x80,0x02,0xa0,0x30,0x21,0x02,0x71,0x18,0x21,
+0x00,0x03,0x88,0x80,0x00,0x40,0xa0,0x21,0x27,0x82,0x99,0x60,0x02,0x22,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x26,0xe3,0x00,0x02,0x00,0x03,0x17,0xc2,0x00,0x62,0x18,0x21,
+0x00,0x04,0x25,0xc2,0x00,0x03,0x18,0x43,0x30,0x84,0x00,0x01,0x00,0x03,0x18,0x40,
+0x03,0xc4,0x20,0x24,0x14,0x80,0x00,0x15,0x02,0x43,0x38,0x21,0x3c,0x08,0xb0,0x03,
+0x35,0x08,0x00,0x28,0x8d,0x03,0x00,0x00,0x8f,0xa6,0x00,0x4c,0x8f,0xa4,0x00,0x48,
+0x27,0x82,0x99,0x48,0x02,0x22,0x10,0x21,0x24,0x63,0x00,0x01,0x02,0xa0,0x28,0x21,
+0xa4,0x54,0x00,0x04,0x00,0xc0,0x38,0x21,0x0c,0x00,0x0e,0xd4,0xad,0x03,0x00,0x00,
+0x7b,0xbe,0x02,0x3c,0x7b,0xb6,0x01,0xfc,0x7b,0xb4,0x01,0xbc,0x7b,0xb2,0x01,0x7c,
+0x7b,0xb0,0x01,0x3c,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x48,0x8f,0xa2,0x00,0x1c,
+0x8f,0xa6,0x00,0x18,0x02,0x00,0x20,0x21,0x02,0xc0,0x28,0x21,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x10,0xa7,0xaf,0xa0,0x00,0x14,0x08,0x00,0x11,0x63,0x02,0x82,0xa0,0x21,
+0x02,0x71,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,
+0x90,0x50,0x00,0x00,0x08,0x00,0x11,0x4f,0xa0,0x50,0x00,0x03,0x27,0xbd,0xff,0xb8,
+0xaf,0xb1,0x00,0x24,0x8f,0xb1,0x00,0x5c,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x46,0x1c,0xaf,0xbe,0x00,0x40,0xaf,0xb7,0x00,0x3c,
+0xaf,0xb6,0x00,0x38,0xaf,0xb5,0x00,0x34,0xaf,0xb4,0x00,0x30,0xaf,0xa5,0x00,0x4c,
+0x8f,0xb5,0x00,0x58,0xaf,0xbf,0x00,0x44,0xaf,0xb3,0x00,0x2c,0xaf,0xb2,0x00,0x28,
+0xaf,0xb0,0x00,0x20,0x00,0xe0,0xb0,0x21,0xac,0x62,0x00,0x00,0x00,0x80,0xf0,0x21,
+0x00,0x00,0xb8,0x21,0x16,0x20,0x00,0x2b,0x00,0x00,0xa0,0x21,0x27,0x85,0xbd,0x40,
+0x00,0x07,0x10,0x80,0x00,0x45,0x10,0x21,0x8c,0x53,0x00,0x00,0x00,0x15,0x18,0x80,
+0x00,0x65,0x18,0x21,0x92,0x62,0x00,0x16,0x8c,0x72,0x00,0x00,0x30,0x42,0x00,0x03,
+0x14,0x40,0x00,0x2d,0x00,0x00,0x00,0x00,0x92,0x42,0x00,0x16,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x03,0x14,0x40,0x00,0x28,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x34,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x18,0x02,0x20,0x10,0x21,0x8c,0x82,0x00,0x38,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x14,0x02,0x20,0x10,0x21,0x8c,0x82,0x00,0x3c,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x0f,0x3c,0x03,0xb0,0x09,0x3c,0x05,0xb0,0x05,
+0x34,0x63,0x01,0x44,0x34,0xa5,0x02,0x52,0x94,0x66,0x00,0x00,0x90,0xa2,0x00,0x00,
+0x8f,0xa3,0x00,0x4c,0x00,0x00,0x00,0x00,0x00,0x62,0x10,0x06,0x30,0x42,0x00,0x01,
+0x10,0x40,0x00,0x04,0x30,0xc6,0xff,0xff,0x2c,0xc2,0x00,0x41,0x10,0x40,0x00,0x09,
+0x24,0x05,0x00,0x14,0x02,0x20,0x10,0x21,0x7b,0xbe,0x02,0x3c,0x7b,0xb6,0x01,0xfc,
+0x7b,0xb4,0x01,0xbc,0x7b,0xb2,0x01,0x7c,0x7b,0xb0,0x01,0x3c,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x48,0x0c,0x00,0x0e,0xaf,0x24,0x06,0x01,0x07,0x24,0x02,0x00,0x01,
+0x08,0x00,0x11,0xc9,0xa3,0xc2,0x00,0x11,0x10,0xc0,0x00,0x1c,0x24,0x02,0x00,0x01,
+0x10,0xc2,0x00,0x17,0x00,0xc0,0x88,0x21,0x96,0x54,0x00,0x1a,0x02,0xa0,0xb8,0x21,
+0x12,0x20,0xff,0xed,0x02,0x20,0x10,0x21,0x27,0x83,0xbd,0x40,0x00,0x17,0x10,0x80,
+0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x28,
+0x80,0x86,0x00,0x12,0x8c,0x62,0x00,0x00,0x00,0x14,0x2c,0x00,0x00,0x05,0x2c,0x03,
+0x00,0x46,0x10,0x21,0x8f,0xa6,0x00,0x4c,0x02,0xe0,0x38,0x21,0x03,0xc0,0x20,0x21,
+0x0c,0x00,0x0e,0xd4,0xac,0x62,0x00,0x00,0x08,0x00,0x11,0xc9,0xaf,0xd1,0x00,0x40,
+0x96,0x74,0x00,0x1a,0x08,0x00,0x11,0xdc,0x02,0xc0,0xb8,0x21,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x01,0x08,0x8c,0x50,0x00,0x00,0x02,0x60,0x20,0x21,0x0c,0x00,0x26,0xb7,
+0x02,0x00,0x28,0x21,0x30,0x42,0x00,0xff,0x02,0x00,0x28,0x21,0x02,0x40,0x20,0x21,
+0x0c,0x00,0x26,0xb7,0xaf,0xa2,0x00,0x18,0x8f,0xa4,0x00,0x18,0x00,0x00,0x00,0x00,
+0x10,0x80,0x00,0xed,0x30,0x50,0x00,0xff,0x12,0x00,0x00,0x18,0x24,0x11,0x00,0x01,
+0x96,0x63,0x00,0x14,0x96,0x44,0x00,0x14,0x27,0x85,0x99,0x40,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,0x00,0x04,0x18,0xc0,
+0x8c,0x46,0x00,0x08,0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x65,0x18,0x21,
+0x00,0x06,0x17,0x02,0x24,0x04,0x00,0xff,0x8c,0x63,0x00,0x08,0x10,0x44,0x00,0xd6,
+0x00,0x03,0x17,0x02,0x10,0x44,0x00,0xd5,0x3c,0x02,0x80,0x00,0x00,0x66,0x18,0x2b,
+0x24,0x11,0x00,0x02,0x24,0x02,0x00,0x01,0x00,0x43,0x88,0x0a,0x24,0x02,0x00,0x01,
+0x12,0x22,0x00,0x5a,0x24,0x02,0x00,0x02,0x16,0x22,0xff,0xbd,0x00,0x00,0x00,0x00,
+0x96,0x49,0x00,0x14,0x27,0x82,0x99,0x44,0x02,0xa0,0xb8,0x21,0x00,0x09,0x50,0xc0,
+0x01,0x49,0x18,0x21,0x00,0x03,0x40,0x80,0x01,0x02,0x10,0x21,0x8c,0x43,0x00,0x18,
+0x00,0x00,0x00,0x00,0x8c,0x65,0x00,0x08,0x8c,0x62,0x00,0x0c,0x8c,0x62,0x00,0x04,
+0x00,0x05,0x24,0x42,0x00,0x05,0x1c,0x82,0x30,0x42,0x00,0x10,0x30,0x66,0x00,0x01,
+0x14,0x40,0x00,0x41,0x30,0x87,0x00,0x01,0x27,0x82,0x99,0x58,0x01,0x02,0x10,0x21,
+0x80,0x44,0x00,0x00,0x27,0x82,0xbe,0xb8,0x00,0x04,0x19,0x00,0x00,0x64,0x18,0x23,
+0x00,0x03,0x18,0x80,0x00,0x64,0x18,0x23,0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,
+0x90,0x45,0x00,0x05,0x27,0x84,0xbd,0xe0,0x00,0x64,0x18,0x21,0x90,0x63,0x00,0x00,
+0x10,0xa0,0x00,0x2b,0x2c,0x64,0x00,0x0c,0x14,0x80,0x00,0x04,0x00,0x60,0x10,0x21,
+0x00,0x06,0x11,0x00,0x00,0x62,0x10,0x21,0x24,0x42,0x00,0x24,0x3c,0x01,0xb0,0x03,
+0xa0,0x22,0x00,0xe1,0x14,0x80,0x00,0x06,0x00,0x60,0x28,0x21,0x00,0x07,0x10,0x40,
+0x00,0x46,0x10,0x21,0x00,0x02,0x11,0x00,0x00,0x62,0x10,0x21,0x24,0x45,0x00,0x04,
+0x01,0x49,0x10,0x21,0x27,0x83,0x99,0x50,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,
+0x00,0xa0,0x18,0x21,0xa0,0x45,0x00,0x03,0xa0,0x45,0x00,0x00,0x24,0x02,0x00,0x08,
+0x12,0x02,0x00,0x0b,0x24,0x02,0x00,0x01,0x00,0x60,0x28,0x21,0x02,0x40,0x20,0x21,
+0x0c,0x00,0x27,0x33,0xaf,0xa2,0x00,0x10,0x30,0x54,0xff,0xff,0x92,0x42,0x00,0x16,
+0x00,0x00,0x00,0x00,0x02,0x02,0x10,0x25,0x08,0x00,0x11,0xdc,0xa2,0x42,0x00,0x16,
+0x00,0x60,0x28,0x21,0x02,0x40,0x20,0x21,0x0c,0x00,0x26,0xe4,0xaf,0xa0,0x00,0x10,
+0x08,0x00,0x12,0x5f,0x30,0x54,0xff,0xff,0x08,0x00,0x12,0x47,0x00,0x60,0x10,0x21,
+0x14,0x80,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0x06,0x11,0x00,0x00,0x62,0x10,0x21,
+0x08,0x00,0x12,0x47,0x24,0x42,0x00,0x04,0x27,0x82,0x99,0x50,0x01,0x02,0x10,0x21,
+0x90,0x43,0x00,0x00,0x08,0x00,0x12,0x57,0xa0,0x43,0x00,0x03,0x96,0x69,0x00,0x14,
+0x02,0xc0,0xb8,0x21,0x24,0x0b,0x00,0x01,0x00,0x09,0x10,0xc0,0x00,0x49,0x18,0x21,
+0x00,0x03,0x40,0x80,0x00,0x40,0x50,0x21,0x27,0x82,0x99,0x44,0x01,0x02,0x10,0x21,
+0x8c,0x43,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x65,0x00,0x08,0x8c,0x62,0x00,0x0c,
+0x8c,0x62,0x00,0x04,0x00,0x05,0x24,0x42,0x00,0x05,0x1c,0x82,0x30,0x42,0x00,0x10,
+0x30,0x66,0x00,0x01,0x10,0x40,0x00,0x0d,0x30,0x87,0x00,0x01,0x27,0x82,0x99,0x58,
+0x01,0x02,0x10,0x21,0x80,0x43,0x00,0x00,0x00,0x00,0x58,0x21,0x00,0x03,0x11,0x00,
+0x00,0x43,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x23,0x00,0x02,0x10,0x80,
+0x27,0x83,0xbe,0xb0,0x00,0x43,0x10,0x21,0xa0,0x40,0x00,0x04,0x11,0x60,0x00,0x4f,
+0x00,0x00,0x00,0x00,0x01,0x49,0x10,0x21,0x00,0x02,0x20,0x80,0x27,0x85,0x99,0x50,
+0x00,0x85,0x10,0x21,0x80,0x43,0x00,0x05,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x42,
+0x01,0x49,0x10,0x21,0x27,0x82,0x99,0x58,0x00,0x82,0x10,0x21,0x80,0x44,0x00,0x00,
+0x27,0x82,0xbe,0xb8,0x00,0x04,0x19,0x00,0x00,0x64,0x18,0x23,0x00,0x03,0x18,0x80,
+0x00,0x64,0x18,0x23,0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,0x90,0x45,0x00,0x05,
+0x27,0x84,0xbd,0xe0,0x00,0x64,0x18,0x21,0x90,0x63,0x00,0x00,0x10,0xa0,0x00,0x2c,
+0x2c,0x64,0x00,0x0c,0x14,0x80,0x00,0x04,0x00,0x60,0x10,0x21,0x00,0x06,0x11,0x00,
+0x00,0x62,0x10,0x21,0x24,0x42,0x00,0x24,0x3c,0x01,0xb0,0x03,0xa0,0x22,0x00,0xe1,
+0x14,0x80,0x00,0x06,0x00,0x60,0x28,0x21,0x00,0x07,0x10,0x40,0x00,0x46,0x10,0x21,
+0x00,0x02,0x11,0x00,0x00,0x62,0x10,0x21,0x24,0x45,0x00,0x04,0x01,0x49,0x10,0x21,
+0x27,0x83,0x99,0x50,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x00,0xa0,0x18,0x21,
+0xa0,0x45,0x00,0x03,0xa0,0x45,0x00,0x00,0x8f,0xa4,0x00,0x18,0x24,0x02,0x00,0x08,
+0x10,0x82,0x00,0x0c,0x00,0x60,0x28,0x21,0x24,0x02,0x00,0x01,0x02,0x60,0x20,0x21,
+0x0c,0x00,0x27,0x33,0xaf,0xa2,0x00,0x10,0x8f,0xa3,0x00,0x18,0x30,0x54,0xff,0xff,
+0x92,0x62,0x00,0x16,0x00,0x00,0x00,0x00,0x00,0x62,0x10,0x25,0x08,0x00,0x11,0xdc,
+0xa2,0x62,0x00,0x16,0x02,0x60,0x20,0x21,0x0c,0x00,0x26,0xe4,0xaf,0xa0,0x00,0x10,
+0x08,0x00,0x12,0xce,0x00,0x00,0x00,0x00,0x08,0x00,0x12,0xb6,0x00,0x60,0x10,0x21,
+0x14,0x80,0xff,0xfd,0x00,0x00,0x00,0x00,0x00,0x06,0x11,0x00,0x00,0x62,0x10,0x21,
+0x08,0x00,0x12,0xb6,0x24,0x42,0x00,0x04,0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,
+0x90,0x43,0x00,0x00,0x08,0x00,0x12,0xc6,0xa0,0x43,0x00,0x03,0x27,0x85,0x99,0x50,
+0x08,0x00,0x12,0xe2,0x01,0x49,0x10,0x21,0x3c,0x02,0x80,0x00,0x00,0x62,0x18,0x26,
+0x08,0x00,0x12,0x17,0x00,0xc2,0x30,0x26,0x12,0x00,0xff,0x2d,0x24,0x02,0x00,0x01,
+0x08,0x00,0x12,0x1c,0x24,0x11,0x00,0x02,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x27,0xbd,0xff,0xd0,0x24,0x42,0x4b,0xc8,0x34,0x63,0x00,0x20,0x3c,0x05,0xb0,0x05,
+0xaf,0xb3,0x00,0x24,0xaf,0xb2,0x00,0x20,0xaf,0xb1,0x00,0x1c,0xaf,0xbf,0x00,0x28,
+0xaf,0xb0,0x00,0x18,0xac,0x62,0x00,0x00,0x34,0xa5,0x02,0x42,0x90,0xa2,0x00,0x00,
+0x00,0x80,0x90,0x21,0x24,0x11,0x00,0x10,0x30,0x53,0x00,0xff,0x24,0x02,0x00,0x10,
+0x12,0x22,0x00,0xcf,0x00,0x00,0x18,0x21,0x24,0x02,0x00,0x11,0x12,0x22,0x00,0xc1,
+0x24,0x02,0x00,0x12,0x12,0x22,0x00,0xb4,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0xad,
+0xae,0x43,0x00,0x40,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2c,0x8c,0x44,0x00,0x00,
+0x3c,0x03,0x00,0x02,0x34,0x63,0x00,0xff,0x00,0x83,0x80,0x24,0x00,0x10,0x14,0x43,
+0x10,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x8e,0x42,0x00,0x34,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x92,0x00,0x00,0x00,0x00,0x93,0x83,0x94,0x51,0x00,0x00,0x00,0x00,
+0x30,0x62,0x00,0x02,0x10,0x40,0x00,0x04,0x32,0x10,0x00,0xff,0x00,0x10,0x11,0xc3,
+0x14,0x40,0x00,0x86,0x00,0x00,0x00,0x00,0x16,0x00,0x00,0x15,0x02,0x00,0x10,0x21,
+0x26,0x22,0x00,0x01,0x30,0x51,0x00,0xff,0x2e,0x23,0x00,0x13,0x14,0x60,0xff,0xdb,
+0x24,0x03,0x00,0x02,0x12,0x63,0x00,0x73,0x24,0x02,0x00,0x05,0x2a,0x62,0x00,0x03,
+0x10,0x40,0x00,0x58,0x24,0x02,0x00,0x04,0x24,0x02,0x00,0x01,0x12,0x62,0x00,0x4b,
+0x02,0x40,0x20,0x21,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2c,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x70,0x00,0xff,0x12,0x00,0x00,0x06,0x02,0x00,0x10,0x21,
+0x8f,0xbf,0x00,0x28,0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x30,0x92,0x46,0x00,0x04,0x8e,0x43,0x00,0x24,0x24,0x02,0x00,0x07,
+0x02,0x40,0x20,0x21,0x00,0x00,0x28,0x21,0x24,0x07,0x00,0x06,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x11,0x87,0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x24,0x3c,0x02,0xb0,0x05,
+0x8c,0x42,0x02,0x2c,0x00,0x00,0x00,0x00,0x30,0x50,0x00,0xff,0x16,0x00,0xff,0xec,
+0x02,0x00,0x10,0x21,0x92,0x46,0x00,0x05,0x8e,0x43,0x00,0x28,0x24,0x02,0x00,0x05,
+0x02,0x40,0x20,0x21,0x24,0x05,0x00,0x01,0x24,0x07,0x00,0x04,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x11,0x87,0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x28,0x3c,0x02,0xb0,0x05,
+0x8c,0x42,0x02,0x2c,0x00,0x00,0x00,0x00,0x30,0x50,0x00,0xff,0x16,0x00,0xff,0xdc,
+0x02,0x00,0x10,0x21,0x92,0x46,0x00,0x06,0x8e,0x43,0x00,0x2c,0x24,0x02,0x00,0x03,
+0x02,0x40,0x20,0x21,0x24,0x05,0x00,0x02,0x00,0x00,0x38,0x21,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x11,0x87,0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x2c,0x3c,0x02,0xb0,0x05,
+0x8c,0x42,0x02,0x2c,0x00,0x00,0x00,0x00,0x30,0x50,0x00,0xff,0x16,0x00,0xff,0xcc,
+0x02,0x00,0x10,0x21,0x92,0x46,0x00,0x07,0x8e,0x43,0x00,0x30,0x24,0x02,0x00,0x02,
+0x02,0x40,0x20,0x21,0x24,0x05,0x00,0x03,0x24,0x07,0x00,0x01,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x11,0x87,0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x30,0x3c,0x02,0xb0,0x05,
+0x8c,0x42,0x02,0x2c,0x08,0x00,0x13,0x38,0x30,0x42,0x00,0xff,0x92,0x46,0x00,0x04,
+0x8e,0x43,0x00,0x24,0x24,0x02,0x00,0x07,0x00,0x00,0x28,0x21,0x24,0x07,0x00,0x06,
+0xaf,0xa2,0x00,0x10,0x0c,0x00,0x11,0x87,0xaf,0xa3,0x00,0x14,0x08,0x00,0x13,0x31,
+0xae,0x42,0x00,0x24,0x12,0x62,0x00,0x0d,0x24,0x02,0x00,0x03,0x24,0x02,0x00,0x08,
+0x16,0x62,0xff,0xa8,0x02,0x40,0x20,0x21,0x92,0x46,0x00,0x07,0x8e,0x42,0x00,0x30,
+0x24,0x05,0x00,0x03,0x24,0x07,0x00,0x01,0xaf,0xa3,0x00,0x10,0x0c,0x00,0x11,0x87,
+0xaf,0xa2,0x00,0x14,0x08,0x00,0x13,0x31,0xae,0x42,0x00,0x30,0x92,0x46,0x00,0x06,
+0x8e,0x43,0x00,0x2c,0x02,0x40,0x20,0x21,0x24,0x05,0x00,0x02,0x00,0x00,0x38,0x21,
+0xaf,0xa2,0x00,0x10,0x0c,0x00,0x11,0x87,0xaf,0xa3,0x00,0x14,0x08,0x00,0x13,0x31,
+0xae,0x42,0x00,0x2c,0x92,0x46,0x00,0x05,0x8e,0x43,0x00,0x28,0x02,0x40,0x20,0x21,
+0x24,0x05,0x00,0x01,0x24,0x07,0x00,0x04,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x11,0x87,
+0xaf,0xa3,0x00,0x14,0x08,0x00,0x13,0x31,0xae,0x42,0x00,0x28,0x0c,0x00,0x01,0x57,
+0x24,0x04,0x00,0x01,0x08,0x00,0x13,0x22,0x00,0x00,0x00,0x00,0x8f,0x84,0xbd,0x80,
+0xae,0x40,0x00,0x34,0x94,0x85,0x00,0x14,0x0c,0x00,0x23,0x34,0x00,0x00,0x00,0x00,
+0x93,0x83,0x94,0x51,0x00,0x00,0x00,0x00,0x30,0x62,0x00,0x02,0x10,0x40,0xff,0x69,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x01,0x57,0x00,0x00,0x20,0x21,0x08,0x00,0x13,0x1a,
+0x00,0x00,0x00,0x00,0x02,0x40,0x20,0x21,0x0c,0x00,0x10,0xfe,0x02,0x20,0x28,0x21,
+0x08,0x00,0x13,0x0e,0x3c,0x02,0xb0,0x05,0x8e,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,
+0x14,0x40,0xff,0x4a,0x00,0x00,0x00,0x00,0x8f,0x82,0xbd,0x88,0x00,0x00,0x00,0x00,
+0x90,0x42,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x18,0x2b,0x08,0x00,0x13,0x0b,
+0xae,0x43,0x00,0x3c,0x8e,0x42,0x00,0x38,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x3d,
+0x24,0x02,0x00,0x12,0x8f,0x82,0xbd,0x84,0x00,0x00,0x00,0x00,0x90,0x42,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x00,0x02,0x18,0x2b,0x08,0x00,0x13,0x0b,0xae,0x43,0x00,0x38,
+0x8e,0x42,0x00,0x34,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x30,0x24,0x02,0x00,0x11,
+0x8f,0x82,0xbd,0x80,0x00,0x00,0x00,0x00,0x90,0x42,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x00,0x02,0x18,0x2b,0x08,0x00,0x13,0x0b,0xae,0x43,0x00,0x34,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xe0,0x34,0x63,0x00,0x20,0x24,0x42,0x4f,0x7c,
+0x3c,0x08,0xb0,0x03,0xaf,0xb1,0x00,0x14,0xac,0x62,0x00,0x00,0x35,0x08,0x01,0x00,
+0xaf,0xbf,0x00,0x18,0xaf,0xb0,0x00,0x10,0x91,0x03,0x00,0x00,0x00,0xa0,0x48,0x21,
+0x24,0x11,0x00,0x0a,0x2c,0xa5,0x00,0x04,0x24,0x02,0x00,0x10,0x00,0x45,0x88,0x0a,
+0x30,0x63,0x00,0x01,0x00,0xc0,0x28,0x21,0x14,0x60,0x00,0x02,0x00,0x11,0x40,0x40,
+0x02,0x20,0x40,0x21,0x84,0x83,0x00,0x0c,0x31,0x11,0x00,0xff,0x01,0x20,0x20,0x21,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x48,
+0x00,0x43,0x10,0x21,0x84,0x43,0x00,0x04,0x24,0x06,0x00,0x0e,0x10,0xe0,0x00,0x06,
+0x02,0x23,0x80,0x21,0x02,0x00,0x10,0x21,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x0c,0x00,0x10,0x80,0x00,0x00,0x00,0x00,
+0x02,0x11,0x18,0x21,0x08,0x00,0x14,0x01,0x00,0x62,0x80,0x21,0x27,0xbd,0xff,0xd0,
+0xaf,0xbf,0x00,0x28,0xaf,0xb4,0x00,0x20,0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,
+0xaf,0xb5,0x00,0x24,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x84,0x82,0x00,0x0c,
+0x3c,0x06,0xb0,0x03,0x34,0xc6,0x00,0x20,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,
+0x00,0x03,0x18,0x80,0x27,0x82,0x99,0x44,0x00,0x62,0x10,0x21,0x8c,0x55,0x00,0x18,
+0x3c,0x02,0x80,0x00,0x24,0x42,0x50,0x2c,0xac,0xc2,0x00,0x00,0x8e,0xb0,0x00,0x08,
+0x27,0x82,0x99,0x48,0x00,0x62,0x18,0x21,0x90,0x71,0x00,0x07,0x00,0x10,0x86,0x43,
+0x32,0x10,0x00,0x01,0x00,0xa0,0x38,0x21,0x02,0x00,0x30,0x21,0x00,0xa0,0x98,0x21,
+0x02,0x20,0x28,0x21,0x0c,0x00,0x13,0xdf,0x00,0x80,0x90,0x21,0x02,0x20,0x20,0x21,
+0x02,0x00,0x28,0x21,0x24,0x06,0x00,0x14,0x0c,0x00,0x10,0x80,0x00,0x40,0xa0,0x21,
+0x86,0x43,0x00,0x0c,0x3c,0x09,0xb0,0x09,0x3c,0x08,0xb0,0x09,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,
+0x80,0x43,0x00,0x06,0x3c,0x07,0xb0,0x09,0x3c,0x05,0xb0,0x09,0x28,0x62,0x00,0x00,
+0x24,0x64,0x00,0x03,0x00,0x82,0x18,0x0b,0x00,0x03,0x18,0x83,0x3c,0x02,0xb0,0x09,
+0x00,0x03,0x18,0x80,0x34,0x42,0x01,0x02,0x35,0x29,0x01,0x10,0x35,0x08,0x01,0x14,
+0x34,0xe7,0x01,0x20,0x34,0xa5,0x01,0x24,0xa4,0x54,0x00,0x00,0x12,0x60,0x00,0x11,
+0x02,0xa3,0xa8,0x21,0x8e,0xa2,0x00,0x0c,0x8e,0xa3,0x00,0x08,0x00,0x02,0x14,0x00,
+0x00,0x03,0x1c,0x02,0x00,0x43,0x10,0x21,0xad,0x22,0x00,0x00,0x8e,0xa3,0x00,0x0c,
+0x00,0x00,0x00,0x00,0x00,0x03,0x1c,0x02,0xa5,0x03,0x00,0x00,0x8f,0xbf,0x00,0x28,
+0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x30,0x8e,0xa2,0x00,0x04,0x00,0x00,0x00,0x00,0xad,0x22,0x00,0x00,
+0x8e,0xa4,0x00,0x08,0x00,0x00,0x00,0x00,0xa5,0x04,0x00,0x00,0x7a,0xa2,0x00,0x7c,
+0x00,0x00,0x00,0x00,0x00,0x03,0x1c,0x00,0x00,0x02,0x14,0x02,0x00,0x62,0x18,0x21,
+0xac,0xe3,0x00,0x00,0x8e,0xa2,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x14,0x02,
+0x08,0x00,0x14,0x53,0xa4,0xa2,0x00,0x00,0x27,0xbd,0xff,0xe0,0xaf,0xb2,0x00,0x18,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x1c,0xaf,0xb1,0x00,0x14,0x84,0x82,0x00,0x0c,
+0x00,0x80,0x90,0x21,0x3c,0x05,0xb0,0x03,0x00,0x02,0x20,0xc0,0x00,0x82,0x20,0x21,
+0x00,0x04,0x20,0x80,0x27,0x82,0x99,0x44,0x00,0x82,0x10,0x21,0x8c,0x51,0x00,0x18,
+0x3c,0x02,0x80,0x00,0x34,0xa5,0x00,0x20,0x24,0x42,0x51,0xa8,0x27,0x83,0x99,0x48,
+0xac,0xa2,0x00,0x00,0x00,0x83,0x20,0x21,0x3c,0x02,0xb0,0x03,0x90,0x86,0x00,0x07,
+0x34,0x42,0x01,0x00,0x8e,0x23,0x00,0x08,0x90,0x44,0x00,0x00,0x2c,0xc5,0x00,0x04,
+0x24,0x02,0x00,0x10,0x24,0x10,0x00,0x0a,0x00,0x45,0x80,0x0a,0x00,0x03,0x1e,0x43,
+0x30,0x84,0x00,0x01,0x30,0x65,0x00,0x01,0x14,0x80,0x00,0x02,0x00,0x10,0x10,0x40,
+0x02,0x00,0x10,0x21,0x00,0xc0,0x20,0x21,0x24,0x06,0x00,0x20,0x0c,0x00,0x10,0x80,
+0x30,0x50,0x00,0xff,0x86,0x44,0x00,0x0c,0x27,0x85,0x99,0x50,0x3c,0x06,0xb0,0x09,
+0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x65,0x18,0x21,
+0x80,0x64,0x00,0x06,0x00,0x50,0x10,0x21,0x34,0xc6,0x01,0x02,0x24,0x85,0x00,0x03,
+0x28,0x83,0x00,0x00,0x00,0xa3,0x20,0x0b,0x00,0x04,0x20,0x83,0x00,0x04,0x20,0x80,
+0xa4,0xc2,0x00,0x00,0x02,0x24,0x20,0x21,0x8c,0x83,0x00,0x04,0x3c,0x02,0xb0,0x09,
+0x34,0x42,0x01,0x10,0xac,0x43,0x00,0x00,0x8c,0x86,0x00,0x08,0x3c,0x02,0xb0,0x09,
+0x34,0x42,0x01,0x14,0xa4,0x46,0x00,0x00,0x8c,0x85,0x00,0x0c,0x8c,0x82,0x00,0x08,
+0x3c,0x06,0xb0,0x09,0x00,0x05,0x2c,0x00,0x00,0x02,0x14,0x02,0x00,0xa2,0x28,0x21,
+0x34,0xc6,0x01,0x20,0xac,0xc5,0x00,0x00,0x8c,0x83,0x00,0x0c,0x3c,0x05,0xb0,0x09,
+0x34,0xa5,0x01,0x24,0x00,0x03,0x1c,0x02,0xa4,0xa3,0x00,0x00,0x92,0x42,0x00,0x0a,
+0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x30,0x00,0x02,0x13,0x00,0x24,0x42,0x00,0x04,
+0x30,0x42,0xff,0xff,0xa4,0x62,0x00,0x00,0x86,0x44,0x00,0x0c,0x27,0x83,0x99,0x58,
+0x8f,0xbf,0x00,0x1c,0x00,0x04,0x10,0xc0,0x00,0x44,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x43,0x10,0x21,0x94,0x44,0x00,0x02,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x3c,0x05,0xb0,0x09,0x34,0xa5,0x01,0x32,0xa4,0xa4,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x27,0xbd,0xff,0xe0,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x00,
+0xaf,0xb0,0x00,0x10,0x34,0x42,0x00,0x20,0x00,0xa0,0x80,0x21,0x24,0x63,0x53,0x34,
+0x00,0x05,0x2c,0x43,0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x18,0xac,0x43,0x00,0x00,
+0x10,0xa0,0x00,0x05,0x00,0x80,0x88,0x21,0x8c,0x82,0x00,0x34,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0xb6,0x00,0x00,0x00,0x00,0x32,0x10,0x00,0xff,0x12,0x00,0x00,0x4c,
+0x00,0x00,0x10,0x21,0x24,0x02,0x00,0x08,0x12,0x02,0x00,0xa3,0x2a,0x02,0x00,0x09,
+0x10,0x40,0x00,0x89,0x24,0x02,0x00,0x40,0x24,0x04,0x00,0x02,0x12,0x04,0x00,0x79,
+0x2a,0x02,0x00,0x03,0x10,0x40,0x00,0x69,0x24,0x02,0x00,0x04,0x24,0x02,0x00,0x01,
+0x12,0x02,0x00,0x5a,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x05,0x34,0x42,0x00,0x08,
+0x3c,0x03,0x80,0x00,0xa2,0x20,0x00,0x4e,0xac,0x43,0x00,0x00,0x82,0x24,0x00,0x11,
+0x92,0x27,0x00,0x11,0x10,0x80,0x00,0x4e,0x00,0x00,0x00,0x00,0x92,0x26,0x00,0x0a,
+0x24,0x02,0x00,0x12,0x10,0x46,0x00,0x09,0x30,0xc2,0x00,0xff,0x27,0x83,0xbd,0x40,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x94,0x83,0x00,0x14,0x00,0x00,0x00,0x00,0xa6,0x23,0x00,0x0c,0x3c,0x02,0xb0,0x09,
+0x34,0x42,0x00,0x40,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x03,
+0xa2,0x23,0x00,0x10,0x14,0x60,0x00,0x2b,0x30,0x65,0x00,0x01,0x30,0xc2,0x00,0xff,
+0x27,0x83,0xbd,0x40,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x82,0x23,0x00,0x12,0x90,0x82,0x00,0x16,0x00,0x00,0x00,0x00,0x00,0x02,0x11,0x42,
+0x30,0x42,0x00,0x01,0x00,0x62,0x18,0x21,0x00,0x03,0x26,0x00,0x14,0x80,0x00,0x18,
+0xa2,0x23,0x00,0x12,0x00,0x07,0x16,0x00,0x14,0x40,0x00,0x11,0x24,0x02,0x00,0x01,
+0x96,0x23,0x00,0x0c,0x27,0x84,0x99,0x50,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x80,0x45,0x00,0x06,0x00,0x03,0x1a,0x00,
+0x3c,0x02,0xb0,0x00,0x00,0x65,0x18,0x21,0x00,0x62,0x18,0x21,0x90,0x64,0x00,0x00,
+0x90,0x62,0x00,0x04,0xa2,0x20,0x00,0x15,0xa3,0x80,0x95,0x14,0x24,0x02,0x00,0x01,
+0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,
+0x0c,0x00,0x14,0x6a,0x02,0x20,0x20,0x21,0x92,0x27,0x00,0x11,0x08,0x00,0x15,0x1a,
+0x00,0x07,0x16,0x00,0x0c,0x00,0x14,0x0b,0x02,0x20,0x20,0x21,0x86,0x23,0x00,0x0c,
+0x27,0x84,0x99,0x48,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x44,0x20,0x21,0x90,0x85,0x00,0x07,0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,
+0xa2,0x25,0x00,0x13,0x90,0x83,0x00,0x07,0x08,0x00,0x15,0x32,0xa0,0x43,0x00,0x02,
+0x92,0x26,0x00,0x0a,0x08,0x00,0x14,0xfb,0x30,0xc2,0x00,0xff,0x8e,0x22,0x00,0x24,
+0x00,0x00,0x00,0x00,0x10,0x50,0x00,0x07,0xa2,0x20,0x00,0x08,0x24,0x02,0x00,0x07,
+0xa2,0x22,0x00,0x0a,0x92,0x22,0x00,0x27,0xae,0x20,0x00,0x24,0x08,0x00,0x14,0xee,
+0xa2,0x22,0x00,0x04,0x08,0x00,0x15,0x4c,0x24,0x02,0x00,0x06,0x16,0x02,0xff,0x9b,
+0x3c,0x02,0xb0,0x05,0x8e,0x23,0x00,0x2c,0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x07,
+0xa2,0x24,0x00,0x08,0x24,0x02,0x00,0x03,0xa2,0x22,0x00,0x0a,0x92,0x22,0x00,0x2f,
+0xae,0x20,0x00,0x2c,0x08,0x00,0x14,0xee,0xa2,0x22,0x00,0x06,0x08,0x00,0x15,0x5b,
+0xa2,0x20,0x00,0x0a,0x8e,0x22,0x00,0x28,0x24,0x03,0x00,0x01,0x24,0x04,0x00,0x01,
+0x10,0x44,0x00,0x07,0xa2,0x23,0x00,0x08,0x24,0x02,0x00,0x05,0xa2,0x22,0x00,0x0a,
+0x92,0x22,0x00,0x2b,0xae,0x20,0x00,0x28,0x08,0x00,0x14,0xee,0xa2,0x22,0x00,0x05,
+0x08,0x00,0x15,0x67,0x24,0x02,0x00,0x04,0x12,0x02,0x00,0x12,0x2a,0x02,0x00,0x41,
+0x10,0x40,0x00,0x09,0x24,0x02,0x00,0x80,0x24,0x02,0x00,0x20,0x16,0x02,0xff,0x7b,
+0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x12,0xa2,0x22,0x00,0x0a,0xa2,0x22,0x00,0x08,
+0x08,0x00,0x14,0xee,0xae,0x20,0x00,0x3c,0x16,0x02,0xff,0x74,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x10,0xa2,0x22,0x00,0x0a,0xa2,0x22,0x00,0x08,0x08,0x00,0x14,0xee,
+0xae,0x20,0x00,0x34,0x24,0x02,0x00,0x11,0xa2,0x22,0x00,0x0a,0xa2,0x22,0x00,0x08,
+0x08,0x00,0x14,0xee,0xae,0x20,0x00,0x38,0x8e,0x24,0x00,0x30,0x24,0x02,0x00,0x03,
+0x24,0x03,0x00,0x01,0x10,0x83,0x00,0x07,0xa2,0x22,0x00,0x08,0x24,0x02,0x00,0x02,
+0xa2,0x22,0x00,0x0a,0x92,0x22,0x00,0x33,0xae,0x20,0x00,0x30,0x08,0x00,0x14,0xee,
+0xa2,0x22,0x00,0x07,0x08,0x00,0x15,0x8d,0xa2,0x24,0x00,0x0a,0x8f,0x84,0xbd,0x80,
+0xae,0x20,0x00,0x34,0x94,0x85,0x00,0x14,0x0c,0x00,0x23,0x34,0x32,0x10,0x00,0xff,
+0x08,0x00,0x14,0xdf,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x24,0x42,0x56,0x68,0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,0x80,0xa2,0x00,0x15,
+0x3c,0x06,0xb0,0x05,0x10,0x40,0x00,0x0a,0x34,0xc6,0x02,0x54,0x83,0x83,0x95,0x14,
+0x00,0x00,0x00,0x00,0xac,0x83,0x00,0x24,0x8c,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0x17,0x42,0x30,0x42,0x00,0x01,0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x28,
+0x8c,0x82,0x00,0x2c,0x3c,0x06,0xb0,0x05,0x34,0xc6,0x04,0x50,0x00,0x02,0x18,0x43,
+0x30,0x63,0x00,0x01,0x10,0x40,0x00,0x04,0x30,0x45,0x00,0x01,0xac,0x83,0x00,0x28,
+0x03,0xe0,0x00,0x08,0xac,0x85,0x00,0x24,0x90,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0x30,0x43,0x00,0x02,0x30,0x42,0x00,0x01,0xac,0x83,0x00,0x28,
+0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x24,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x27,0xbd,0xff,0xd8,0x34,0x63,0x00,0x20,0x24,0x42,0x56,0xf8,0xac,0x62,0x00,0x00,
+0xaf,0xb1,0x00,0x1c,0xaf,0xbf,0x00,0x20,0xaf,0xb0,0x00,0x18,0x90,0xa6,0x00,0x0a,
+0x27,0x83,0xbd,0x40,0x00,0xa0,0x88,0x21,0x00,0x06,0x10,0x80,0x00,0x43,0x10,0x21,
+0x8c,0x50,0x00,0x00,0x80,0xa5,0x00,0x11,0x92,0x03,0x00,0x12,0x10,0xa0,0x00,0x04,
+0xa2,0x20,0x00,0x15,0x24,0x02,0x00,0x12,0x10,0xc2,0x00,0xda,0x00,0x00,0x00,0x00,
+0x82,0x22,0x00,0x12,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x67,0x00,0x00,0x00,0x00,
+0xa2,0x20,0x00,0x12,0xa2,0x00,0x00,0x19,0x86,0x23,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x60,
+0x00,0x43,0x10,0x21,0xa0,0x40,0x00,0x00,0x92,0x03,0x00,0x16,0x00,0x00,0x00,0x00,
+0x30,0x63,0x00,0xdf,0xa2,0x03,0x00,0x16,0x82,0x02,0x00,0x12,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x20,0x00,0x00,0x00,0x00,0x92,0x23,0x00,0x08,0x00,0x00,0x00,0x00,
+0x14,0x60,0x00,0x45,0x24,0x02,0x00,0x01,0xa2,0x20,0x00,0x04,0x92,0x08,0x00,0x04,
+0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x1e,0x24,0x02,0x00,0x01,0x92,0x07,0x00,0x0a,
+0xa2,0x02,0x00,0x17,0x92,0x02,0x00,0x16,0x30,0xe3,0x00,0xff,0x30,0x42,0x00,0xe4,
+0x10,0x60,0x00,0x03,0xa2,0x02,0x00,0x16,0x34,0x42,0x00,0x01,0xa2,0x02,0x00,0x16,
+0x11,0x00,0x00,0x05,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x16,0x00,0x00,0x00,0x00,
+0x34,0x42,0x00,0x02,0xa2,0x02,0x00,0x16,0x92,0x02,0x00,0x17,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x08,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x06,0x00,0x00,0x00,0x00,
+0xa6,0x02,0x00,0x14,0x8f,0xbf,0x00,0x20,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x28,0x96,0x02,0x00,0x00,0x08,0x00,0x16,0x09,0xa6,0x02,0x00,0x14,
+0x92,0x07,0x00,0x0a,0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x03,0x00,0x00,0x00,0x00,
+0x08,0x00,0x15,0xf5,0xa2,0x00,0x00,0x17,0x96,0x04,0x00,0x00,0x96,0x05,0x00,0x06,
+0x27,0x86,0x99,0x40,0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x05,0x10,0xc0,
+0x00,0x45,0x10,0x21,0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x00,0x02,0x10,0x80,
+0x00,0x46,0x10,0x21,0x8c,0x66,0x00,0x08,0x8c,0x45,0x00,0x08,0x3c,0x03,0x80,0x00,
+0x00,0xc3,0x20,0x24,0x10,0x80,0x00,0x08,0x00,0xa3,0x10,0x24,0x10,0x40,0x00,0x04,
+0x00,0x00,0x18,0x21,0x10,0x80,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0xa6,0x18,0x2b,
+0x08,0x00,0x15,0xf5,0xa2,0x03,0x00,0x17,0x10,0x40,0xff,0xfd,0x00,0xa6,0x18,0x2b,
+0x08,0x00,0x16,0x29,0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x09,0x24,0x02,0x00,0x02,
+0x10,0x62,0x00,0x05,0x24,0x02,0x00,0x03,0x14,0x62,0xff,0xb8,0x00,0x00,0x00,0x00,
+0x08,0x00,0x15,0xef,0xa2,0x20,0x00,0x07,0x08,0x00,0x15,0xef,0xa2,0x20,0x00,0x06,
+0x08,0x00,0x15,0xef,0xa2,0x20,0x00,0x05,0x82,0x22,0x00,0x10,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x69,0x2c,0x62,0x00,0x02,0x10,0x40,0x00,0x49,0x3c,0x02,0xb0,0x09,
+0x92,0x25,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0xa6,0x00,0xff,0x2c,0xc2,0x00,0x04,
+0x10,0x40,0x00,0x3b,0x2c,0xc2,0x00,0x10,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,
+0x90,0x83,0x00,0x00,0x24,0x02,0x00,0x01,0x00,0xc2,0x10,0x04,0x00,0x02,0x10,0x27,
+0x00,0x62,0x18,0x24,0xa0,0x83,0x00,0x00,0x86,0x23,0x00,0x0c,0x96,0x26,0x00,0x0c,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x28,0x80,0x27,0x83,0x99,0x44,
+0x00,0xa3,0x18,0x21,0x8c,0x64,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x10,0x10,0x40,0x00,0x18,0x24,0x07,0x00,0x01,
+0x93,0x82,0x94,0x51,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x0a,
+0x24,0x05,0x00,0x24,0x00,0x06,0x2c,0x00,0x00,0x05,0x2c,0x03,0x0c,0x00,0x23,0x34,
+0x02,0x00,0x20,0x21,0x92,0x02,0x00,0x16,0xa2,0x00,0x00,0x12,0x30,0x42,0x00,0xe7,
+0x08,0x00,0x15,0xe6,0xa2,0x02,0x00,0x16,0xf0,0xc5,0x00,0x06,0x00,0x00,0x28,0x12,
+0x27,0x82,0x99,0x40,0x00,0xa2,0x28,0x21,0x0c,0x00,0x01,0x49,0x3c,0x04,0x00,0x80,
+0x96,0x26,0x00,0x0c,0x08,0x00,0x16,0x66,0x00,0x06,0x2c,0x00,0x27,0x83,0x99,0x50,
+0x27,0x82,0x99,0x58,0x00,0xa2,0x10,0x21,0x00,0xa3,0x18,0x21,0x90,0x44,0x00,0x00,
+0x90,0x65,0x00,0x05,0x93,0x82,0x80,0x10,0x00,0x00,0x30,0x21,0x0c,0x00,0x29,0x5e,
+0xaf,0xa2,0x00,0x10,0x96,0x26,0x00,0x0c,0x08,0x00,0x16,0x60,0x00,0x00,0x00,0x00,
+0x14,0x40,0xff,0xcd,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,
+0x30,0xa5,0x00,0x0f,0x24,0x02,0x00,0x80,0x08,0x00,0x16,0x4f,0x00,0xa2,0x10,0x07,
+0x86,0x26,0x00,0x0c,0x3c,0x03,0xb0,0x09,0x34,0x42,0x01,0x72,0x34,0x63,0x01,0x78,
+0x94,0x47,0x00,0x00,0x8c,0x65,0x00,0x00,0x00,0x06,0x10,0xc0,0x00,0x46,0x10,0x21,
+0x3c,0x04,0xb0,0x09,0xae,0x25,0x00,0x1c,0x34,0x84,0x01,0x7c,0x27,0x83,0x99,0x44,
+0x00,0x02,0x10,0x80,0x8c,0x85,0x00,0x00,0x00,0x43,0x10,0x21,0x8c,0x43,0x00,0x18,
+0xae,0x25,0x00,0x20,0xa6,0x27,0x00,0x18,0x8c,0x66,0x00,0x08,0x02,0x20,0x20,0x21,
+0x0c,0x00,0x16,0xb6,0x00,0x00,0x28,0x21,0x86,0x25,0x00,0x18,0x8e,0x26,0x00,0x1c,
+0x8e,0x27,0x00,0x20,0x02,0x20,0x20,0x21,0x0c,0x00,0x24,0x36,0xaf,0xa2,0x00,0x10,
+0x08,0x00,0x15,0xe6,0xa2,0x02,0x00,0x12,0x92,0x22,0x00,0x08,0x08,0x00,0x15,0xe6,
+0xa2,0x22,0x00,0x09,0xa2,0x20,0x00,0x11,0x80,0x82,0x00,0x50,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x03,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xd0,0xac,0x40,0x00,0x00,
+0x08,0x00,0x15,0xe6,0xa0,0x80,0x00,0x50,0x94,0x8a,0x00,0x0c,0x24,0x03,0x00,0x24,
+0x00,0x80,0x70,0x21,0x3c,0x02,0x80,0x00,0x3c,0x04,0xb0,0x03,0x24,0x42,0x5a,0xd8,
+0xf1,0x43,0x00,0x06,0x34,0x84,0x00,0x20,0x00,0x00,0x18,0x12,0x00,0xa0,0x68,0x21,
+0xac,0x82,0x00,0x00,0x27,0x85,0x99,0x50,0x27,0x82,0x99,0x4f,0x27,0xbd,0xff,0xf8,
+0x00,0x62,0x60,0x21,0x00,0x65,0x58,0x21,0x00,0x00,0xc0,0x21,0x11,0xa0,0x00,0xcc,
+0x00,0x00,0x78,0x21,0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,0x91,0x87,0x00,0x00,
+0x80,0x48,0x00,0x04,0x03,0xa0,0x60,0x21,0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x48,0x80,0x27,0x83,0x99,0x44,
+0xa3,0xa7,0x00,0x00,0x01,0x23,0x18,0x21,0x8c,0x64,0x00,0x18,0x25,0x02,0xff,0xff,
+0x00,0x48,0x40,0x0b,0x8c,0x83,0x00,0x04,0x2d,0x05,0x00,0x07,0x24,0x02,0x00,0x06,
+0x30,0x63,0x00,0x08,0x14,0x60,0x00,0x35,0x00,0x45,0x40,0x0a,0x93,0xa7,0x00,0x00,
+0x27,0x82,0x99,0x58,0x01,0x22,0x10,0x21,0x30,0xe3,0x00,0xf0,0x38,0x63,0x00,0x50,
+0x30,0xe5,0x00,0xff,0x00,0x05,0x20,0x2b,0x00,0x03,0x18,0x2b,0x00,0x64,0x18,0x24,
+0x90,0x49,0x00,0x00,0x10,0x60,0x00,0x16,0x30,0xe4,0x00,0x0f,0x24,0x02,0x00,0x04,
+0x10,0xa2,0x00,0x9d,0x00,0x00,0x00,0x00,0x11,0xa0,0x00,0x3a,0x2c,0xa2,0x00,0x0c,
+0x10,0x40,0x00,0x02,0x24,0x84,0x00,0x0c,0x00,0xe0,0x20,0x21,0x30,0x84,0x00,0xff,
+0x00,0x04,0x10,0x40,0x27,0x83,0xc4,0x5c,0x00,0x44,0x10,0x21,0x00,0x43,0x10,0x21,
+0x90,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0xe3,0x00,0x0c,0xa3,0xa7,0x00,0x00,
+0x10,0x60,0x00,0x02,0x24,0xe2,0x00,0x04,0x00,0xe0,0x10,0x21,0xa3,0xa2,0x00,0x00,
+0x91,0x65,0x00,0x00,0x91,0x82,0x00,0x00,0x30,0xa3,0x00,0xff,0x00,0x62,0x10,0x2b,
+0x10,0x40,0x00,0x0e,0x2c,0x62,0x00,0x0c,0x14,0x40,0x00,0x03,0x00,0x60,0x20,0x21,
+0x30,0xa2,0x00,0x0f,0x24,0x44,0x00,0x0c,0x00,0x04,0x10,0x40,0x00,0x44,0x20,0x21,
+0x27,0x83,0xc4,0x5c,0x00,0x83,0x18,0x21,0x90,0x62,0x00,0x02,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x05,0x00,0x09,0x11,0x00,0xa1,0x85,0x00,0x00,0x93,0xa2,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x08,0x00,0x49,0x10,0x23,0x00,0x02,0x10,0x80,
+0x00,0x49,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x27,0x83,0xbd,0xe8,
+0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x83,0x00,0x0c,
+0x14,0x60,0x00,0x06,0x00,0x80,0x10,0x21,0x00,0x18,0x10,0x40,0x00,0x4f,0x10,0x21,
+0x00,0x02,0x11,0x00,0x00,0x82,0x10,0x21,0x24,0x42,0x00,0x04,0x08,0x00,0x17,0x17,
+0xa1,0x82,0x00,0x00,0x8f,0x8d,0x87,0x70,0x00,0x00,0x00,0x00,0x01,0xa8,0x10,0x21,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x60,0xff,0xd1,0x00,0x00,0x28,0x21,
+0x00,0x06,0x74,0x82,0x30,0xe2,0x00,0xff,0x2c,0x42,0x00,0x0c,0x14,0x40,0x00,0x03,
+0x00,0xe0,0x10,0x21,0x30,0xe2,0x00,0x0f,0x24,0x42,0x00,0x0c,0x30,0x44,0x00,0xff,
+0xa3,0xa2,0x00,0x00,0x24,0x02,0x00,0x0c,0x10,0x82,0x00,0x0d,0x00,0x09,0x11,0x00,
+0x00,0x49,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x04,0x18,0x40,0x00,0x49,0x10,0x23,
+0x00,0x64,0x18,0x21,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x27,0x84,0xbd,0xe8,
+0x00,0x44,0x10,0x21,0x90,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x00,
+0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x44,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x18,
+0x00,0x00,0x00,0x00,0x8c,0x83,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x10,
+0x14,0x60,0x00,0x33,0x00,0x06,0x14,0x42,0x00,0x09,0x11,0x00,0x00,0x49,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x49,0x10,0x23,0x27,0x83,0xbe,0xb8,0x00,0x02,0x10,0x80,
+0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x04,0x90,0x43,0x00,0x05,0x00,0x00,0x00,0x00,
+0x00,0x64,0xc0,0x24,0x93,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0xe2,0x00,0x0f,
+0x10,0x40,0x00,0x0f,0x31,0xcf,0x00,0x01,0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x84,0x99,0x40,
+0x00,0x44,0x10,0x21,0x84,0x43,0x00,0x06,0x00,0x00,0x00,0x00,0x28,0x63,0x06,0x41,
+0x14,0x60,0x00,0x04,0x30,0xe2,0x00,0xff,0x24,0x07,0x00,0x0f,0xa3,0xa7,0x00,0x00,
+0x30,0xe2,0x00,0xff,0x2c,0x42,0x00,0x0c,0x14,0x40,0x00,0x06,0x00,0xe0,0x10,0x21,
+0x00,0x18,0x10,0x40,0x00,0x4f,0x10,0x21,0x00,0x02,0x11,0x00,0x00,0x47,0x10,0x21,
+0x24,0x42,0x00,0x04,0xa3,0xa2,0x00,0x00,0x00,0x40,0x38,0x21,0x01,0xa8,0x10,0x21,
+0x90,0x43,0x00,0x00,0x24,0xa4,0x00,0x01,0x30,0x85,0xff,0xff,0x00,0xa3,0x18,0x2b,
+0x14,0x60,0xff,0xad,0x30,0xe2,0x00,0xff,0x08,0x00,0x17,0x04,0x00,0x00,0x00,0x00,
+0x08,0x00,0x17,0x65,0x30,0x58,0x00,0x01,0x81,0xc2,0x00,0x48,0x00,0x00,0x00,0x00,
+0x10,0x40,0xff,0x73,0x00,0x00,0x00,0x00,0x08,0x00,0x16,0xf2,0x00,0x00,0x00,0x00,
+0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,0x80,0x48,0x00,0x05,0x91,0x67,0x00,0x00,
+0x08,0x00,0x16,0xd2,0x03,0xa0,0x58,0x21,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x5e,0x78,0x03,0xe0,0x00,0x08,0xac,0x62,0x00,0x00,
+0x27,0xbd,0xff,0xc0,0xaf,0xb7,0x00,0x34,0xaf,0xb6,0x00,0x30,0xaf,0xb5,0x00,0x2c,
+0xaf,0xb4,0x00,0x28,0xaf,0xb3,0x00,0x24,0xaf,0xb2,0x00,0x20,0xaf,0xbf,0x00,0x3c,
+0xaf,0xbe,0x00,0x38,0xaf,0xb1,0x00,0x1c,0xaf,0xb0,0x00,0x18,0x84,0x82,0x00,0x0c,
+0x27,0x93,0x99,0x44,0x3c,0x05,0xb0,0x03,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,
+0x00,0x03,0x18,0x80,0x00,0x73,0x10,0x21,0x8c,0x5e,0x00,0x18,0x3c,0x02,0x80,0x00,
+0x34,0xa5,0x00,0x20,0x24,0x42,0x5e,0x90,0xac,0xa2,0x00,0x00,0x8f,0xd0,0x00,0x08,
+0x27,0x95,0x99,0x50,0x00,0x75,0x18,0x21,0x00,0x00,0x28,0x21,0x02,0x00,0x30,0x21,
+0x90,0x71,0x00,0x00,0x0c,0x00,0x16,0xb6,0x00,0x80,0xb0,0x21,0x00,0x40,0x90,0x21,
+0x00,0x10,0x14,0x42,0x30,0x54,0x00,0x01,0x02,0x40,0x20,0x21,0x00,0x10,0x14,0x82,
+0x02,0x80,0x28,0x21,0x12,0x51,0x00,0x23,0x00,0x10,0xbf,0xc2,0x86,0xc3,0x00,0x0c,
+0x30,0x50,0x00,0x01,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x55,0x10,0x21,0xa0,0x52,0x00,0x00,0x86,0xc3,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x53,0x30,0x21,
+0x8c,0xc7,0x00,0x18,0x27,0x83,0x99,0x40,0x00,0x43,0x10,0x21,0x8c,0xe3,0x00,0x04,
+0x84,0x46,0x00,0x06,0x00,0x03,0x19,0x42,0x0c,0x00,0x10,0x80,0x30,0x73,0x00,0x01,
+0x00,0x40,0x88,0x21,0x02,0x40,0x20,0x21,0x02,0x80,0x28,0x21,0x16,0xe0,0x00,0x10,
+0x02,0x00,0x30,0x21,0x86,0xc2,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x18,0xc0,
+0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x80,0x27,0x82,0x99,0x48,0x00,0x62,0x18,0x21,
+0xa4,0x71,0x00,0x04,0x7b,0xbe,0x01,0xfc,0x7b,0xb6,0x01,0xbc,0x7b,0xb4,0x01,0x7c,
+0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,
+0x86,0xc3,0x00,0x0c,0xaf,0xb3,0x00,0x10,0xaf,0xa0,0x00,0x14,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x55,0x10,0x21,0x80,0x47,0x00,0x06,
+0x00,0x00,0x00,0x00,0x24,0xe7,0x00,0x02,0x00,0x07,0x17,0xc2,0x00,0xe2,0x38,0x21,
+0x00,0x07,0x38,0x43,0x00,0x07,0x38,0x40,0x0c,0x00,0x10,0xa7,0x03,0xc7,0x38,0x21,
+0x08,0x00,0x17,0xe5,0x02,0x22,0x88,0x21,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x27,0xbd,0xff,0xd0,0x34,0x63,0x00,0x20,0x24,0x42,0x60,0x18,0xaf,0xb2,0x00,0x20,
+0xac,0x62,0x00,0x00,0xaf,0xbf,0x00,0x28,0xaf,0xb3,0x00,0x24,0xaf,0xb1,0x00,0x1c,
+0xaf,0xb0,0x00,0x18,0x3c,0x02,0xb0,0x03,0x90,0x83,0x00,0x0a,0x34,0x42,0x01,0x04,
+0x94,0x45,0x00,0x00,0x00,0x03,0x18,0x80,0x27,0x82,0xbd,0x40,0x00,0x62,0x18,0x21,
+0x30,0xa6,0xff,0xff,0x8c,0x71,0x00,0x00,0x80,0x85,0x00,0x12,0x30,0xc9,0x00,0xff,
+0x00,0x06,0x32,0x02,0xa4,0x86,0x00,0x44,0xa4,0x89,0x00,0x46,0x82,0x22,0x00,0x12,
+0x00,0x80,0x90,0x21,0x10,0xa0,0x00,0x1b,0xa0,0x80,0x00,0x15,0x00,0xc5,0x10,0x2a,
+0x10,0x40,0x00,0x14,0x00,0x00,0x00,0x00,0xa2,0x20,0x00,0x19,0x84,0x83,0x00,0x0c,
+0x00,0x00,0x00,0x00,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x83,0x99,0x60,0x00,0x43,0x10,0x21,0xa0,0x40,0x00,0x00,0xa0,0x80,0x00,0x12,
+0x92,0x22,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xdf,0xa2,0x22,0x00,0x16,
+0x8f,0xbf,0x00,0x28,0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x30,0x0c,0x00,0x17,0x9e,0x00,0x00,0x00,0x00,0x08,0x00,0x18,0x34,
+0x00,0x00,0x00,0x00,0x28,0x42,0x00,0x02,0x10,0x40,0x01,0x76,0x00,0x00,0x28,0x21,
+0x94,0x87,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x21,0x00,0x02,0x14,0x00,
+0x00,0x02,0x14,0x03,0x00,0x07,0x24,0x00,0x00,0x04,0x24,0x03,0x00,0x02,0x18,0xc0,
+0x00,0x62,0x18,0x21,0x00,0x04,0x28,0xc0,0x00,0xa4,0x28,0x21,0x27,0x82,0x99,0x60,
+0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,0x00,0x05,0x28,0x80,0x27,0x82,0x99,0x48,
+0x00,0xa2,0x10,0x21,0x8c,0x68,0x00,0x00,0x80,0x44,0x00,0x06,0x27,0x82,0x99,0x50,
+0x00,0x08,0x1d,0x02,0x00,0xa2,0x28,0x21,0x38,0x84,0x00,0x00,0x30,0x63,0x00,0x01,
+0x01,0x24,0x30,0x0b,0x80,0xaa,0x00,0x04,0x80,0xa9,0x00,0x05,0x10,0x60,0x00,0x02,
+0x00,0x08,0x14,0x02,0x30,0x46,0x00,0x0f,0x15,0x20,0x00,0x28,0x01,0x49,0x10,0x21,
+0x15,0x40,0x00,0x11,0x30,0xe3,0xff,0xff,0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,
+0x30,0xa8,0x00,0xff,0x2d,0x02,0x00,0x04,0x10,0x40,0x01,0x46,0x2d,0x02,0x00,0x10,
+0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x24,0x02,0x00,0x01,
+0x01,0x02,0x10,0x04,0x00,0x62,0x18,0x25,0xa0,0x83,0x00,0x00,0x96,0x47,0x00,0x0c,
+0x00,0x00,0x00,0x00,0x30,0xe3,0xff,0xff,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x27,0x84,0x99,0x50,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x80,0x45,0x00,0x06,
+0x00,0x03,0x1a,0x00,0x3c,0x04,0xb0,0x00,0x00,0x65,0x18,0x21,0x00,0x64,0x20,0x21,
+0x94,0x82,0x00,0x00,0x82,0x43,0x00,0x10,0x00,0x02,0x14,0x00,0x14,0x60,0x00,0x06,
+0x00,0x02,0x3c,0x03,0x30,0xe2,0x00,0x04,0x14,0x40,0x00,0x04,0x01,0x49,0x10,0x21,
+0x34,0xe2,0x08,0x00,0xa4,0x82,0x00,0x00,0x01,0x49,0x10,0x21,0x00,0x02,0x16,0x00,
+0x00,0x02,0x16,0x03,0x00,0x46,0x10,0x2a,0x10,0x40,0x00,0x7c,0x00,0x00,0x00,0x00,
+0x82,0x42,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0e,0x00,0x00,0x00,0x00,
+0x86,0x43,0x00,0x0c,0x25,0x44,0x00,0x01,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,0xa0,0x44,0x00,0x04,
+0x92,0x23,0x00,0x16,0x02,0x40,0x20,0x21,0x30,0x63,0x00,0xfb,0x08,0x00,0x18,0x39,
+0xa2,0x23,0x00,0x16,0x86,0x43,0x00,0x0c,0x25,0x24,0x00,0x01,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,
+0xa0,0x44,0x00,0x05,0x86,0x45,0x00,0x0c,0x0c,0x00,0x26,0xae,0x02,0x20,0x20,0x21,
+0x10,0x40,0x00,0x5a,0x00,0x00,0x00,0x00,0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,
+0x30,0xa6,0x00,0xff,0x2c,0xc2,0x00,0x04,0x10,0x40,0x00,0x4c,0x2c,0xc2,0x00,0x10,
+0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x24,0x02,0x00,0x01,
+0x00,0xc2,0x10,0x04,0x00,0x02,0x10,0x27,0x00,0x62,0x18,0x24,0xa0,0x83,0x00,0x00,
+0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0xa5,0x00,0xff,0x14,0xa0,0x00,0x33,
+0x24,0x02,0x00,0x01,0xa2,0x40,0x00,0x04,0x92,0x22,0x00,0x04,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x0c,0x24,0x02,0x00,0x01,0xa2,0x22,0x00,0x17,0x92,0x22,0x00,0x17,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0x96,0x22,0x00,0x06,
+0x08,0x00,0x18,0x34,0xa6,0x22,0x00,0x14,0x96,0x22,0x00,0x00,0x08,0x00,0x18,0x34,
+0xa6,0x22,0x00,0x14,0x92,0x22,0x00,0x0a,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x03,
+0x00,0x00,0x00,0x00,0x08,0x00,0x18,0xc3,0xa2,0x20,0x00,0x17,0x96,0x24,0x00,0x00,
+0x96,0x25,0x00,0x06,0x27,0x86,0x99,0x40,0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,
+0x00,0x05,0x10,0xc0,0x00,0x45,0x10,0x21,0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,
+0x00,0x02,0x10,0x80,0x00,0x46,0x10,0x21,0x8c,0x65,0x00,0x08,0x8c,0x44,0x00,0x08,
+0x3c,0x03,0x80,0x00,0x00,0xa3,0x30,0x24,0x10,0xc0,0x00,0x08,0x00,0x83,0x10,0x24,
+0x10,0x40,0x00,0x04,0x00,0x00,0x18,0x21,0x10,0xc0,0x00,0x02,0x24,0x03,0x00,0x01,
+0x00,0x85,0x18,0x2b,0x08,0x00,0x18,0xc3,0xa2,0x23,0x00,0x17,0x10,0x40,0xff,0xfd,
+0x00,0x85,0x18,0x2b,0x08,0x00,0x18,0xe6,0x00,0x00,0x00,0x00,0x10,0xa2,0x00,0x09,
+0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x05,0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xca,
+0x00,0x00,0x00,0x00,0x08,0x00,0x18,0xbe,0xa2,0x40,0x00,0x07,0x08,0x00,0x18,0xbe,
+0xa2,0x40,0x00,0x06,0x08,0x00,0x18,0xbe,0xa2,0x40,0x00,0x05,0x14,0x40,0xff,0xbe,
+0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x30,0xa5,0x00,0x0f,
+0x24,0x02,0x00,0x80,0x08,0x00,0x18,0xb5,0x00,0xa2,0x10,0x07,0x0c,0x00,0x17,0xa4,
+0x02,0x40,0x20,0x21,0x08,0x00,0x18,0x34,0x00,0x00,0x00,0x00,0x92,0x45,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0xa6,0x00,0xff,0x2c,0xc2,0x00,0x04,0x10,0x40,0x00,0x99,
+0x2c,0xc2,0x00,0x10,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,
+0x24,0x02,0x00,0x01,0x00,0xc2,0x10,0x04,0x00,0x02,0x10,0x27,0x00,0x62,0x18,0x24,
+0xa0,0x83,0x00,0x00,0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0xa5,0x00,0xff,
+0x14,0xa0,0x00,0x80,0x24,0x02,0x00,0x01,0xa2,0x40,0x00,0x04,0x86,0x43,0x00,0x0c,
+0x27,0x93,0x99,0x44,0x96,0x47,0x00,0x0c,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x28,0x80,0x00,0xb3,0x18,0x21,0x8c,0x64,0x00,0x18,0x00,0x00,0x00,0x00,
+0x8c,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x10,0x10,0x40,0x00,0x64,
+0x00,0x00,0x30,0x21,0x00,0x07,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x53,0x10,0x21,0x8c,0x43,0x00,0x18,
+0x93,0x82,0x94,0x51,0x8c,0x64,0x00,0x04,0x30,0x42,0x00,0x01,0x00,0x04,0x21,0x42,
+0x14,0x40,0x00,0x4d,0x30,0x90,0x00,0x01,0x00,0x07,0x2c,0x00,0x00,0x05,0x2c,0x03,
+0x0c,0x00,0x23,0x34,0x02,0x20,0x20,0x21,0x96,0x26,0x00,0x06,0x12,0x00,0x00,0x14,
+0x30,0xc5,0xff,0xff,0x02,0x60,0x90,0x21,0x00,0x05,0x10,0xc0,0x00,0x45,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x52,0x18,0x21,0x92,0x22,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x0b,0x02,0x20,0x20,0x21,0x8c,0x63,0x00,0x18,0x00,0x00,0x00,0x00,
+0x8c,0x62,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x02,0x11,0x42,0x0c,0x00,0x23,0x34,
+0x30,0x50,0x00,0x01,0x96,0x26,0x00,0x06,0x16,0x00,0xff,0xef,0x30,0xc5,0xff,0xff,
+0x92,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x0d,0x24,0x02,0x00,0x01,
+0xa2,0x22,0x00,0x17,0x92,0x22,0x00,0x17,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x05,
+0x00,0x00,0x00,0x00,0xa6,0x26,0x00,0x14,0x92,0x22,0x00,0x16,0x08,0x00,0x18,0x33,
+0x30,0x42,0x00,0xc3,0x96,0x22,0x00,0x00,0x08,0x00,0x19,0x5a,0xa6,0x22,0x00,0x14,
+0x92,0x22,0x00,0x0a,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x03,0x00,0x00,0x00,0x00,
+0x08,0x00,0x19,0x55,0xa2,0x20,0x00,0x17,0x96,0x24,0x00,0x00,0x30,0xc5,0xff,0xff,
+0x00,0x05,0x18,0xc0,0x00,0x04,0x10,0xc0,0x00,0x44,0x10,0x21,0x00,0x65,0x18,0x21,
+0x27,0x84,0x99,0x40,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x00,0x03,0x18,0x80,
+0x8c,0x45,0x00,0x08,0x00,0x64,0x18,0x21,0x8c,0x64,0x00,0x08,0x3c,0x02,0x80,0x00,
+0x00,0xa2,0x38,0x24,0x10,0xe0,0x00,0x08,0x00,0x82,0x10,0x24,0x10,0x40,0x00,0x04,
+0x00,0x00,0x18,0x21,0x10,0xe0,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0x85,0x18,0x2b,
+0x08,0x00,0x19,0x55,0xa2,0x23,0x00,0x17,0x10,0x40,0xff,0xfd,0x00,0x85,0x18,0x2b,
+0x08,0x00,0x19,0x79,0x00,0x00,0x00,0x00,0x24,0x05,0x00,0x24,0xf0,0xe5,0x00,0x06,
+0x00,0x00,0x28,0x12,0x27,0x82,0x99,0x40,0x00,0xa2,0x28,0x21,0x0c,0x00,0x01,0x49,
+0x00,0x00,0x20,0x21,0x96,0x47,0x00,0x0c,0x08,0x00,0x19,0x37,0x00,0x07,0x2c,0x00,
+0x27,0x83,0x99,0x50,0x27,0x82,0x99,0x58,0x00,0xa2,0x10,0x21,0x00,0xa3,0x18,0x21,
+0x90,0x44,0x00,0x00,0x90,0x65,0x00,0x05,0x93,0x82,0x80,0x10,0x24,0x07,0x00,0x01,
+0x0c,0x00,0x29,0x5e,0xaf,0xa2,0x00,0x10,0x96,0x47,0x00,0x0c,0x08,0x00,0x19,0x2a,
+0x00,0x07,0x1c,0x00,0x10,0xa2,0x00,0x09,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x05,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0x7d,0x00,0x00,0x00,0x00,0x08,0x00,0x19,0x1b,
+0xa2,0x40,0x00,0x07,0x08,0x00,0x19,0x1b,0xa2,0x40,0x00,0x06,0x08,0x00,0x19,0x1b,
+0xa2,0x40,0x00,0x05,0x14,0x40,0xff,0x71,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,
+0x90,0x83,0x00,0x00,0x30,0xa5,0x00,0x0f,0x24,0x02,0x00,0x80,0x08,0x00,0x19,0x12,
+0x00,0xa2,0x10,0x07,0x14,0x40,0xfe,0xc3,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,
+0x90,0x83,0x00,0x00,0x30,0xa5,0x00,0x0f,0x24,0x02,0x00,0x80,0x08,0x00,0x18,0x6d,
+0x00,0xa2,0x10,0x07,0x84,0x83,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x44,0x00,0x43,0x10,0x21,
+0x8c,0x47,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0xe6,0x00,0x08,0x0c,0x00,0x16,0xb6,
+0x00,0x00,0x00,0x00,0x02,0x40,0x20,0x21,0x00,0x00,0x28,0x21,0x00,0x00,0x30,0x21,
+0x00,0x00,0x38,0x21,0x0c,0x00,0x24,0x36,0xaf,0xa2,0x00,0x10,0x00,0x02,0x1e,0x00,
+0x14,0x60,0xfe,0x6b,0xa2,0x22,0x00,0x12,0x92,0x43,0x00,0x08,0x00,0x00,0x00,0x00,
+0x14,0x60,0x00,0x40,0x24,0x02,0x00,0x01,0xa2,0x40,0x00,0x04,0x92,0x28,0x00,0x04,
+0x00,0x00,0x00,0x00,0x15,0x00,0x00,0x19,0x24,0x02,0x00,0x01,0x92,0x27,0x00,0x0a,
+0xa2,0x22,0x00,0x17,0x92,0x22,0x00,0x17,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x10,
+0x00,0x00,0x00,0x00,0x96,0x22,0x00,0x06,0x00,0x00,0x00,0x00,0xa6,0x22,0x00,0x14,
+0x92,0x22,0x00,0x16,0x30,0xe3,0x00,0xff,0x30,0x42,0x00,0xc0,0x10,0x60,0x00,0x03,
+0xa2,0x22,0x00,0x16,0x34,0x42,0x00,0x01,0xa2,0x22,0x00,0x16,0x11,0x00,0xfe,0x50,
+0x00,0x00,0x00,0x00,0x92,0x22,0x00,0x16,0x08,0x00,0x18,0x33,0x34,0x42,0x00,0x02,
+0x96,0x22,0x00,0x00,0x08,0x00,0x19,0xdc,0xa6,0x22,0x00,0x14,0x92,0x27,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x19,0xd5,
+0xa2,0x20,0x00,0x17,0x96,0x24,0x00,0x00,0x96,0x25,0x00,0x06,0x27,0x86,0x99,0x40,
+0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x05,0x10,0xc0,0x00,0x45,0x10,0x21,
+0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x00,0x02,0x10,0x80,0x00,0x46,0x10,0x21,
+0x8c,0x65,0x00,0x08,0x8c,0x44,0x00,0x08,0x3c,0x03,0x80,0x00,0x00,0xa3,0x30,0x24,
+0x10,0xc0,0x00,0x08,0x00,0x83,0x10,0x24,0x10,0x40,0x00,0x04,0x00,0x00,0x18,0x21,
+0x10,0xc0,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0x85,0x18,0x2b,0x08,0x00,0x19,0xd5,
+0xa2,0x23,0x00,0x17,0x10,0x40,0xff,0xfd,0x00,0x85,0x18,0x2b,0x08,0x00,0x1a,0x04,
+0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x09,0x24,0x02,0x00,0x02,0x10,0x62,0x00,0x05,
+0x24,0x02,0x00,0x03,0x14,0x62,0xff,0xbd,0x00,0x00,0x00,0x00,0x08,0x00,0x19,0xcf,
+0xa2,0x40,0x00,0x07,0x08,0x00,0x19,0xcf,0xa2,0x40,0x00,0x06,0x08,0x00,0x19,0xcf,
+0xa2,0x40,0x00,0x05,0x3c,0x02,0x80,0x00,0x00,0x82,0x30,0x24,0x10,0xc0,0x00,0x08,
+0x00,0xa2,0x18,0x24,0x10,0x60,0x00,0x04,0x00,0x00,0x10,0x21,0x10,0xc0,0x00,0x02,
+0x24,0x02,0x00,0x01,0x00,0xa4,0x10,0x2b,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x10,0x60,0xff,0xfd,0x00,0xa4,0x10,0x2b,0x08,0x00,0x1a,0x1f,0x00,0x00,0x00,0x00,
+0x30,0x82,0xff,0xff,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,0x27,0x84,0x99,0x50,
+0x00,0x03,0x18,0x80,0x00,0x64,0x18,0x21,0x80,0x66,0x00,0x06,0x00,0x02,0x12,0x00,
+0x3c,0x03,0xb0,0x00,0x00,0x46,0x10,0x21,0x00,0x45,0x10,0x21,0x03,0xe0,0x00,0x08,
+0x00,0x43,0x10,0x21,0x27,0xbd,0xff,0xe0,0x30,0x82,0x00,0x7c,0x30,0x84,0xff,0x00,
+0xaf,0xbf,0x00,0x1c,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,
+0x14,0x40,0x00,0x41,0x00,0x04,0x22,0x03,0x24,0x02,0x00,0x04,0x3c,0x10,0xb0,0x03,
+0x8e,0x10,0x00,0x00,0x10,0x82,0x00,0x32,0x24,0x02,0x00,0x08,0x10,0x82,0x00,0x03,
+0x32,0x02,0x00,0x20,0x08,0x00,0x1a,0x45,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x17,
+0x3c,0x02,0xb0,0x06,0x34,0x42,0x80,0x24,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x67,0x00,0xff,0x10,0xe0,0x00,0x23,0x00,0x00,0x88,0x21,0x8f,0x85,0x99,0x20,
+0x00,0x40,0x30,0x21,0x94,0xa2,0x00,0x08,0x8c,0xc3,0x00,0x00,0x26,0x31,0x00,0x01,
+0x24,0x42,0x00,0x02,0x30,0x42,0x01,0xff,0x34,0x63,0x01,0x00,0x02,0x27,0x20,0x2a,
+0xa4,0xa2,0x00,0x08,0x14,0x80,0xff,0xf7,0xac,0xc3,0x00,0x00,0x84,0xa3,0x00,0x08,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x30,0xac,0x43,0x00,0x00,0x27,0x92,0xbd,0x40,
+0x24,0x11,0x00,0x12,0x8e,0x44,0x00,0x00,0x26,0x31,0xff,0xff,0x90,0x82,0x00,0x10,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x03,0x26,0x52,0x00,0x04,0x0c,0x00,0x20,0x9b,
+0x00,0x00,0x00,0x00,0x06,0x21,0xff,0xf7,0x24,0x02,0xff,0xdf,0x02,0x02,0x80,0x24,
+0x3c,0x01,0xb0,0x03,0x0c,0x00,0x1a,0xfd,0xac,0x30,0x00,0x00,0x08,0x00,0x1a,0x45,
+0x00,0x00,0x00,0x00,0x8f,0x85,0x99,0x20,0x08,0x00,0x1a,0x5b,0x00,0x00,0x00,0x00,
+0x24,0x02,0xff,0x95,0x3c,0x03,0xb0,0x03,0x02,0x02,0x80,0x24,0x34,0x63,0x00,0x30,
+0x3c,0x01,0xb0,0x03,0xac,0x30,0x00,0x00,0x0c,0x00,0x1a,0xc6,0xac,0x60,0x00,0x00,
+0x08,0x00,0x1a,0x45,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x50,
+0x08,0x00,0x1a,0x45,0xac,0x46,0x00,0x00,0xaf,0xa7,0x00,0x0c,0xaf,0xa4,0x00,0x00,
+0xaf,0xa5,0x00,0x04,0xaf,0xa6,0x00,0x08,0x27,0xbd,0xfe,0xe8,0x00,0x80,0x28,0x21,
+0x27,0xa6,0x01,0x1c,0x27,0xa4,0x00,0x10,0xaf,0xbf,0x01,0x14,0x0c,0x00,0x2e,0xe2,
+0xaf,0xb0,0x01,0x10,0x00,0x40,0x80,0x21,0x0c,0x00,0x1a,0x95,0x27,0xa4,0x00,0x10,
+0x02,0x00,0x10,0x21,0x8f,0xbf,0x01,0x14,0x8f,0xb0,0x01,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x01,0x18,0x93,0x83,0x87,0x6c,0x27,0xbd,0xff,0xe8,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x14,0x14,0x60,0x00,0x14,0x00,0x80,0x80,0x21,0x80,0x82,0x00,0x00,
+0x90,0x84,0x00,0x00,0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x00,0x04,0x26,0x00,
+0x00,0x04,0x26,0x03,0x30,0x84,0xff,0xff,0x0c,0x00,0x1a,0xb5,0x26,0x10,0x00,0x01,
+0x92,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x60,0xff,0xf8,0x00,0x60,0x20,0x21,
+0x08,0x00,0x1a,0x9f,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x14,0x43,0xff,0xef,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x05,0x52,0x00,0x00,0x00,0x00,0x08,0x00,0x1a,0x9f,
+0x00,0x00,0x00,0x00,0x30,0x84,0xff,0xff,0x48,0x84,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x0c,0x00,0x2e,0x4a,
+0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x10,0x00,0x02,0x14,0x00,0x00,0x02,0x14,0x03,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x03,0xe0,0x00,0x08,0x24,0x02,0x00,0x01,
+0x03,0xe0,0x00,0x08,0x24,0x02,0x00,0x01,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x6b,0x18,
+0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0x3c,0x08,0x80,0x01,0x25,0x08,0x00,0x00,
+0x3c,0x09,0x80,0x01,0x25,0x29,0x0b,0x90,0x11,0x09,0x00,0x10,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0x80,0x00,0x25,0x4a,0x6b,0x40,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,
+0x3c,0x08,0xb0,0x06,0x35,0x08,0x80,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x8d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x31,0x29,0x00,0x01,0x00,0x00,0x00,0x00,
+0x24,0x01,0x00,0x01,0x15,0x21,0xff,0xf2,0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,
+0x25,0x4a,0x6b,0x7c,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0x3c,0x02,0xb0,0x03,
+0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x63,0x00,0x40,0x00,0x00,0x00,0x00,
+0xac,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x6b,0xa8,
+0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0x3c,0x02,0x80,0x01,0x24,0x42,0x00,0x00,
+0x3c,0x03,0x80,0x01,0x24,0x63,0x0b,0x90,0x3c,0x04,0xb0,0x00,0x8c,0x85,0x00,0x00,
+0x00,0x00,0x00,0x00,0xac,0x45,0x00,0x00,0x24,0x42,0x00,0x04,0x24,0x84,0x00,0x04,
+0x00,0x43,0x08,0x2a,0x14,0x20,0xff,0xf9,0x00,0x00,0x00,0x00,0x0c,0x00,0x1a,0xfd,
+0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x6b,0xf4,0x3c,0x0b,0xb0,0x03,
+0xad,0x6a,0x00,0x20,0x3c,0x02,0x80,0x01,0x24,0x42,0x0b,0x90,0x3c,0x03,0x80,0x01,
+0x24,0x63,0x48,0x64,0xac,0x40,0x00,0x00,0xac,0x40,0x00,0x04,0xac,0x40,0x00,0x08,
+0xac,0x40,0x00,0x0c,0x24,0x42,0x00,0x10,0x00,0x43,0x08,0x2a,0x14,0x20,0xff,0xf9,
+0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x6c,0x34,0x3c,0x0b,0xb0,0x03,
+0xad,0x6a,0x00,0x20,0x3c,0x1c,0x80,0x01,0x27,0x9c,0x7f,0xf0,0x27,0x9d,0x95,0x20,
+0x00,0x00,0x00,0x00,0x27,0x9d,0x99,0x08,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x6c,0x58,
+0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0x40,0x80,0x68,0x00,0x40,0x08,0x60,0x00,
+0x00,0x00,0x00,0x00,0x35,0x08,0xff,0x01,0x40,0x88,0x60,0x00,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x1d,0x43,0x00,0x00,0x00,0x00,0x24,0x84,0xf8,0x00,0x30,0x87,0x00,0x03,
+0x00,0x04,0x30,0x40,0x00,0xc7,0x20,0x23,0x3c,0x02,0xb0,0x0a,0x27,0xbd,0xff,0xe0,
+0x24,0x03,0xff,0xff,0x00,0x82,0x20,0x21,0xaf,0xb1,0x00,0x14,0xac,0x83,0x10,0x00,
+0xaf,0xbf,0x00,0x18,0xaf,0xb0,0x00,0x10,0x00,0xa0,0x88,0x21,0x24,0x03,0x00,0x01,
+0x8c,0x82,0x10,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0xc7,0x10,0x23,
+0x3c,0x03,0xb0,0x0a,0x00,0x43,0x10,0x21,0x8c,0x50,0x00,0x00,0x0c,0x00,0x1b,0x7a,
+0x02,0x20,0x20,0x21,0x02,0x11,0x80,0x24,0x00,0x50,0x80,0x06,0x02,0x00,0x10,0x21,
+0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,
+0x27,0xbd,0xff,0xd8,0xaf,0xb2,0x00,0x18,0x00,0xa0,0x90,0x21,0x24,0x05,0xff,0xff,
+0xaf,0xb3,0x00,0x1c,0xaf,0xbf,0x00,0x20,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,
+0x00,0xc0,0x98,0x21,0x12,0x45,0x00,0x23,0x24,0x84,0xf8,0x00,0x30,0x83,0x00,0x03,
+0x00,0x04,0x10,0x40,0x00,0x40,0x88,0x21,0x00,0x60,0x20,0x21,0x00,0x43,0x10,0x23,
+0x3c,0x03,0xb0,0x0a,0x00,0x43,0x10,0x21,0xac,0x45,0x10,0x00,0x00,0x40,0x18,0x21,
+0x24,0x05,0x00,0x01,0x8c,0x62,0x10,0x00,0x00,0x00,0x00,0x00,0x14,0x45,0xff,0xfd,
+0x3c,0x02,0xb0,0x0a,0x02,0x24,0x88,0x23,0x02,0x22,0x88,0x21,0x8e,0x30,0x00,0x00,
+0x0c,0x00,0x1b,0x7a,0x02,0x40,0x20,0x21,0x00,0x12,0x18,0x27,0x02,0x03,0x80,0x24,
+0x00,0x53,0x10,0x04,0x02,0x02,0x80,0x25,0xae,0x30,0x00,0x00,0x24,0x03,0x00,0x01,
+0x8e,0x22,0x10,0x00,0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x28,0x30,0x82,0x00,0x03,0x00,0x04,0x18,0x40,0x00,0x62,0x18,0x23,
+0x3c,0x04,0xb0,0x0a,0x00,0x64,0x18,0x21,0xac,0x66,0x00,0x00,0x24,0x04,0x00,0x01,
+0x8c,0x62,0x10,0x00,0x00,0x00,0x00,0x00,0x14,0x44,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x08,0x00,0x1b,0x68,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x21,0x00,0x64,0x10,0x06,
+0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,
+0x2c,0x62,0x00,0x20,0x14,0x40,0xff,0xf9,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x60,0x10,0x21,0x27,0xbd,0xff,0xe0,0x3c,0x03,0xb0,0x05,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x1c,0x00,0x80,0x90,0x21,
+0x00,0xa0,0x80,0x21,0x00,0xc0,0x88,0x21,0x34,0x63,0x02,0x2e,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0xff,0xfc,0x24,0x04,0x08,0x24,
+0x3c,0x05,0x00,0xc0,0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x03,0x24,0x04,0x08,0x34,
+0x3c,0x05,0x00,0xc0,0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x03,0x3c,0x02,0xc0,0x00,
+0x00,0x10,0x1c,0x00,0x34,0x42,0x04,0x00,0x3c,0x04,0xb0,0x05,0x3c,0x05,0xb0,0x05,
+0x24,0x63,0x16,0x09,0x02,0x22,0x10,0x21,0x34,0x84,0x04,0x20,0x34,0xa5,0x04,0x24,
+0x3c,0x06,0xb0,0x05,0xac,0x83,0x00,0x00,0x24,0x07,0x00,0x01,0xac,0xa2,0x00,0x00,
+0x34,0xc6,0x02,0x28,0x24,0x02,0x00,0x20,0xae,0x47,0x00,0x3c,0x24,0x04,0x08,0x24,
+0xa0,0xc2,0x00,0x00,0x3c,0x05,0x00,0xc0,0xa2,0x47,0x00,0x11,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x01,0x24,0x04,0x08,0x34,0x3c,0x05,0x00,0xc0,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x01,0x8f,0xbf,0x00,0x1c,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x24,0x02,0x00,0x06,0xac,0x82,0x00,0x0c,
+0xa0,0x80,0x00,0x50,0xac,0x80,0x00,0x00,0xac,0x80,0x00,0x04,0xac,0x80,0x00,0x08,
+0xac,0x80,0x00,0x14,0xac,0x80,0x00,0x18,0xac,0x80,0x00,0x1c,0xa4,0x80,0x00,0x20,
+0xac,0x80,0x00,0x24,0xac,0x80,0x00,0x28,0xac,0x80,0x00,0x2c,0xa0,0x80,0x00,0x30,
+0xa0,0x80,0x00,0x31,0xac,0x80,0x00,0x34,0xac,0x80,0x00,0x38,0xa0,0x80,0x00,0x3c,
+0xac,0x82,0x00,0x10,0xa0,0x80,0x00,0x44,0xac,0x80,0x00,0x48,0x03,0xe0,0x00,0x08,
+0xac,0x80,0x00,0x4c,0x3c,0x04,0xb0,0x06,0x34,0x84,0x80,0x00,0x8c,0x83,0x00,0x00,
+0x3c,0x02,0x12,0x00,0x3c,0x05,0xb0,0x03,0x00,0x62,0x18,0x25,0x34,0xa5,0x00,0x8b,
+0x24,0x02,0xff,0x80,0xac,0x83,0x00,0x00,0x03,0xe0,0x00,0x08,0xa0,0xa2,0x00,0x00,
+0x3c,0x04,0xb0,0x03,0x34,0x84,0x00,0x0b,0x24,0x02,0x00,0x22,0x3c,0x05,0xb0,0x01,
+0x3c,0x06,0x45,0x67,0x3c,0x0a,0xb0,0x09,0xa0,0x82,0x00,0x00,0x34,0xa5,0x00,0x04,
+0x34,0xc6,0x89,0xaa,0x35,0x4a,0x00,0x04,0x24,0x02,0x01,0x23,0x3c,0x0b,0xb0,0x09,
+0x3c,0x07,0x01,0x23,0x3c,0x0c,0xb0,0x09,0x3c,0x01,0xb0,0x01,0xac,0x20,0x00,0x00,
+0x27,0xbd,0xff,0xe0,0xac,0xa0,0x00,0x00,0x35,0x6b,0x00,0x08,0x3c,0x01,0xb0,0x09,
+0xac,0x26,0x00,0x00,0x34,0xe7,0x45,0x66,0xa5,0x42,0x00,0x00,0x35,0x8c,0x00,0x0c,
+0x24,0x02,0xcd,0xef,0x3c,0x0d,0xb0,0x09,0x3c,0x08,0xcd,0xef,0x3c,0x0e,0xb0,0x09,
+0xad,0x67,0x00,0x00,0xaf,0xb7,0x00,0x1c,0xa5,0x82,0x00,0x00,0xaf,0xb6,0x00,0x18,
+0xaf,0xb5,0x00,0x14,0xaf,0xb4,0x00,0x10,0xaf,0xb3,0x00,0x0c,0xaf,0xb2,0x00,0x08,
+0xaf,0xb1,0x00,0x04,0xaf,0xb0,0x00,0x00,0x35,0xad,0x00,0x10,0x35,0x08,0x01,0x22,
+0x35,0xce,0x00,0x14,0x24,0x02,0x89,0xab,0x3c,0x0f,0xb0,0x09,0x3c,0x09,0x89,0xab,
+0x3c,0x10,0xb0,0x09,0x3c,0x11,0xb0,0x09,0x3c,0x12,0xb0,0x09,0x3c,0x13,0xb0,0x09,
+0x3c,0x14,0xb0,0x09,0x3c,0x15,0xb0,0x09,0x3c,0x16,0xb0,0x09,0x3c,0x17,0xb0,0x09,
+0xad,0xa8,0x00,0x00,0x24,0x03,0xff,0xff,0xa5,0xc2,0x00,0x00,0x35,0xef,0x00,0x18,
+0x35,0x29,0xcd,0xee,0x36,0x10,0x00,0x1c,0x36,0x31,0x00,0x20,0x36,0x52,0x00,0x24,
+0x36,0x73,0x00,0x28,0x36,0x94,0x00,0x2c,0x36,0xb5,0x00,0x30,0x36,0xd6,0x00,0x34,
+0x36,0xf7,0x00,0x38,0x24,0x02,0x45,0x67,0xad,0xe9,0x00,0x00,0xa6,0x02,0x00,0x00,
+0xae,0x23,0x00,0x00,0x8f,0xb0,0x00,0x00,0xa6,0x43,0x00,0x00,0x8f,0xb1,0x00,0x04,
+0xae,0x63,0x00,0x00,0x8f,0xb2,0x00,0x08,0xa6,0x83,0x00,0x00,0x8f,0xb3,0x00,0x0c,
+0xae,0xa3,0x00,0x00,0x8f,0xb4,0x00,0x10,0xa6,0xc3,0x00,0x00,0x8f,0xb5,0x00,0x14,
+0xae,0xe3,0x00,0x00,0x7b,0xb6,0x00,0xfc,0x3c,0x18,0xb0,0x09,0x37,0x18,0x00,0x3c,
+0xa7,0x03,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x70,0xcc,0xac,0x62,0x00,0x00,
+0x8c,0x83,0x00,0x34,0x34,0x02,0xff,0xff,0x00,0x43,0x10,0x2a,0x14,0x40,0x01,0x04,
+0x00,0x80,0x28,0x21,0x8c,0x86,0x00,0x08,0x24,0x02,0x00,0x03,0x10,0xc2,0x00,0xf7,
+0x00,0x00,0x00,0x00,0x8c,0xa2,0x00,0x2c,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x4f,
+0x24,0x02,0x00,0x06,0x3c,0x03,0xb0,0x05,0x34,0x63,0x04,0x50,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x14,0x40,0x00,0xdd,0xac,0xa2,0x00,0x2c,
+0x24,0x02,0x00,0x01,0x10,0xc2,0x00,0xdc,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xc2,0x00,0xca,0x00,0x00,0x00,0x00,0x8c,0xa7,0x00,0x04,0x24,0x02,0x00,0x02,
+0x10,0xe2,0x00,0xc0,0x00,0x00,0x00,0x00,0x8c,0xa2,0x00,0x14,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x09,0x24,0x02,0x00,0x01,0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x60,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x10,0x40,0x00,0x05,
+0xac,0xa2,0x00,0x14,0x24,0x02,0x00,0x01,0xac,0xa2,0x00,0x00,0x03,0xe0,0x00,0x08,
+0xac,0xa0,0x00,0x14,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xd0,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x04,0x61,0x00,0x19,0x3c,0x02,0xb0,0x03,0x3c,0x03,0xb0,0x05,
+0x34,0x63,0x02,0x2e,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,
+0x14,0x40,0x00,0x12,0x3c,0x02,0xb0,0x03,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x42,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x0c,0x3c,0x02,0xb0,0x03,
+0x80,0xa2,0x00,0x50,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x08,0x3c,0x02,0xb0,0x03,
+0x14,0xc0,0x00,0x07,0x34,0x42,0x00,0x3f,0x24,0x02,0x00,0x0e,0x24,0x03,0x00,0x01,
+0xac,0xa2,0x00,0x00,0x03,0xe0,0x00,0x08,0xa0,0xa3,0x00,0x50,0x34,0x42,0x00,0x3f,
+0x90,0x44,0x00,0x00,0x24,0x03,0x00,0x01,0x10,0x64,0x00,0x7f,0x3c,0x03,0xb0,0x05,
+0x80,0xa2,0x00,0x31,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0a,0x3c,0x02,0xb0,0x06,
+0x34,0x42,0x80,0x18,0x8c,0x43,0x00,0x00,0x3c,0x04,0xf0,0x00,0x3c,0x02,0x80,0x00,
+0x00,0x64,0x18,0x24,0x10,0x62,0x00,0x03,0x24,0x02,0x00,0x09,0x03,0xe0,0x00,0x08,
+0xac,0xa2,0x00,0x00,0x8c,0xa2,0x00,0x40,0x00,0x00,0x00,0x00,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x09,0x3c,0x03,0xb0,0x03,0x3c,0x02,0xb0,0x05,
+0x34,0x42,0x02,0x2c,0x8c,0x43,0x00,0x00,0x3c,0x04,0x00,0x02,0x00,0x64,0x18,0x24,
+0x14,0x60,0xff,0xf2,0x24,0x02,0x00,0x10,0x3c,0x03,0xb0,0x03,0x34,0x63,0x02,0x01,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x80,0x10,0x40,0x00,0x0e,
+0x00,0x00,0x00,0x00,0x8c,0xa3,0x00,0x0c,0x00,0x00,0x00,0x00,0xac,0xa3,0x00,0x10,
+0x3c,0x02,0xb0,0x03,0x90,0x42,0x02,0x01,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x0f,
+0xac,0xa2,0x00,0x0c,0x90,0xa3,0x00,0x0f,0x24,0x02,0x00,0x0d,0x3c,0x01,0xb0,0x03,
+0x08,0x00,0x1c,0x93,0xa0,0x23,0x02,0x01,0x3c,0x02,0xb0,0x09,0x34,0x42,0x01,0x80,
+0x90,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x1e,0x00,0x00,0x03,0x1e,0x03,
+0x10,0x60,0x00,0x15,0xa0,0xa4,0x00,0x44,0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x0b,
+0x24,0x02,0x00,0x02,0x10,0x62,0x00,0x03,0x24,0x03,0x00,0x0d,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x8c,0xa2,0x00,0x0c,0xac,0xa3,0x00,0x00,0x24,0x03,0x00,0x04,
+0xac,0xa2,0x00,0x10,0x03,0xe0,0x00,0x08,0xac,0xa3,0x00,0x0c,0x24,0x02,0x00,0x0d,
+0xac,0xa2,0x00,0x00,0x24,0x03,0x00,0x04,0x24,0x02,0x00,0x06,0xac,0xa3,0x00,0x10,
+0x03,0xe0,0x00,0x08,0xac,0xa2,0x00,0x0c,0x8c,0xa3,0x00,0x38,0x24,0x04,0x00,0x01,
+0x10,0x64,0x00,0x2d,0x24,0x02,0x00,0x02,0x10,0x60,0x00,0x19,0x00,0x00,0x00,0x00,
+0x10,0x62,0x00,0x10,0x24,0x02,0x00,0x04,0x10,0x62,0x00,0x04,0x00,0x00,0x00,0x00,
+0xac,0xa0,0x00,0x38,0x03,0xe0,0x00,0x08,0xac,0xa0,0x00,0x00,0x10,0xe4,0x00,0x07,
+0x24,0x02,0x00,0x03,0x80,0xa2,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x02,0x18,0x0b,
+0xac,0xa3,0x00,0x00,0x03,0xe0,0x00,0x08,0xac,0xa0,0x00,0x38,0x08,0x00,0x1c,0xe5,
+0xac,0xa2,0x00,0x00,0x10,0xe4,0x00,0x02,0x24,0x02,0x00,0x03,0x24,0x02,0x00,0x0c,
+0xac,0xa2,0x00,0x00,0x24,0x02,0x00,0x04,0x03,0xe0,0x00,0x08,0xac,0xa2,0x00,0x38,
+0x10,0xe4,0x00,0x0e,0x3c,0x03,0xb0,0x06,0x34,0x63,0x80,0x24,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x10,0x40,0x00,0x06,0xac,0xa2,0x00,0x18,
+0x24,0x02,0x00,0x02,0xac,0xa2,0x00,0x00,0xac,0xa0,0x00,0x18,0x08,0x00,0x1c,0xee,
+0x24,0x02,0x00,0x01,0x08,0x00,0x1c,0xfb,0xac,0xa0,0x00,0x00,0x24,0x02,0x00,0x03,
+0x08,0x00,0x1c,0xfb,0xac,0xa2,0x00,0x00,0x24,0x03,0x00,0x0b,0xac,0xa2,0x00,0x38,
+0x03,0xe0,0x00,0x08,0xac,0xa3,0x00,0x00,0x34,0x63,0x02,0x2e,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0xff,0x7d,0x3c,0x02,0xb0,0x05,
+0x34,0x42,0x02,0x42,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x60,0xff,0x78,
+0x00,0x00,0x00,0x00,0x10,0xc0,0xff,0x81,0x24,0x02,0x00,0x0e,0x08,0x00,0x1c,0x88,
+0x00,0x00,0x00,0x00,0x80,0xa2,0x00,0x30,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x3e,
+0x24,0x02,0x00,0x04,0x08,0x00,0x1c,0x93,0x00,0x00,0x00,0x00,0x84,0xa2,0x00,0x20,
+0x00,0x00,0x00,0x00,0x10,0x40,0xff,0x75,0x24,0x02,0x00,0x06,0x3c,0x02,0xb0,0x05,
+0x34,0x42,0x02,0x2e,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,
+0x30,0x63,0x00,0xff,0x00,0x60,0x10,0x21,0x14,0x40,0xff,0x2b,0xa4,0xa3,0x00,0x20,
+0x08,0x00,0x1c,0x93,0x24,0x02,0x00,0x06,0x8c,0xa2,0x00,0x1c,0x00,0x00,0x00,0x00,
+0x14,0x40,0xff,0x66,0x24,0x02,0x00,0x05,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x2c,
+0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x10,0x40,0xff,0x1b,
+0xac,0xa2,0x00,0x1c,0x08,0x00,0x1c,0x93,0x24,0x02,0x00,0x05,0x3c,0x02,0xb0,0x05,
+0x8c,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x17,0x42,0x30,0x42,0x00,0x01,
+0x14,0x40,0xff,0x56,0x24,0x02,0x00,0x06,0x08,0x00,0x1c,0x41,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x0a,0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x00,0x27,0xbd,0xff,0xc8,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x27,0x91,0x91,0xf8,0x27,0x90,0x8f,0x38,
+0xaf,0xbf,0x00,0x30,0xaf,0xb7,0x00,0x2c,0xaf,0xb6,0x00,0x28,0xaf,0xb5,0x00,0x24,
+0xaf,0xb4,0x00,0x20,0xaf,0xb3,0x00,0x1c,0x0c,0x00,0x2d,0xd7,0xaf,0xb2,0x00,0x18,
+0x0c,0x00,0x07,0x90,0x00,0x00,0x00,0x00,0xaf,0x91,0x95,0x10,0xaf,0x90,0x99,0x20,
+0x48,0x02,0x00,0x00,0x0c,0x00,0x1b,0xd1,0x00,0x00,0x00,0x00,0x0c,0x00,0x1f,0xea,
+0x02,0x00,0x20,0x21,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x3a,0x94,0x43,0x00,0x00,
+0x3a,0x54,0xff,0xff,0xa3,0x83,0x99,0x24,0x0c,0x00,0x00,0x34,0x02,0x80,0xa8,0x21,
+0x0c,0x00,0x1b,0xdc,0x02,0x80,0xb0,0x21,0x27,0x84,0x8d,0x78,0x0c,0x00,0x32,0xfa,
+0x02,0x80,0xb8,0x21,0x93,0x84,0x80,0x10,0x0c,0x00,0x29,0x03,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x0e,0x8a,0x02,0x20,0x20,0x21,0x0c,0x00,0x01,0x39,0x00,0x00,0x00,0x00,
+0x27,0x84,0x8d,0x20,0x0c,0x00,0x1b,0xba,0x00,0x00,0x00,0x00,0x27,0x82,0x92,0x2c,
+0xaf,0x82,0x8d,0x60,0x0c,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x34,0x63,0x01,0x08,0x3c,0x04,0xb0,0x09,0x3c,0x05,0xb0,0x09,0x8c,0x66,0x00,0x00,
+0x34,0x84,0x01,0x68,0x24,0x02,0xc8,0x80,0x34,0xa5,0x01,0x40,0x24,0x03,0x00,0x0a,
+0xa4,0x82,0x00,0x00,0xa4,0xa3,0x00,0x00,0x3c,0x04,0xb0,0x03,0x8c,0x82,0x00,0x00,
+0xaf,0x86,0x8d,0x18,0x34,0x42,0x00,0x20,0xac,0x82,0x00,0x00,0x0c,0x00,0x07,0xa1,
+0x00,0x00,0x00,0x00,0x3c,0x04,0xb0,0x05,0x0c,0x00,0x2d,0xef,0x34,0x84,0x00,0x04,
+0x8f,0x83,0x8d,0x20,0x00,0x00,0x00,0x00,0x2c,0x62,0x00,0x11,0x10,0x40,0xff,0xf7,
+0x00,0x03,0x10,0x80,0x3c,0x03,0x80,0x01,0x24,0x63,0x08,0xac,0x00,0x43,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,
+0x27,0x84,0x8d,0x78,0x0c,0x00,0x32,0x2f,0x00,0x00,0x00,0x00,0x27,0x84,0x8d,0x20,
+0x0c,0x00,0x1c,0x33,0x00,0x00,0x00,0x00,0x93,0x83,0x88,0x6d,0x24,0x02,0x00,0x01,
+0x10,0x62,0x00,0x07,0x00,0x00,0x00,0x00,0x8f,0x82,0x8d,0x54,0x00,0x00,0x00,0x00,
+0x24,0x42,0x00,0x01,0xaf,0x82,0x8d,0x54,0x08,0x00,0x1d,0x83,0x00,0x00,0x00,0x00,
+0x27,0x84,0x8d,0x78,0x0c,0x00,0x32,0xae,0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0x9e,
+0x00,0x00,0x00,0x00,0x27,0x84,0x8d,0x78,0x0c,0x00,0x34,0x90,0x00,0x00,0x00,0x00,
+0xa3,0x82,0x8d,0x51,0xaf,0x80,0x8d,0x20,0x08,0x00,0x1d,0x9e,0x00,0x00,0x00,0x00,
+0x27,0x84,0x8f,0x38,0x0c,0x00,0x21,0x26,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,
+0x14,0x40,0x00,0x05,0x3c,0x03,0xb0,0x05,0xaf,0x80,0x8d,0x20,0xaf,0x80,0x8d,0x24,
+0x08,0x00,0x1d,0x9e,0x00,0x00,0x00,0x00,0x34,0x63,0x04,0x50,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0xaf,0x82,0x8d,0x4c,0x14,0x40,0x00,0x1e,
+0x24,0x02,0x00,0x01,0x8f,0x84,0x8d,0x28,0x00,0x00,0x00,0x00,0x10,0x82,0x00,0x1d,
+0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x60,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0xaf,0x82,0x8d,0x34,0x14,0x40,0x00,0x13,0x24,0x02,0x00,0x01,
+0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x07,0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x01,
+0x24,0x03,0x00,0x03,0xaf,0x82,0x8d,0x24,0xaf,0x83,0x8d,0x20,0x08,0x00,0x1d,0x9e,
+0x00,0x00,0x00,0x00,0x34,0x42,0x02,0x2e,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x63,0x00,0x01,0x30,0x63,0x00,0xff,0x00,0x60,0x10,0x21,0xa7,0x83,0x8d,0x40,
+0x14,0x40,0xff,0xf3,0x24,0x02,0x00,0x01,0xaf,0x82,0x8d,0x24,0x08,0x00,0x1d,0xad,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x2c,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0xaf,0x82,0x8d,0x3c,0x14,0x40,0xff,0xf6,
+0x24,0x02,0x00,0x01,0x08,0x00,0x1d,0xc5,0x3c,0x03,0xb0,0x09,0x27,0x84,0x8f,0x38,
+0x0c,0x00,0x22,0x9f,0x00,0x00,0x00,0x00,0x83,0x82,0x8d,0x50,0x00,0x00,0x00,0x00,
+0x14,0x40,0xff,0xed,0x24,0x02,0x00,0x02,0x3c,0x03,0xb0,0x05,0x34,0x63,0x04,0x50,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0xaf,0x82,0x8d,0x4c,
+0x14,0x40,0xff,0xe5,0x24,0x02,0x00,0x02,0x8f,0x84,0x8d,0x28,0x24,0x02,0x00,0x01,
+0x10,0x82,0x00,0x12,0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x05,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x02,0xaf,0x82,0x8d,0x24,0x08,0x00,0x1d,0xd2,0x24,0x03,0x00,0x04,
+0x34,0x42,0x02,0x2e,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,
+0x30,0x63,0x00,0xff,0x00,0x60,0x10,0x21,0xa7,0x83,0x8d,0x40,0x14,0x40,0xff,0xf4,
+0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0xde,0x24,0x02,0x00,0x02,0x3c,0x03,0xb0,0x05,
+0x34,0x63,0x02,0x2c,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,
+0xaf,0x82,0x8d,0x3c,0x14,0x40,0xff,0xf7,0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0xfe,
+0x24,0x02,0x00,0x02,0x27,0x84,0x91,0xf8,0x0c,0x00,0x12,0xf2,0x00,0x00,0x00,0x00,
+0x8f,0x83,0x8d,0x24,0xaf,0x82,0x8d,0x3c,0x38,0x64,0x00,0x02,0x00,0x04,0x18,0x0a,
+0xaf,0x83,0x8d,0x24,0x14,0x40,0x00,0x1f,0x24,0x02,0x00,0x05,0x8f,0x82,0x92,0x38,
+0xaf,0x80,0x8d,0x20,0x10,0x40,0x00,0x02,0x24,0x04,0x00,0x01,0xaf,0x84,0x8d,0x28,
+0x93,0x82,0x92,0x46,0x00,0x00,0x00,0x00,0x10,0x40,0xff,0x73,0x3c,0x02,0xb0,0x05,
+0x34,0x42,0x00,0x08,0x8c,0x43,0x00,0x00,0x3c,0x04,0x20,0x00,0x00,0x64,0x18,0x24,
+0x10,0x60,0xff,0x6d,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xa0,0x8c,0x43,0x00,0x00,
+0x3c,0x04,0x80,0x00,0xaf,0x80,0x92,0x20,0x24,0x63,0x00,0x01,0xac,0x43,0x00,0x00,
+0x3c,0x01,0xb0,0x05,0xac,0x24,0x00,0x08,0xaf,0x80,0x92,0x1c,0xaf,0x80,0x92,0x24,
+0xaf,0x80,0x92,0x28,0xaf,0x80,0x92,0x34,0xaf,0x80,0x92,0x2c,0x08,0x00,0x1d,0x9e,
+0x00,0x00,0x00,0x00,0xaf,0x82,0x8d,0x20,0x08,0x00,0x1d,0x9e,0x00,0x00,0x00,0x00,
+0x83,0x82,0x8d,0x70,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x02,0x24,0x02,0x00,0x20,
+0xaf,0x82,0x8d,0x3c,0x8f,0x85,0x8d,0x3c,0x27,0x84,0x91,0xf8,0x0c,0x00,0x14,0xcd,
+0x00,0x00,0x00,0x00,0x00,0x02,0x1e,0x00,0xa3,0x82,0x8d,0x50,0xaf,0x80,0x8d,0x3c,
+0x10,0x60,0xff,0x5c,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2e,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,0x30,0x63,0x00,0xff,0x00,0x60,0x10,0x21,
+0xa7,0x83,0x8d,0x40,0x10,0x40,0xff,0xe7,0x24,0x02,0x00,0x06,0x24,0x04,0x00,0x02,
+0xaf,0x84,0x8d,0x28,0x08,0x00,0x1d,0xad,0x00,0x00,0x00,0x00,0x27,0x84,0x8d,0x20,
+0x27,0x85,0x91,0xf8,0x0c,0x00,0x15,0x9a,0x00,0x00,0x00,0x00,0x8f,0x82,0x8d,0x44,
+0xaf,0x80,0x8d,0x4c,0x14,0x40,0x00,0x1a,0x00,0x40,0x18,0x21,0x8f,0x82,0x8d,0x48,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x16,0x24,0x02,0x00,0x02,0x8f,0x83,0x8d,0x28,
+0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x0b,0x24,0x02,0x00,0x01,0x8f,0x83,0x8d,0x24,
+0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x02,0x24,0x02,0x00,0x03,0x24,0x02,0x00,0x06,
+0xaf,0x82,0x8d,0x20,0x24,0x04,0x00,0x03,0xaf,0x84,0x8d,0x28,0x08,0x00,0x1d,0x9e,
+0x00,0x00,0x00,0x00,0x3c,0x02,0x40,0x00,0x34,0x42,0x00,0x14,0x3c,0x01,0xb0,0x05,
+0xac,0x22,0x00,0x00,0xaf,0x80,0x8d,0x20,0x08,0x00,0x1e,0x76,0x24,0x04,0x00,0x03,
+0x10,0x60,0x00,0x10,0x00,0x00,0x00,0x00,0x27,0x84,0x8d,0x20,0x27,0x85,0x91,0xf8,
+0x0c,0x00,0x15,0xbe,0x00,0x00,0x00,0x00,0x8f,0x83,0x8d,0x24,0x24,0x02,0x00,0x01,
+0xa3,0x80,0x8d,0x50,0xaf,0x80,0x8d,0x28,0x10,0x62,0x00,0x02,0x24,0x02,0x00,0x03,
+0x24,0x02,0x00,0x04,0xaf,0x82,0x8d,0x20,0xaf,0x80,0x8d,0x44,0x08,0x00,0x1d,0x9e,
+0x00,0x00,0x00,0x00,0x83,0x82,0x8d,0x70,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x04,
+0x00,0x00,0x00,0x00,0x27,0x84,0x91,0xf8,0x0c,0x00,0x18,0x06,0x00,0x00,0x00,0x00,
+0x8f,0x82,0x8d,0x24,0xa3,0x80,0x8d,0x50,0xaf,0x80,0x8d,0x20,0xaf,0x80,0x8d,0x28,
+0x14,0x40,0x00,0x02,0x24,0x02,0x00,0x02,0xaf,0x82,0x8d,0x24,0xaf,0x80,0x8d,0x48,
+0x08,0x00,0x1d,0x9e,0x00,0x00,0x00,0x00,0x27,0x84,0x8d,0x20,0x27,0x85,0x91,0xf8,
+0x0c,0x00,0x15,0xbe,0x00,0x00,0x00,0x00,0x8f,0x82,0x8d,0x24,0xa3,0x80,0x8d,0x50,
+0xaf,0x80,0x8d,0x20,0xaf,0x80,0x8d,0x28,0x14,0x40,0xfe,0xf3,0x24,0x02,0x00,0x02,
+0xaf,0x82,0x8d,0x24,0x08,0x00,0x1d,0x9e,0x00,0x00,0x00,0x00,0x27,0x84,0x91,0xf8,
+0x0c,0x00,0x18,0x06,0x00,0x00,0x00,0x00,0x08,0x00,0x1e,0xa6,0x00,0x00,0x00,0x00,
+0x27,0x84,0x8d,0x78,0x0c,0x00,0x35,0x26,0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0xac,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x2b,0xc9,0x00,0x00,0x00,0x00,0x0c,0x00,0x32,0xa0,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x1f,0xdc,0x00,0x00,0x00,0x00,0x93,0x83,0xc5,0x58,
+0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x1c,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x08,
+0x8c,0x44,0x00,0x00,0x8f,0x83,0xc5,0x50,0x8f,0x82,0xc5,0x54,0x00,0x83,0x18,0x23,
+0x00,0x43,0x10,0x2b,0x10,0x40,0x00,0x14,0x2e,0xa3,0x00,0x01,0x2e,0x82,0x00,0x01,
+0x00,0x43,0x10,0x25,0x2e,0xc4,0x00,0x01,0x00,0x44,0x10,0x25,0x2e,0xe3,0x00,0x01,
+0x3c,0x05,0xb0,0x03,0x00,0x43,0x10,0x25,0x34,0xa5,0x01,0x18,0x8c,0xa3,0x00,0x00,
+0x14,0x40,0x00,0x02,0x24,0x04,0x00,0x02,0x00,0x00,0x20,0x21,0x0c,0x00,0x0b,0x7e,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x08,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0xaf,0x83,0xc5,0x50,0x0c,0x00,0x01,0xe9,0x00,0x00,0x00,0x00,
+0xaf,0x80,0x8d,0x20,0xaf,0x80,0x8d,0x54,0x08,0x00,0x1d,0x83,0x00,0x00,0x00,0x00,
+0x27,0x90,0xbd,0x40,0x24,0x11,0x00,0x12,0x8e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+0x90,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x03,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x20,0x9b,0x00,0x00,0x00,0x00,0x26,0x31,0xff,0xff,0x06,0x21,0xff,0xf6,
+0x26,0x10,0x00,0x04,0x08,0x00,0x1d,0xad,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x01,0x08,0x8c,0x44,0x00,0x00,0x8f,0x82,0x8d,0x18,0x00,0x04,0x19,0xc2,
+0x00,0x02,0x11,0xc2,0x10,0x62,0xfe,0xb3,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x02,
+0x90,0x43,0x00,0x00,0x3c,0x12,0xb0,0x05,0xaf,0x84,0x8d,0x18,0x30,0x63,0x00,0xff,
+0x00,0x03,0x11,0x40,0x00,0x43,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,
+0x00,0x02,0x99,0x00,0x00,0x00,0x88,0x21,0x36,0x52,0x02,0x2c,0x27,0x90,0xbd,0x40,
+0x8e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x16,0x00,0x00,0x00,0x00,
+0x30,0x62,0x00,0x03,0x10,0x40,0x00,0x06,0x30,0x62,0x00,0x1c,0x14,0x40,0x00,0x04,
+0x00,0x00,0x00,0x00,0x8f,0x85,0x8d,0x18,0x0c,0x00,0x26,0x58,0x02,0x60,0x30,0x21,
+0x8e,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x14,0x40,0xfe,0x95,
+0x00,0x00,0x00,0x00,0x26,0x31,0x00,0x01,0x2a,0x22,0x00,0x13,0x14,0x40,0xff,0xec,
+0x26,0x10,0x00,0x04,0x08,0x00,0x1d,0xad,0x00,0x00,0x00,0x00,0x8f,0x84,0x8d,0x2c,
+0x27,0x85,0x91,0xf8,0x0c,0x00,0x1f,0x6f,0x00,0x00,0x00,0x00,0x8f,0x83,0x8d,0x2c,
+0x24,0x02,0x00,0x04,0x14,0x62,0xfe,0x87,0x24,0x02,0x00,0x05,0x08,0x00,0x1e,0x41,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x3f,0x90,0x44,0x00,0x00,
+0x24,0x03,0x00,0x01,0x10,0x64,0x00,0x06,0x3c,0x02,0xb0,0x03,0x27,0x84,0x91,0xf8,
+0x0c,0x00,0x2b,0xf0,0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0xd2,0x24,0x03,0x00,0x05,
+0x34,0x42,0x00,0x14,0x8c,0x44,0x00,0x00,0x0c,0x00,0x2c,0x0d,0x00,0x00,0x00,0x00,
+0x08,0x00,0x1d,0xd2,0x24,0x03,0x00,0x05,0x8f,0x82,0x92,0x2c,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x0d,0x00,0x00,0x00,0x00,0x8f,0x84,0xbd,0x80,0xaf,0x80,0x92,0x2c,
+0x94,0x85,0x00,0x14,0x0c,0x00,0x23,0x34,0x00,0x00,0x00,0x00,0x93,0x82,0x94,0x51,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x02,0x10,0x40,0x00,0x03,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x01,0x57,0x00,0x00,0x20,0x21,0x8f,0x84,0xbd,0x80,0x0c,0x00,0x20,0x9b,
+0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0xad,0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0x90,
+0x27,0xbd,0xff,0xe8,0x00,0x80,0x18,0x21,0x34,0x42,0x00,0x01,0x27,0x84,0x91,0xf8,
+0x10,0x62,0x00,0x05,0xaf,0xbf,0x00,0x10,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x0e,0x8a,0x00,0x00,0x00,0x00,
+0x27,0x84,0x8f,0x38,0x0c,0x00,0x1f,0xea,0x00,0x00,0x00,0x00,0x27,0x84,0x8d,0x20,
+0x0c,0x00,0x1b,0xba,0x00,0x00,0x00,0x00,0x08,0x00,0x1f,0x56,0x00,0x00,0x00,0x00,
+0x8f,0x82,0x92,0x38,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x05,0x00,0x00,0x18,0x21,
+0x8f,0x82,0x8d,0x28,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x02,0x00,0x00,0x00,0x00,
+0x24,0x03,0x00,0x01,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,0x27,0xbd,0xff,0xe0,
+0x3c,0x06,0xb0,0x03,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x34,0xc6,0x00,0x5f,
+0xaf,0xbf,0x00,0x18,0x90,0xc3,0x00,0x00,0x3c,0x07,0xb0,0x03,0x34,0xe7,0x00,0x5d,
+0x34,0x63,0x00,0x01,0x3c,0x09,0xb0,0x03,0x24,0x02,0x00,0x01,0xa0,0xc3,0x00,0x00,
+0x00,0x80,0x80,0x21,0xa0,0xe2,0x00,0x00,0x00,0xa0,0x88,0x21,0x35,0x29,0x00,0x5e,
+0x00,0xe0,0x40,0x21,0x24,0x04,0x00,0x01,0x91,0x22,0x00,0x00,0x91,0x03,0x00,0x00,
+0x30,0x42,0x00,0x01,0x14,0x83,0x00,0x03,0x30,0x42,0x00,0x01,0x14,0x40,0xff,0xfa,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x04,0x12,0x02,0x00,0x2c,0x24,0x05,0x0f,0x00,
+0x24,0x02,0x00,0x06,0x12,0x02,0x00,0x08,0x24,0x05,0x00,0x0f,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x02,0x00,0xa0,0x50,0x00,0x00,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x24,0x04,0x0c,0x04,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x0f,0x24,0x04,0x0d,0x04,0x24,0x05,0x00,0x0f,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x0f,0x24,0x04,0x08,0x80,0x24,0x05,0x1e,0x00,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x0f,0x24,0x04,0x08,0x8c,0x24,0x05,0x0f,0x00,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x0f,0x24,0x04,0x08,0x24,0x3c,0x05,0x00,0x30,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x02,0x24,0x04,0x08,0x2c,0x3c,0x05,0x00,0x30,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x02,0x24,0x04,0x08,0x34,0x3c,0x05,0x00,0x30,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x02,0x24,0x04,0x08,0x3c,0x3c,0x05,0x00,0x30,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x02,0x08,0x00,0x1f,0x90,0x3c,0x02,0xb0,0x03,0x24,0x04,0x08,0x8c,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x04,0x24,0x04,0x08,0x80,0x24,0x05,0x1e,0x00,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x04,0x24,0x04,0x0c,0x04,0x24,0x05,0x00,0x0f,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x04,0x24,0x04,0x0d,0x04,0x24,0x05,0x00,0x0f,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x04,0x24,0x04,0x08,0x24,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x03,0x24,0x04,0x08,0x2c,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x03,0x24,0x04,0x08,0x34,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x02,0x3c,0x05,0x00,0x30,0x24,0x06,0x00,0x03,
+0x0c,0x00,0x1b,0x40,0x24,0x04,0x08,0x3c,0x02,0x20,0x20,0x21,0x24,0x05,0x00,0x14,
+0x0c,0x00,0x1b,0x85,0x24,0x06,0x01,0x07,0x08,0x00,0x1f,0x90,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x73,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x02,0x14,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0xa3,0x80,0x87,0x6d,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0xa3,0x82,0x87,0x6d,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x00,0x80,0x70,0x21,0x34,0x63,0x00,0x20,0x24,0x42,0x7f,0xa8,0x3c,0x04,0xb0,0x03,
+0xac,0x62,0x00,0x00,0x34,0x84,0x00,0x30,0xad,0xc0,0x02,0xb8,0x8c,0x83,0x00,0x00,
+0x24,0x02,0x00,0xff,0xa5,0xc0,0x00,0x0a,0x00,0x00,0x30,0x21,0xa7,0x82,0x99,0x30,
+0x27,0x88,0x99,0x40,0xa5,0xc3,0x00,0x08,0x3c,0x07,0xb0,0x08,0x30,0xc2,0xff,0xff,
+0x00,0x02,0x20,0xc0,0x24,0xc3,0x00,0x01,0x00,0x82,0x10,0x21,0x00,0x60,0x30,0x21,
+0x00,0x02,0x10,0x80,0x30,0x63,0xff,0xff,0x00,0x48,0x10,0x21,0x00,0x87,0x20,0x21,
+0x28,0xc5,0x00,0xff,0xac,0x83,0x00,0x00,0x14,0xa0,0xff,0xf4,0xa4,0x43,0x00,0x00,
+0x3c,0x02,0xb0,0x08,0x34,0x03,0xff,0xff,0x25,0xc4,0x00,0x0c,0x24,0x0a,0x00,0x02,
+0x34,0x42,0x07,0xf8,0x3c,0x06,0xb0,0x03,0xa7,0x83,0xbd,0x1c,0xac,0x43,0x00,0x00,
+0xaf,0x84,0xbd,0x40,0x34,0xc6,0x00,0x64,0xa0,0x8a,0x00,0x18,0x94,0xc5,0x00,0x00,
+0x8f,0x82,0xbd,0x40,0x25,0xc4,0x00,0x30,0x24,0x08,0x00,0x03,0x3c,0x03,0xb0,0x03,
+0xa0,0x45,0x00,0x21,0x34,0x63,0x00,0x66,0xaf,0x84,0xbd,0x44,0xa0,0x88,0x00,0x18,
+0x94,0x65,0x00,0x00,0x8f,0x82,0xbd,0x44,0x25,0xc4,0x00,0x54,0x25,0xc7,0x00,0x78,
+0xa0,0x45,0x00,0x21,0xaf,0x84,0xbd,0x48,0xa0,0x88,0x00,0x18,0x94,0x65,0x00,0x00,
+0x8f,0x82,0xbd,0x48,0x25,0xc8,0x00,0x9c,0x24,0x09,0x00,0x01,0xa0,0x45,0x00,0x21,
+0xaf,0x87,0xbd,0x4c,0xa0,0xea,0x00,0x18,0x94,0xc4,0x00,0x00,0x8f,0x82,0xbd,0x4c,
+0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x62,0xa0,0x44,0x00,0x21,0xaf,0x88,0xbd,0x50,
+0xa1,0x09,0x00,0x18,0x94,0x65,0x00,0x00,0x8f,0x82,0xbd,0x50,0x25,0xc4,0x00,0xc0,
+0x3c,0x06,0xb0,0x03,0xa0,0x45,0x00,0x21,0xaf,0x84,0xbd,0x54,0xa0,0x89,0x00,0x18,
+0x94,0x65,0x00,0x00,0x8f,0x82,0xbd,0x54,0x25,0xc4,0x00,0xe4,0x34,0xc6,0x00,0x60,
+0xa0,0x45,0x00,0x21,0xaf,0x84,0xbd,0x58,0xa0,0x80,0x00,0x18,0x94,0xc5,0x00,0x00,
+0x8f,0x82,0xbd,0x58,0x25,0xc3,0x01,0x08,0x25,0xc7,0x01,0x2c,0xa0,0x45,0x00,0x21,
+0xaf,0x83,0xbd,0x5c,0xa0,0x60,0x00,0x18,0x94,0xc8,0x00,0x00,0x8f,0x82,0xbd,0x5c,
+0x25,0xc4,0x01,0x50,0x25,0xc5,0x01,0x74,0xa0,0x48,0x00,0x21,0x25,0xc6,0x01,0x98,
+0x25,0xc9,0x01,0xbc,0x25,0xca,0x01,0xe0,0x25,0xcb,0x02,0x04,0x25,0xcc,0x02,0x28,
+0x25,0xcd,0x02,0x4c,0x24,0x02,0x00,0x10,0x3c,0x03,0xb0,0x03,0xaf,0x87,0xbd,0x60,
+0x34,0x63,0x00,0x38,0xa0,0xe0,0x00,0x18,0xaf,0x84,0xbd,0x64,0xa0,0x80,0x00,0x18,
+0xaf,0x85,0xbd,0x68,0xa0,0xa0,0x00,0x18,0xaf,0x86,0xbd,0x6c,0xa0,0xc0,0x00,0x18,
+0xaf,0x89,0xbd,0x70,0xa1,0x20,0x00,0x18,0xaf,0x8a,0xbd,0x74,0xa1,0x40,0x00,0x18,
+0xaf,0x8b,0xbd,0x78,0xa1,0x60,0x00,0x18,0xaf,0x8c,0xbd,0x7c,0xa1,0x80,0x00,0x18,
+0xaf,0x8d,0xbd,0x80,0xa1,0xa2,0x00,0x18,0x94,0x64,0x00,0x00,0x8f,0x82,0xbd,0x80,
+0x25,0xc5,0x02,0x70,0x3c,0x03,0xb0,0x03,0xa0,0x44,0x00,0x21,0x24,0x02,0x00,0x11,
+0xaf,0x85,0xbd,0x84,0x34,0x63,0x00,0x6e,0xa0,0xa2,0x00,0x18,0x94,0x64,0x00,0x00,
+0x8f,0x82,0xbd,0x84,0x25,0xc5,0x02,0x94,0x3c,0x03,0xb0,0x03,0xa0,0x44,0x00,0x21,
+0x24,0x02,0x00,0x12,0xaf,0x85,0xbd,0x88,0x34,0x63,0x00,0x6c,0xa0,0xa2,0x00,0x18,
+0x94,0x64,0x00,0x00,0x8f,0x82,0xbd,0x88,0x24,0x05,0xff,0xff,0x24,0x07,0x00,0x01,
+0xa0,0x44,0x00,0x21,0x24,0x06,0x00,0x12,0x27,0x84,0xbd,0x40,0x8c,0x82,0x00,0x00,
+0x24,0xc6,0xff,0xff,0xa0,0x40,0x00,0x04,0x8c,0x83,0x00,0x00,0xa4,0x45,0x00,0x00,
+0xa4,0x45,0x00,0x02,0xa0,0x60,0x00,0x0a,0x8c,0x82,0x00,0x00,0xa4,0x65,0x00,0x06,
+0xa4,0x65,0x00,0x08,0xa0,0x40,0x00,0x10,0x8c,0x83,0x00,0x00,0xa4,0x45,0x00,0x0c,
+0xa4,0x45,0x00,0x0e,0xa0,0x60,0x00,0x12,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0xa0,0x40,0x00,0x16,0x8c,0x83,0x00,0x00,0xa4,0x45,0x00,0x14,0xa0,0x67,0x00,0x17,
+0x8c,0x82,0x00,0x00,0x24,0x84,0x00,0x04,0xa0,0x40,0x00,0x20,0x04,0xc1,0xff,0xe7,
+0xac,0x40,0x00,0x1c,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x01,0x34,0x42,0x00,0x20,0x24,0x63,0x82,0x6c,0xac,0x43,0x00,0x00,
+0x90,0x82,0x00,0x10,0x00,0x80,0x60,0x21,0x10,0x40,0x00,0x56,0x00,0x00,0x70,0x21,
+0x97,0x82,0x99,0x30,0x94,0x8a,0x00,0x0c,0x27,0x87,0x99,0x40,0x00,0x02,0x40,0xc0,
+0x01,0x02,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x47,0x10,0x21,0x90,0x8b,0x00,0x18,
+0xa4,0x4a,0x00,0x00,0x94,0x83,0x00,0x0e,0x39,0x64,0x00,0x10,0x2c,0x84,0x00,0x01,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x34,0x85,0x00,0x02,0x39,0x63,0x00,0x11,
+0x00,0x83,0x28,0x0b,0x34,0xa3,0x00,0x08,0x39,0x64,0x00,0x12,0x00,0x02,0x10,0x80,
+0x00,0xa4,0x18,0x0b,0x00,0x47,0x10,0x21,0x94,0x49,0x00,0x04,0x34,0x64,0x00,0x20,
+0x00,0x6b,0x20,0x0b,0x34,0x83,0x00,0x40,0x39,0x62,0x00,0x01,0x00,0x82,0x18,0x0b,
+0x00,0x09,0x30,0xc0,0x34,0x64,0x00,0x80,0x00,0xc9,0x28,0x21,0x39,0x62,0x00,0x02,
+0x00,0x60,0x68,0x21,0x00,0x82,0x68,0x0a,0x00,0x05,0x28,0x80,0x3c,0x02,0xb0,0x08,
+0x00,0xa7,0x28,0x21,0x00,0xc2,0x30,0x21,0x01,0x02,0x40,0x21,0x34,0x03,0xff,0xff,
+0x35,0xa4,0x01,0x00,0x39,0x62,0x00,0x03,0x2d,0x67,0x00,0x13,0xad,0x0a,0x00,0x00,
+0xa4,0xa3,0x00,0x00,0xac,0xc3,0x00,0x00,0xa7,0x89,0x99,0x30,0x10,0xe0,0x00,0x0f,
+0x00,0x82,0x68,0x0a,0x3c,0x03,0x80,0x01,0x00,0x0b,0x10,0x80,0x24,0x63,0x08,0xf0,
+0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x60,0x94,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x02,0x14,0x00,0x00,0x02,0x74,0x03,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x00,0x3a,0x94,0x44,0x00,0x00,0x93,0x83,0x99,0x24,0x91,0x82,0x00,0x21,
+0x01,0xc4,0x20,0x21,0x91,0x85,0x00,0x10,0x00,0x04,0x24,0x00,0x00,0x62,0x18,0x21,
+0x00,0x04,0x74,0x03,0x00,0x6e,0x18,0x23,0x00,0x65,0x10,0x2a,0x00,0xa2,0x18,0x0a,
+0x00,0x0d,0x24,0x00,0x3c,0x02,0xb0,0x06,0x24,0x05,0xff,0xff,0x00,0x64,0x18,0x25,
+0x34,0x42,0x80,0x20,0xac,0x43,0x00,0x00,0xa5,0x85,0x00,0x0e,0xa1,0x80,0x00,0x10,
+0xa5,0x85,0x00,0x0c,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x08,0x00,0x20,0xdf,0x34,0x63,0x00,0x62,0x3c,0x03,0xb0,0x03,0x08,0x00,0x20,0xdf,
+0x34,0x63,0x00,0x64,0x3c,0x03,0xb0,0x03,0x08,0x00,0x20,0xdf,0x34,0x63,0x00,0x66,
+0x3c,0x03,0xb0,0x03,0x08,0x00,0x20,0xdf,0x34,0x63,0x00,0x38,0x3c,0x03,0xb0,0x03,
+0x08,0x00,0x20,0xdf,0x34,0x63,0x00,0x6e,0x3c,0x03,0xb0,0x03,0x08,0x00,0x20,0xdf,
+0x34,0x63,0x00,0x6c,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,0x34,0x63,0x00,0x20,
+0x24,0x42,0x84,0x34,0x00,0x05,0x28,0x40,0xac,0x62,0x00,0x00,0x00,0xa6,0x28,0x21,
+0x2c,0xe2,0x00,0x10,0x14,0x80,0x00,0x06,0x00,0x00,0x18,0x21,0x10,0x40,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0xe0,0x18,0x21,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,
+0x24,0x02,0x00,0x20,0x10,0xe2,0x00,0x06,0x2c,0xe4,0x00,0x10,0x24,0xa2,0x00,0x01,
+0x10,0x80,0xff,0xf9,0x00,0x02,0x11,0x00,0x08,0x00,0x21,0x1a,0x00,0x47,0x18,0x21,
+0x08,0x00,0x21,0x1a,0x24,0xa3,0x00,0x50,0x27,0xbd,0xff,0xc8,0xaf,0xb4,0x00,0x20,
+0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x30,
+0xaf,0xb7,0x00,0x2c,0xaf,0xb6,0x00,0x28,0xaf,0xb5,0x00,0x24,0xaf,0xb0,0x00,0x10,
+0x00,0x80,0x90,0x21,0x84,0x84,0x00,0x08,0x3c,0x05,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0xa5,0x00,0x20,0x24,0x42,0x84,0x98,0x3c,0x03,0xb0,0x06,0x00,0x04,0x20,0x80,
+0xac,0xa2,0x00,0x00,0x00,0x83,0x20,0x21,0x3c,0x06,0xb0,0x06,0x8c,0x82,0x00,0x00,
+0x34,0xc6,0x80,0x24,0x8c,0x88,0x00,0x00,0x8c,0xc4,0x00,0x00,0x96,0x45,0x00,0x08,
+0x30,0x53,0xff,0xff,0x00,0x08,0x44,0x02,0x34,0x84,0x01,0x00,0x3c,0x02,0xb0,0x00,
+0x00,0x08,0x18,0xc0,0x00,0x13,0x3a,0x00,0xac,0xc4,0x00,0x00,0x00,0xe2,0x38,0x21,
+0xae,0x53,0x02,0xb8,0x00,0x68,0x18,0x21,0x24,0xa5,0x00,0x02,0x8c,0xf6,0x00,0x00,
+0x30,0xa5,0x01,0xff,0x8c,0xf5,0x00,0x04,0x27,0x86,0x99,0x40,0x00,0x03,0x18,0x80,
+0x00,0x13,0xa0,0xc0,0xa6,0x45,0x00,0x08,0x00,0x66,0x18,0x21,0x02,0x93,0x10,0x21,
+0x00,0x02,0x48,0x80,0x94,0x65,0x00,0x00,0x01,0x26,0x30,0x21,0x24,0x02,0xff,0xff,
+0x00,0x15,0x1a,0x02,0x27,0x84,0x99,0x50,0xa4,0xc2,0x00,0x02,0x30,0x63,0x00,0x1f,
+0x24,0x02,0x00,0x10,0x01,0x24,0x20,0x21,0xa4,0xc8,0x00,0x04,0x8c,0xf0,0x00,0x08,
+0xa6,0x43,0x00,0x06,0xa6,0x45,0x00,0x0a,0xa0,0x82,0x00,0x06,0x86,0x43,0x00,0x06,
+0x27,0x82,0x99,0x44,0x01,0x22,0x88,0x21,0x24,0x02,0x00,0x13,0x10,0x62,0x00,0xee,
+0xae,0x27,0x00,0x18,0x3c,0x03,0xb0,0x03,0x34,0x63,0x01,0x00,0xa6,0x40,0x00,0x02,
+0x3c,0x02,0xb0,0x03,0x90,0x64,0x00,0x00,0x34,0x42,0x01,0x08,0x8c,0x45,0x00,0x00,
+0x00,0x10,0x1b,0xc2,0x00,0x04,0x20,0x82,0x30,0x63,0x00,0x01,0xac,0xc5,0x00,0x08,
+0x10,0x60,0x00,0xc7,0x30,0x97,0x00,0x01,0x00,0x10,0x16,0x82,0x30,0x46,0x00,0x01,
+0x00,0x10,0x12,0x02,0x00,0x10,0x19,0xc2,0x00,0x10,0x26,0x02,0x00,0x10,0x2e,0x42,
+0x30,0x48,0x00,0x7f,0x24,0x02,0x00,0x01,0x30,0x71,0x00,0x01,0x30,0x84,0x00,0x01,
+0x10,0xc2,0x00,0xb3,0x30,0xa3,0x00,0x01,0x00,0x60,0x28,0x21,0x0c,0x00,0x21,0x0d,
+0x01,0x00,0x38,0x21,0x02,0x93,0x18,0x21,0x00,0x03,0x18,0x80,0x2c,0x46,0x00,0x54,
+0x27,0x85,0x99,0x50,0x27,0x84,0x99,0x48,0x00,0x06,0x10,0x0a,0x00,0x65,0x28,0x21,
+0x26,0x26,0x00,0x02,0x00,0x64,0x18,0x21,0xa0,0xa2,0x00,0x02,0xa0,0x66,0x00,0x06,
+0xa0,0x62,0x00,0x07,0xa0,0xa2,0x00,0x01,0x02,0x93,0x28,0x21,0x00,0x05,0x28,0x80,
+0x27,0x82,0x99,0x44,0x00,0xa2,0x58,0x21,0x8d,0x64,0x00,0x18,0x00,0x10,0x15,0xc2,
+0x30,0x42,0x00,0x01,0x8c,0x83,0x00,0x0c,0x27,0x84,0x99,0x60,0x00,0xa4,0x48,0x21,
+0xa6,0x42,0x00,0x00,0xa6,0x56,0x00,0x04,0x8d,0x26,0x00,0x00,0x00,0x03,0x19,0x42,
+0x3c,0x02,0xff,0xef,0x34,0x42,0xff,0xff,0x30,0x63,0x00,0x01,0x00,0xc2,0x40,0x24,
+0x00,0x03,0x1d,0x00,0x01,0x03,0x40,0x25,0x00,0x08,0x15,0x02,0x00,0x10,0x34,0x42,
+0x00,0x10,0x3c,0x82,0x00,0x15,0x19,0x82,0x00,0x15,0x25,0x82,0x00,0x10,0x2c,0x02,
+0x30,0x42,0x00,0x01,0x30,0xcd,0x00,0x01,0x30,0x6c,0x00,0x01,0x30,0xe6,0x00,0x01,
+0x30,0x8a,0x00,0x03,0x32,0xb1,0x00,0x07,0x30,0xa5,0x00,0x01,0xad,0x28,0x00,0x00,
+0x10,0x40,0x00,0x0b,0x32,0x07,0x00,0x7f,0x8d,0x64,0x00,0x18,0x3c,0x03,0xff,0xf0,
+0x34,0x63,0xff,0xff,0x8c,0x82,0x00,0x0c,0x01,0x03,0x18,0x24,0x00,0x02,0x13,0x82,
+0x30,0x42,0x00,0x0f,0x00,0x02,0x14,0x00,0x00,0x62,0x18,0x25,0xad,0x23,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xc2,0x00,0x6a,0x00,0x00,0x00,0x00,0x15,0x80,0x00,0x03,
+0x00,0x00,0x00,0x00,0x15,0x40,0x00,0x5b,0x24,0x02,0x00,0x01,0x96,0x42,0x00,0x04,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x04,0xa6,0x42,0x00,0x04,0x00,0xa0,0x20,0x21,
+0x0c,0x00,0x21,0x0d,0x01,0xa0,0x28,0x21,0x02,0x93,0x18,0x21,0x00,0x03,0x40,0x80,
+0x2c,0x45,0x00,0x54,0x27,0x84,0x99,0x50,0x01,0x04,0x20,0x21,0x00,0x05,0x10,0x0a,
+0xa0,0x82,0x00,0x00,0xa0,0x80,0x00,0x04,0xa0,0x80,0x00,0x05,0x96,0x43,0x00,0x04,
+0x27,0x82,0x99,0x40,0x01,0x02,0x10,0x21,0xa4,0x43,0x00,0x06,0x27,0x82,0x99,0x44,
+0x92,0x46,0x00,0x01,0x01,0x02,0x10,0x21,0x8c,0x45,0x00,0x18,0x27,0x83,0x99,0x60,
+0x01,0x03,0x18,0x21,0xa0,0x60,0x00,0x00,0xa0,0x86,0x00,0x07,0x94,0xa2,0x00,0x10,
+0x24,0x03,0x00,0x04,0x30,0x42,0x00,0x0f,0x10,0x43,0x00,0x36,0x24,0xa5,0x00,0x10,
+0x94,0xa3,0x00,0x16,0x27,0x87,0x99,0x58,0x01,0x07,0x10,0x21,0xa4,0x43,0x00,0x02,
+0x94,0xa2,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x24,
+0x02,0x93,0x20,0x21,0x94,0xa2,0x00,0x00,0x24,0x03,0x00,0xa4,0x30,0x42,0x00,0xff,
+0x10,0x43,0x00,0x1f,0x00,0x00,0x00,0x00,0x94,0xa2,0x00,0x00,0x24,0x03,0x00,0x88,
+0x30,0x42,0x00,0x88,0x10,0x43,0x00,0x14,0x02,0x93,0x18,0x21,0x27,0x84,0x99,0x60,
+0x00,0x03,0x18,0x80,0x00,0x64,0x18,0x21,0x8c,0x62,0x00,0x00,0x3c,0x04,0x00,0x80,
+0x00,0x44,0x10,0x25,0xac,0x62,0x00,0x00,0x02,0x93,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x47,0x10,0x21,0xa0,0x51,0x00,0x00,0x8f,0xbf,0x00,0x30,0x7b,0xb6,0x01,0x7c,
+0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x24,0x02,0x00,0x01,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0x94,0xa2,0x00,0x18,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x60,0x10,0x40,0xff,0xe9,0x02,0x93,0x18,0x21,0x02,0x93,0x20,0x21,
+0x27,0x82,0x99,0x60,0x00,0x04,0x20,0x80,0x00,0x82,0x20,0x21,0x8c,0x83,0x00,0x00,
+0x3c,0x02,0xff,0x7f,0x34,0x42,0xff,0xff,0x00,0x62,0x18,0x24,0x08,0x00,0x22,0x02,
+0xac,0x83,0x00,0x00,0x27,0x87,0x99,0x58,0x01,0x07,0x10,0x21,0x08,0x00,0x21,0xec,
+0xa4,0x40,0x00,0x02,0x11,0x42,0x00,0x07,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x02,
+0x14,0x40,0xff,0xa7,0x00,0xa0,0x20,0x21,0x96,0x42,0x00,0x04,0x08,0x00,0x21,0xca,
+0x24,0x42,0x00,0x0c,0x96,0x42,0x00,0x04,0x08,0x00,0x21,0xca,0x24,0x42,0x00,0x08,
+0x16,0xe6,0xff,0x96,0x3c,0x02,0xff,0xfb,0x8d,0x63,0x00,0x18,0x34,0x42,0xff,0xff,
+0x02,0x02,0x10,0x24,0xac,0x62,0x00,0x08,0x08,0x00,0x21,0xc3,0x00,0x00,0x30,0x21,
+0x16,0xe6,0xff,0x4e,0x00,0x60,0x28,0x21,0x3c,0x02,0xfb,0xff,0x34,0x42,0xff,0xff,
+0x02,0x02,0x10,0x24,0xac,0xe2,0x00,0x08,0x08,0x00,0x21,0x82,0x00,0x00,0x30,0x21,
+0x93,0x87,0xc4,0x54,0x00,0x10,0x1e,0x42,0x00,0x10,0x26,0x82,0x27,0x82,0x99,0x48,
+0x2c,0xe5,0x00,0x0c,0x01,0x22,0x48,0x21,0x30,0x63,0x00,0x01,0x30,0x86,0x00,0x01,
+0x14,0xa0,0x00,0x06,0x00,0xe0,0x40,0x21,0x00,0x03,0x10,0x40,0x00,0x46,0x10,0x21,
+0x00,0x02,0x11,0x00,0x00,0xe2,0x10,0x21,0x24,0x48,0x00,0x04,0x02,0x93,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x84,0x99,0x50,0x27,0x83,0x99,0x48,0x00,0x44,0x20,0x21,
+0x00,0x43,0x10,0x21,0xa1,0x28,0x00,0x07,0xa0,0x40,0x00,0x06,0xa0,0x80,0x00,0x02,
+0x08,0x00,0x21,0x92,0xa0,0x80,0x00,0x01,0x24,0x02,0x00,0x01,0x00,0xe0,0x20,0x21,
+0x0c,0x00,0x01,0xc2,0xa6,0x42,0x00,0x02,0x8e,0x24,0x00,0x18,0x0c,0x00,0x05,0x39,
+0x00,0x00,0x00,0x00,0x08,0x00,0x22,0x06,0x00,0x00,0x00,0x00,0x30,0xa7,0xff,0xff,
+0x00,0x07,0x18,0xc0,0x00,0x67,0x18,0x21,0x3c,0x06,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x24,0x42,0x89,0x7c,0x27,0x85,0x99,0x50,0x00,0x03,0x18,0x80,0x34,0xc6,0x00,0x20,
+0x00,0x65,0x18,0x21,0xac,0xc2,0x00,0x00,0x80,0x62,0x00,0x07,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x29,0x00,0x80,0x28,0x21,0x90,0x82,0x00,0x16,0x00,0x00,0x00,0x00,
+0x34,0x42,0x00,0x02,0x30,0x43,0x00,0x01,0x14,0x60,0x00,0x02,0xa0,0x82,0x00,0x16,
+0xa0,0x80,0x00,0x17,0x90,0xa2,0x00,0x04,0x3c,0x03,0xb0,0x03,0x27,0x86,0x99,0x40,
+0x14,0x40,0x00,0x06,0x34,0x63,0x00,0x20,0x24,0x02,0x00,0x01,0xa0,0xa2,0x00,0x04,
+0xa4,0xa7,0x00,0x02,0x03,0xe0,0x00,0x08,0xa4,0xa7,0x00,0x00,0x94,0xa4,0x00,0x02,
+0x3c,0x02,0x80,0x01,0x24,0x42,0xa1,0x7c,0xac,0x62,0x00,0x00,0x00,0x04,0x18,0xc0,
+0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x94,0x62,0x00,0x04,
+0xa4,0x67,0x00,0x02,0x3c,0x03,0xb0,0x08,0x00,0x02,0x20,0xc0,0x00,0x82,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x46,0x10,0x21,0x00,0x83,0x20,0x21,0xa4,0x47,0x00,0x00,
+0xac,0x87,0x00,0x00,0x90,0xa2,0x00,0x04,0xa4,0xa7,0x00,0x02,0x24,0x42,0x00,0x01,
+0x03,0xe0,0x00,0x08,0xa0,0xa2,0x00,0x04,0x90,0x82,0x00,0x16,0x24,0x85,0x00,0x06,
+0x34,0x42,0x00,0x01,0x30,0x43,0x00,0x02,0x14,0x60,0xff,0xda,0xa0,0x82,0x00,0x16,
+0x24,0x02,0x00,0x01,0x08,0x00,0x22,0x75,0xa0,0x82,0x00,0x17,0x27,0xbd,0xff,0xe8,
+0xaf,0xbf,0x00,0x10,0x00,0x80,0x38,0x21,0x84,0x84,0x00,0x02,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x01,0x3c,0x0a,0xb0,0x06,0x34,0x63,0x00,0x20,0x24,0x42,0x8a,0x7c,
+0x3c,0x0b,0xb0,0x08,0x27,0x89,0x99,0x40,0x34,0x0c,0xff,0xff,0x35,0x4a,0x80,0x20,
+0x10,0x80,0x00,0x30,0xac,0x62,0x00,0x00,0x97,0x82,0x99,0x30,0x94,0xe6,0x02,0xba,
+0x00,0x02,0x18,0xc0,0x00,0x6b,0x28,0x21,0xac,0xa6,0x00,0x00,0x8c,0xe4,0x02,0xb8,
+0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x04,0x10,0xc0,0x00,0x44,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x49,0x10,0x21,0x94,0x48,0x00,0x04,0x00,0x69,0x18,0x21,
+0xa4,0x66,0x00,0x00,0x00,0x08,0x28,0xc0,0x00,0xab,0x10,0x21,0xac,0x4c,0x00,0x00,
+0x8c,0xe4,0x02,0xb8,0x27,0x82,0x99,0x44,0x00,0xa8,0x28,0x21,0x00,0x04,0x18,0xc0,
+0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,0x8c,0x46,0x00,0x18,
+0x27,0x84,0x99,0x50,0x00,0x64,0x18,0x21,0x8c,0xc2,0x00,0x00,0x80,0x67,0x00,0x06,
+0x00,0x05,0x28,0x80,0x30,0x42,0xff,0xff,0x00,0x47,0x10,0x21,0x30,0x43,0x00,0xff,
+0x00,0x03,0x18,0x2b,0x00,0x02,0x12,0x02,0x00,0x43,0x10,0x21,0x3c,0x04,0x00,0x04,
+0x00,0xa9,0x28,0x21,0x00,0x44,0x10,0x25,0xa4,0xac,0x00,0x00,0xad,0x42,0x00,0x00,
+0xa7,0x88,0x99,0x30,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x84,0xe3,0x00,0x06,0x27,0x82,0xbd,0x40,0x94,0xe5,0x02,0xba,
+0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,0x8c,0x64,0x00,0x00,0x0c,0x00,0x22,0x5f,
+0x00,0x00,0x00,0x00,0x08,0x00,0x22,0xd9,0x00,0x00,0x00,0x00,0x94,0x88,0x00,0x00,
+0x00,0x80,0x58,0x21,0x27,0x8a,0x99,0x40,0x00,0x08,0x18,0xc0,0x00,0x68,0x18,0x21,
+0x3c,0x04,0xb0,0x03,0x00,0x03,0x18,0x80,0x3c,0x02,0x80,0x01,0x00,0x6a,0x18,0x21,
+0x34,0x84,0x00,0x20,0x24,0x42,0x8b,0x9c,0x30,0xa5,0xff,0xff,0xac,0x82,0x00,0x00,
+0x94,0x67,0x00,0x02,0x11,0x05,0x00,0x35,0x24,0x04,0x00,0x01,0x91,0x66,0x00,0x04,
+0x00,0x00,0x00,0x00,0x00,0x86,0x10,0x2a,0x10,0x40,0x00,0x10,0x00,0xc0,0x48,0x21,
+0x3c,0x0d,0xb0,0x03,0x01,0x40,0x60,0x21,0x35,0xad,0x00,0x20,0x10,0xe5,0x00,0x0d,
+0x24,0x84,0x00,0x01,0x00,0x07,0x10,0xc0,0x00,0x47,0x10,0x21,0x00,0x02,0x10,0x80,
+0x01,0x20,0x30,0x21,0x00,0x4a,0x10,0x21,0x00,0x86,0x18,0x2a,0x00,0xe0,0x40,0x21,
+0x94,0x47,0x00,0x02,0x14,0x60,0xff,0xf5,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x10,0x21,0x00,0x08,0x20,0xc0,0x00,0x88,0x20,0x21,0x24,0xc2,0xff,0xff,
+0x00,0x04,0x20,0x80,0xa1,0x62,0x00,0x04,0x00,0x8c,0x20,0x21,0x94,0x83,0x00,0x04,
+0x00,0x07,0x10,0xc0,0x00,0x47,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x4c,0x10,0x21,
+0x00,0x03,0x28,0xc0,0x94,0x46,0x00,0x02,0x00,0xa3,0x18,0x21,0x00,0x03,0x18,0x80,
+0x00,0x6c,0x18,0x21,0xa4,0x66,0x00,0x00,0xa4,0x86,0x00,0x02,0x95,0x64,0x00,0x02,
+0x3c,0x03,0xb0,0x08,0x3c,0x02,0x80,0x01,0x00,0xa3,0x28,0x21,0x24,0x42,0xa1,0x7c,
+0xad,0xa2,0x00,0x00,0x10,0x87,0x00,0x03,0xac,0xa6,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x24,0x02,0x00,0x01,0x08,0x00,0x23,0x27,0xa5,0x68,0x00,0x02,0x91,0x62,0x00,0x04,
+0xa5,0x67,0x00,0x00,0x24,0x42,0xff,0xff,0x30,0x43,0x00,0xff,0x14,0x60,0xff,0xf7,
+0xa1,0x62,0x00,0x04,0x24,0x02,0xff,0xff,0x08,0x00,0x23,0x27,0xa5,0x62,0x00,0x02,
+0x00,0x05,0x40,0xc0,0x01,0x05,0x30,0x21,0x27,0xbd,0xff,0xd8,0x00,0x06,0x30,0x80,
+0x27,0x82,0x99,0x44,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x20,
+0xaf,0xb3,0x00,0x1c,0xaf,0xb0,0x00,0x10,0x00,0xc2,0x10,0x21,0x8c,0x47,0x00,0x18,
+0x00,0xa0,0x90,0x21,0x3c,0x02,0x80,0x01,0x3c,0x05,0xb0,0x03,0x34,0xa5,0x00,0x20,
+0x24,0x42,0x8c,0xd0,0xac,0xa2,0x00,0x00,0x27,0x83,0x99,0x50,0x00,0xc3,0x30,0x21,
+0x8c,0xe2,0x00,0x00,0x80,0xc5,0x00,0x06,0x00,0x80,0x88,0x21,0x30,0x42,0xff,0xff,
+0x00,0x45,0x10,0x21,0x30,0x43,0x00,0xff,0x10,0x60,0x00,0x02,0x00,0x02,0x12,0x02,
+0x24,0x42,0x00,0x01,0x30,0x53,0x00,0xff,0x01,0x12,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x83,0x99,0x50,0x00,0x43,0x10,0x21,0x80,0x44,0x00,0x07,0x00,0x00,0x00,0x00,
+0x10,0x80,0x00,0x4b,0x26,0x24,0x00,0x06,0x32,0x50,0xff,0xff,0x02,0x20,0x20,0x21,
+0x0c,0x00,0x22,0xe7,0x02,0x00,0x28,0x21,0x92,0x22,0x00,0x10,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x2e,0x3c,0x03,0xb0,0x08,0x3c,0x09,0x80,0x01,0x27,0x88,0x99,0x40,
+0xa6,0x32,0x00,0x0c,0x00,0x10,0x20,0xc0,0x00,0x90,0x20,0x21,0x00,0x04,0x20,0x80,
+0x00,0x88,0x20,0x21,0x94,0x82,0x00,0x04,0x3c,0x03,0xb0,0x08,0x3c,0x07,0xb0,0x03,
+0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x48,0x10,0x21,
+0x00,0xa3,0x28,0x21,0x25,0x26,0xa1,0x7c,0x34,0x03,0xff,0xff,0x34,0xe7,0x00,0x20,
+0xac,0xe6,0x00,0x00,0xa4,0x83,0x00,0x02,0xa4,0x43,0x00,0x00,0xac,0xa3,0x00,0x00,
+0x92,0x22,0x00,0x10,0x92,0x23,0x00,0x0a,0xa6,0x32,0x00,0x0e,0x02,0x62,0x10,0x21,
+0x14,0x60,0x00,0x05,0xa2,0x22,0x00,0x10,0x92,0x22,0x00,0x16,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xfe,0xa2,0x22,0x00,0x16,0x92,0x22,0x00,0x04,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x92,0x22,0x00,0x16,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xfd,0xa2,0x22,0x00,0x16,0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x96,0x22,0x00,0x0e,
+0x27,0x88,0x99,0x40,0x00,0x02,0x20,0xc0,0x00,0x82,0x20,0x21,0x00,0x04,0x20,0x80,
+0x00,0x88,0x20,0x21,0x94,0x82,0x00,0x04,0x3c,0x06,0xb0,0x03,0x3c,0x09,0x80,0x01,
+0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0xa3,0x28,0x21,
+0x00,0x48,0x10,0x21,0x34,0xc6,0x00,0x20,0x25,0x23,0xa1,0x7c,0xac,0xc3,0x00,0x00,
+0xa4,0x50,0x00,0x00,0xac,0xb0,0x00,0x00,0x08,0x00,0x23,0x65,0xa4,0x90,0x00,0x02,
+0x08,0x00,0x23,0x5c,0x32,0x50,0xff,0xff,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x24,0x42,0x8e,0x98,0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,0x90,0x82,0x00,0x04,
+0x97,0xaa,0x00,0x12,0x00,0x80,0x60,0x21,0x30,0xa8,0xff,0xff,0x00,0x4a,0x20,0x23,
+0x34,0x09,0xff,0xff,0x30,0xcf,0xff,0xff,0x30,0xee,0xff,0xff,0x11,0x09,0x00,0x73,
+0xa1,0x84,0x00,0x04,0x00,0x0e,0xc0,0xc0,0x00,0x08,0x10,0xc0,0x00,0x48,0x10,0x21,
+0x03,0x0e,0x20,0x21,0x27,0x8d,0x99,0x40,0x00,0x04,0x20,0x80,0x00,0x02,0x10,0x80,
+0x00,0x4d,0x10,0x21,0x00,0x8d,0x20,0x21,0x94,0x86,0x00,0x02,0x94,0x43,0x00,0x04,
+0x3c,0x19,0x80,0x01,0xa4,0x46,0x00,0x02,0x00,0x03,0x28,0xc0,0x00,0xa3,0x18,0x21,
+0x94,0x87,0x00,0x02,0x3c,0x02,0xb0,0x08,0x00,0x03,0x18,0x80,0x00,0xa2,0x28,0x21,
+0x00,0x6d,0x18,0x21,0x27,0x22,0xa1,0x7c,0x3c,0x01,0xb0,0x03,0xac,0x22,0x00,0x20,
+0xa4,0x66,0x00,0x00,0x10,0xe9,0x00,0x57,0xac,0xa6,0x00,0x00,0x01,0xe0,0x30,0x21,
+0x11,0x40,0x00,0x1d,0x00,0x00,0x48,0x21,0x01,0x40,0x38,0x21,0x27,0x8b,0x99,0x44,
+0x27,0x8a,0x99,0x50,0x00,0x06,0x40,0xc0,0x01,0x06,0x18,0x21,0x00,0x03,0x18,0x80,
+0x00,0x6b,0x10,0x21,0x8c,0x44,0x00,0x18,0x00,0x6a,0x18,0x21,0x80,0x65,0x00,0x06,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0xff,0xff,0x00,0x45,0x10,0x21,
+0x30,0x44,0x00,0xff,0x00,0x02,0x12,0x02,0x01,0x22,0x18,0x21,0x24,0x62,0x00,0x01,
+0x14,0x80,0x00,0x02,0x30,0x49,0x00,0xff,0x30,0x69,0x00,0xff,0x01,0x06,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x4d,0x10,0x21,0x24,0xe7,0xff,0xff,0x94,0x46,0x00,0x02,
+0x14,0xe0,0xff,0xe9,0x00,0x06,0x40,0xc0,0x91,0x82,0x00,0x10,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x20,0x3c,0x06,0xb0,0x03,0xa5,0x8f,0x00,0x0c,0x03,0x0e,0x20,0x21,
+0x00,0x04,0x20,0x80,0x00,0x8d,0x20,0x21,0x94,0x82,0x00,0x04,0x3c,0x03,0xb0,0x08,
+0x3c,0x07,0xb0,0x03,0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x4d,0x10,0x21,0x00,0xa3,0x28,0x21,0x27,0x26,0xa1,0x7c,0x34,0x03,0xff,0xff,
+0x34,0xe7,0x00,0x20,0xac,0xe6,0x00,0x00,0xa4,0x83,0x00,0x02,0xa4,0x43,0x00,0x00,
+0xac,0xa3,0x00,0x00,0x91,0x82,0x00,0x10,0x91,0x83,0x00,0x04,0xa5,0x8e,0x00,0x0e,
+0x01,0x22,0x10,0x21,0x14,0x60,0x00,0x05,0xa1,0x82,0x00,0x10,0x91,0x82,0x00,0x16,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfd,0xa1,0x82,0x00,0x16,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x95,0x82,0x00,0x0e,0x3c,0x03,0xb0,0x08,0x00,0x02,0x20,0xc0,
+0x00,0x82,0x20,0x21,0x00,0x04,0x20,0x80,0x00,0x8d,0x20,0x21,0x94,0x82,0x00,0x04,
+0x34,0xc6,0x00,0x20,0x27,0x27,0xa1,0x7c,0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0xa3,0x28,0x21,0x00,0x4d,0x10,0x21,0xac,0xc7,0x00,0x00,
+0xa4,0x8f,0x00,0x02,0xa4,0x4f,0x00,0x00,0xac,0xaf,0x00,0x00,0x08,0x00,0x23,0xf4,
+0x03,0x0e,0x20,0x21,0x08,0x00,0x23,0xcf,0xa5,0x88,0x00,0x02,0x00,0x0e,0xc0,0xc0,
+0x03,0x0e,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x8d,0x99,0x40,0x00,0x4d,0x10,0x21,
+0x94,0x43,0x00,0x02,0x30,0x84,0x00,0xff,0x14,0x80,0x00,0x05,0xa5,0x83,0x00,0x00,
+0x24,0x02,0xff,0xff,0x3c,0x19,0x80,0x01,0x08,0x00,0x23,0xcf,0xa5,0x82,0x00,0x02,
+0x08,0x00,0x23,0xcf,0x3c,0x19,0x80,0x01,0x3c,0x08,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x27,0xbd,0xff,0x78,0x35,0x08,0x00,0x20,0x24,0x42,0x90,0xd8,0xaf,0xb2,0x00,0x68,
+0xaf,0xb1,0x00,0x64,0xaf,0xb0,0x00,0x60,0xad,0x02,0x00,0x00,0xaf,0xbf,0x00,0x84,
+0xaf,0xbe,0x00,0x80,0xaf,0xb7,0x00,0x7c,0xaf,0xb6,0x00,0x78,0xaf,0xb5,0x00,0x74,
+0xaf,0xb4,0x00,0x70,0xaf,0xb3,0x00,0x6c,0xaf,0xa4,0x00,0x88,0x90,0x83,0x00,0x0a,
+0x27,0x82,0xbd,0x40,0xaf,0xa6,0x00,0x90,0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,
+0x8c,0x63,0x00,0x00,0xaf,0xa7,0x00,0x94,0x27,0x86,0x99,0x44,0xaf,0xa3,0x00,0x1c,
+0x94,0x63,0x00,0x14,0x30,0xb1,0xff,0xff,0x24,0x08,0x00,0x01,0x00,0x03,0x20,0xc0,
+0xaf,0xa3,0x00,0x18,0x00,0x83,0x18,0x21,0xaf,0xa4,0x00,0x54,0x00,0x03,0x18,0x80,
+0x27,0x84,0x99,0x50,0x00,0x64,0x20,0x21,0x80,0x82,0x00,0x06,0x00,0x66,0x18,0x21,
+0x8c,0x66,0x00,0x18,0x24,0x42,0x00,0x02,0x00,0x02,0x1f,0xc2,0x8c,0xc4,0x00,0x08,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,0x00,0x04,0x2f,0xc2,
+0x00,0x04,0x1c,0x82,0x00,0xc2,0x38,0x21,0x00,0x04,0x24,0x42,0x8f,0xa2,0x00,0x1c,
+0x30,0x63,0x00,0x01,0x30,0x84,0x00,0x01,0xaf,0xa5,0x00,0x3c,0xaf,0xa3,0x00,0x34,
+0xaf,0xa4,0x00,0x38,0xaf,0xa0,0x00,0x40,0xaf,0xa0,0x00,0x44,0xaf,0xa0,0x00,0x50,
+0xaf,0xa8,0x00,0x20,0x80,0x42,0x00,0x12,0x8f,0xb2,0x00,0x18,0xaf,0xa2,0x00,0x28,
+0x8c,0xd0,0x00,0x0c,0x14,0xa0,0x01,0xda,0x00,0x60,0x30,0x21,0x00,0x10,0x10,0x82,
+0x30,0x45,0x00,0x07,0x10,0xa0,0x00,0x11,0xaf,0xa0,0x00,0x30,0x8f,0xa4,0x00,0x98,
+0x27,0x82,0x86,0x30,0x00,0x04,0x18,0x40,0x00,0x62,0x18,0x21,0x24,0xa2,0x00,0x05,
+0x8f,0xa5,0x00,0x20,0x94,0x64,0x00,0x00,0x00,0x45,0x10,0x04,0x00,0x44,0x00,0x1a,
+0x14,0x80,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0d,0x00,0x00,0x10,0x12,
+0x24,0x42,0x00,0x10,0x30,0x42,0xff,0xfc,0xaf,0xa2,0x00,0x30,0x8f,0xa3,0x00,0x18,
+0x8f,0xa4,0x00,0x28,0x34,0x02,0xff,0xff,0xaf,0xa0,0x00,0x2c,0xaf,0xa2,0x00,0x48,
+0xaf,0xa3,0x00,0x4c,0x00,0x60,0xf0,0x21,0x00,0x00,0xb8,0x21,0x18,0x80,0x00,0x4e,
+0xaf,0xa0,0x00,0x24,0x00,0x11,0x89,0x02,0xaf,0xb1,0x00,0x58,0x00,0x80,0xa8,0x21,
+0x00,0x12,0x10,0xc0,0x00,0x52,0x20,0x21,0x00,0x04,0x20,0x80,0x00,0x40,0xa0,0x21,
+0x27,0x82,0x99,0x58,0x00,0x82,0x10,0x21,0x94,0x43,0x00,0x02,0x8f,0xa6,0x00,0x58,
+0x27,0x85,0x99,0x40,0x00,0x03,0x19,0x02,0x00,0x66,0x18,0x23,0x30,0x63,0x0f,0xff,
+0x00,0x85,0x20,0x21,0x28,0x62,0x00,0x20,0x94,0x96,0x00,0x02,0x10,0x40,0x01,0xa1,
+0x28,0x62,0x00,0x40,0x8f,0xa8,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x68,0x10,0x06,
+0x30,0x43,0x00,0x01,0x24,0x02,0x00,0x01,0x10,0x62,0x01,0x7b,0x3c,0x02,0xb0,0x03,
+0x8f,0xa6,0x00,0x88,0x34,0x42,0x01,0x04,0x84,0xc5,0x00,0x0c,0x02,0x92,0x18,0x21,
+0x94,0x46,0x00,0x00,0x00,0x05,0x20,0xc0,0x00,0x85,0x20,0x21,0x00,0x03,0x18,0x80,
+0x27,0x82,0x99,0x50,0x27,0x85,0x99,0x48,0x00,0x65,0x28,0x21,0x00,0x62,0x18,0x21,
+0x80,0x71,0x00,0x05,0x80,0x73,0x00,0x04,0x8f,0xa3,0x00,0x88,0x30,0xd0,0xff,0xff,
+0x00,0x10,0x3a,0x03,0x32,0x08,0x00,0xff,0x27,0x82,0x99,0x60,0x00,0x04,0x20,0x80,
+0x80,0xa6,0x00,0x06,0x00,0x82,0x20,0x21,0xa4,0x67,0x00,0x44,0xa4,0x68,0x00,0x46,
+0x8c,0x84,0x00,0x00,0x38,0xc6,0x00,0x00,0x01,0x00,0x80,0x21,0x00,0x04,0x15,0x02,
+0x30,0x42,0x00,0x01,0x10,0x40,0x00,0x03,0x00,0xe6,0x80,0x0a,0x00,0x04,0x14,0x02,
+0x30,0x50,0x00,0x0f,0x12,0x20,0x01,0x50,0x02,0x40,0x20,0x21,0x02,0x71,0x10,0x21,
+0x00,0x50,0x10,0x2a,0x14,0x40,0x00,0xed,0x02,0x92,0x10,0x21,0x93,0x82,0x94,0x51,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0xe0,0x02,0x92,0x28,0x21,
+0x26,0xe2,0x00,0x01,0x30,0x57,0xff,0xff,0x02,0x40,0xf0,0x21,0x26,0xb5,0xff,0xff,
+0x16,0xa0,0xff,0xb7,0x02,0xc0,0x90,0x21,0x16,0xe0,0x00,0xd0,0x00,0x00,0x00,0x00,
+0x8f,0xa3,0x00,0x98,0x00,0x00,0x00,0x00,0x2c,0x62,0x00,0x10,0x10,0x40,0x00,0x2e,
+0x00,0x00,0x00,0x00,0x8f,0xa4,0x00,0x24,0x00,0x00,0x00,0x00,0x18,0x80,0x00,0x2a,
+0x24,0x03,0x00,0x01,0x8f,0xa5,0x00,0x1c,0x27,0x84,0x99,0x44,0x94,0xb2,0x00,0x14,
+0xa0,0xa3,0x00,0x12,0x8f,0xa6,0x00,0x3c,0x00,0x12,0x10,0xc0,0x00,0x52,0x10,0x21,
+0x00,0x02,0x80,0x80,0x27,0x82,0x99,0x50,0x02,0x02,0x10,0x21,0x80,0x43,0x00,0x06,
+0x02,0x04,0x20,0x21,0x8c,0x85,0x00,0x18,0x24,0x63,0x00,0x02,0x00,0x03,0x17,0xc2,
+0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x43,0x00,0x03,0x18,0x40,0x14,0xc0,0x00,0x0e,
+0x00,0xa3,0x38,0x21,0x27,0x82,0x99,0x40,0x02,0x02,0x10,0x21,0x94,0x43,0x00,0x06,
+0x8f,0xa8,0x00,0x1c,0x24,0x02,0x00,0x01,0xa5,0x03,0x00,0x1a,0x7b,0xbe,0x04,0x3c,
+0x7b,0xb6,0x03,0xfc,0x7b,0xb4,0x03,0xbc,0x7b,0xb2,0x03,0x7c,0x7b,0xb0,0x03,0x3c,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x88,0x8f,0xa4,0x00,0x98,0x8f,0xa5,0x00,0x38,
+0x8f,0xa6,0x00,0x34,0xaf,0xa0,0x00,0x10,0x0c,0x00,0x10,0xa7,0xaf,0xa0,0x00,0x14,
+0x08,0x00,0x25,0x01,0x00,0x00,0x00,0x00,0x8f,0xa3,0x00,0x44,0x93,0x82,0x87,0x6d,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x61,0x30,0x69,0x00,0x03,0x8f,0xa4,0x00,0x24,
+0x8f,0xa5,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x85,0x10,0x2a,0x10,0x40,0x00,0x8f,
+0x00,0x00,0x00,0x00,0x8f,0xa6,0x00,0x1c,0x00,0x00,0x00,0x00,0x90,0xc4,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x83,0x00,0xff,0x00,0xa3,0x10,0x2a,0x10,0x40,0x00,0x87,
+0x00,0x00,0x00,0x00,0x8f,0xa8,0x00,0x24,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x83,
+0x00,0x65,0x10,0x23,0x00,0xa8,0x18,0x23,0x00,0x62,0x10,0x2a,0x14,0x40,0x00,0x7d,
+0x30,0x63,0x00,0xff,0x00,0x85,0x10,0x23,0x30,0x42,0x00,0xff,0xaf,0xa2,0x00,0x50,
+0x8f,0xa2,0x00,0x50,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x73,0x00,0x00,0xa8,0x21,
+0x27,0x8c,0x99,0x40,0x3c,0x0b,0x80,0xff,0x24,0x10,0x00,0x04,0x27,0x91,0x99,0x44,
+0x35,0x6b,0xff,0xff,0x3c,0x0d,0x7f,0x00,0x27,0x8e,0x99,0x50,0x01,0x80,0x78,0x21,
+0x00,0x12,0x30,0xc0,0x00,0xd2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x4c,0x10,0x21,
+0x94,0x42,0x00,0x06,0x8f,0xa3,0x00,0x2c,0x8f,0xa4,0x00,0x30,0xaf,0xa2,0x00,0x44,
+0x8f,0xa5,0x00,0x44,0x30,0x49,0x00,0x03,0x02,0x09,0x10,0x23,0x30,0x42,0x00,0x03,
+0x00,0xa2,0x10,0x21,0x8f,0xa8,0x00,0x30,0x24,0x42,0x00,0x04,0x30,0x42,0xff,0xff,
+0x00,0x64,0x38,0x21,0x01,0x02,0x28,0x23,0x00,0x62,0x18,0x21,0x00,0x48,0x10,0x2b,
+0x10,0x40,0x00,0x52,0x00,0x00,0x20,0x21,0x30,0xe7,0xff,0xff,0x30,0xa4,0xff,0xff,
+0xaf,0xa7,0x00,0x2c,0x00,0xd2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x51,0x18,0x21,
+0x8c,0x65,0x00,0x18,0x00,0x04,0x25,0x80,0x00,0x8d,0x20,0x24,0x8c,0xa8,0x00,0x04,
+0x00,0x4e,0x18,0x21,0x00,0x4f,0x50,0x21,0x01,0x0b,0x40,0x24,0x01,0x04,0x40,0x25,
+0xac,0xa8,0x00,0x04,0x8f,0xa4,0x00,0x98,0x8f,0xa2,0x00,0x50,0x26,0xb5,0x00,0x01,
+0xa0,0x64,0x00,0x00,0x8c,0xa4,0x00,0x08,0x00,0x00,0x00,0x00,0x04,0x81,0x00,0x0c,
+0x02,0xa2,0x30,0x2a,0x80,0x62,0x00,0x06,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,
+0x00,0xa2,0x38,0x21,0x8f,0xa5,0x00,0x40,0x00,0x00,0x00,0x00,0xa4,0xe5,0x00,0x00,
+0x95,0x52,0x00,0x02,0x14,0xc0,0xff,0xc7,0x00,0x12,0x30,0xc0,0x8f,0xa4,0x00,0x24,
+0x8f,0xa5,0x00,0x50,0x8f,0xa6,0x00,0x1c,0x8f,0xa3,0x00,0x2c,0x00,0x85,0x80,0x21,
+0xa0,0xd0,0x00,0x12,0x00,0x09,0x10,0x23,0x30,0x42,0x00,0x03,0x8f,0xa8,0x00,0x88,
+0x00,0x62,0x10,0x23,0xa4,0xc2,0x00,0x1a,0x85,0x03,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x44,
+0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x83,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x10,0x14,0x60,0xff,0x74,0x02,0x00,0x10,0x21,
+0x8f,0xa3,0x00,0x54,0x8f,0xa4,0x00,0x18,0x8f,0xa5,0x00,0x24,0x00,0x64,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x99,0x58,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x00,
+0x10,0xa0,0x00,0x03,0x00,0x00,0x30,0x21,0x08,0x00,0x25,0x07,0x02,0x00,0x10,0x21,
+0x93,0x82,0x80,0x10,0x00,0x00,0x28,0x21,0x00,0x00,0x38,0x21,0x0c,0x00,0x29,0x5e,
+0xaf,0xa2,0x00,0x10,0x08,0x00,0x25,0x07,0x02,0x00,0x10,0x21,0x30,0x63,0xff,0xff,
+0x08,0x00,0x25,0x59,0xaf,0xa3,0x00,0x2c,0x8f,0xa8,0x00,0x44,0x08,0x00,0x25,0x7b,
+0x31,0x09,0x00,0x03,0x08,0x00,0x25,0x34,0xaf,0xa3,0x00,0x50,0x8f,0xa6,0x00,0x44,
+0xaf,0xa0,0x00,0x50,0x08,0x00,0x25,0x7b,0x30,0xc9,0x00,0x03,0x8f,0xa5,0x00,0x48,
+0x8f,0xa6,0x00,0x4c,0x8f,0xa4,0x00,0x1c,0x03,0xc0,0x38,0x21,0x0c,0x00,0x23,0xa6,
+0xaf,0xb7,0x00,0x10,0x08,0x00,0x24,0xe4,0x00,0x00,0x00,0x00,0x00,0x05,0x28,0x80,
+0x27,0x82,0x99,0x40,0x00,0xa2,0x28,0x21,0x00,0x00,0x20,0x21,0x0c,0x00,0x01,0x49,
+0x00,0x00,0x00,0x00,0x08,0x00,0x24,0xdd,0x26,0xe2,0x00,0x01,0x00,0x02,0x80,0x80,
+0x27,0x83,0x99,0x50,0x8f,0xa4,0x00,0x1c,0x02,0x03,0x18,0x21,0x26,0x31,0x00,0x01,
+0x02,0x40,0x28,0x21,0x0c,0x00,0x26,0xae,0xa0,0x71,0x00,0x05,0x14,0x40,0xff,0x13,
+0x00,0x00,0x00,0x00,0x16,0xe0,0x00,0x4d,0x03,0xc0,0x38,0x21,0x8f,0xa4,0x00,0x24,
+0x8f,0xa5,0x00,0x20,0x24,0x02,0x00,0x01,0x24,0x84,0x00,0x01,0xaf,0xb2,0x00,0x48,
+0xaf,0xb6,0x00,0x4c,0x02,0xc0,0xf0,0x21,0x10,0xa2,0x00,0x41,0xaf,0xa4,0x00,0x24,
+0x27,0x82,0x99,0x40,0x02,0x02,0x10,0x21,0x94,0x42,0x00,0x06,0x8f,0xa4,0x00,0x30,
+0xaf,0xa0,0x00,0x20,0xaf,0xa2,0x00,0x44,0x30,0x49,0x00,0x03,0x8f,0xa8,0x00,0x44,
+0x00,0x09,0x10,0x23,0x30,0x42,0x00,0x03,0x01,0x02,0x10,0x21,0x24,0x42,0x00,0x04,
+0x30,0x42,0xff,0xff,0x00,0x44,0x18,0x2b,0x10,0x60,0x00,0x2b,0x00,0x00,0x00,0x00,
+0x8f,0xa5,0x00,0x2c,0x00,0x82,0x10,0x23,0x00,0xa4,0x18,0x21,0x30,0x63,0xff,0xff,
+0x30,0x44,0xff,0xff,0xaf,0xa3,0x00,0x2c,0x02,0x92,0x28,0x21,0x00,0x05,0x28,0x80,
+0x27,0x82,0x99,0x44,0x00,0xa2,0x10,0x21,0x8c,0x46,0x00,0x18,0x3c,0x03,0x80,0xff,
+0x3c,0x02,0x7f,0x00,0x8c,0xc8,0x00,0x04,0x00,0x04,0x25,0x80,0x34,0x63,0xff,0xff,
+0x00,0x82,0x20,0x24,0x01,0x03,0x40,0x24,0x01,0x04,0x40,0x25,0xac,0xc8,0x00,0x04,
+0x8f,0xa8,0x00,0x98,0x27,0x82,0x99,0x50,0x00,0xa2,0x10,0x21,0xa0,0x48,0x00,0x00,
+0x8c,0xc4,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x27,0xc2,0x10,0x80,0xfe,0xdb,
+0xaf,0xa4,0x00,0x3c,0x80,0x42,0x00,0x06,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,
+0x00,0xc2,0x38,0x21,0x8f,0xa2,0x00,0x40,0x00,0x00,0x00,0x00,0xa4,0xe2,0x00,0x00,
+0x08,0x00,0x24,0xe0,0x26,0xb5,0xff,0xff,0x8f,0xa6,0x00,0x2c,0x00,0x00,0x20,0x21,
+0x00,0xc2,0x10,0x21,0x30,0x42,0xff,0xff,0x08,0x00,0x25,0xee,0xaf,0xa2,0x00,0x2c,
+0x8f,0xa6,0x00,0x1c,0x08,0x00,0x25,0xd8,0xa4,0xd2,0x00,0x14,0x8f,0xa5,0x00,0x48,
+0x8f,0xa6,0x00,0x4c,0x8f,0xa4,0x00,0x1c,0x0c,0x00,0x23,0xa6,0xaf,0xb7,0x00,0x10,
+0x08,0x00,0x25,0xcf,0x00,0x00,0xb8,0x21,0x0c,0x00,0x1a,0x28,0x00,0x00,0x28,0x21,
+0x94,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x63,0x08,0x00,0xa4,0x43,0x00,0x00,
+0x08,0x00,0x24,0xd4,0x02,0x71,0x10,0x21,0x02,0x92,0x18,0x21,0x00,0x03,0x80,0x80,
+0x27,0x82,0x99,0x44,0x02,0x02,0x10,0x21,0x8c,0x44,0x00,0x18,0x00,0x00,0x00,0x00,
+0x8c,0x83,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x10,0x10,0x60,0x00,0x09,
+0x24,0x06,0x00,0x01,0x93,0x82,0x94,0x51,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,
+0x10,0x40,0xfe,0xa3,0x3c,0x04,0x00,0x80,0x27,0x85,0x99,0x40,0x08,0x00,0x25,0xbf,
+0x02,0x05,0x28,0x21,0x27,0x83,0x99,0x58,0x27,0x82,0x99,0x50,0x02,0x03,0x18,0x21,
+0x02,0x02,0x10,0x21,0x90,0x64,0x00,0x00,0x90,0x45,0x00,0x05,0x93,0x83,0x80,0x10,
+0x00,0x00,0x38,0x21,0x0c,0x00,0x29,0x5e,0xaf,0xa3,0x00,0x10,0x08,0x00,0x26,0x35,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0x8f,0xa4,0x00,0x94,
+0x08,0x00,0x24,0xac,0x00,0x64,0x10,0x06,0x08,0x00,0x24,0xad,0x00,0x00,0x18,0x21,
+0x8f,0xa4,0x00,0x98,0x8f,0xa5,0x00,0x38,0xaf,0xa0,0x00,0x10,0x0c,0x00,0x10,0xa7,
+0xaf,0xa8,0x00,0x14,0x30,0x42,0xff,0xff,0x08,0x00,0x24,0x77,0xaf,0xa2,0x00,0x40,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe0,0x34,0x42,0x00,0x20,
+0x24,0x63,0x99,0x60,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x18,
+0xac,0x43,0x00,0x00,0x90,0x82,0x00,0x0a,0x00,0x80,0x80,0x21,0x14,0x40,0x00,0x45,
+0x00,0x00,0x88,0x21,0x92,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x3c,
+0x00,0x00,0x00,0x00,0x12,0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x16,
+0x92,0x05,0x00,0x0a,0x30,0x42,0x00,0xfc,0x10,0xa0,0x00,0x03,0xa2,0x02,0x00,0x16,
+0x34,0x42,0x00,0x01,0xa2,0x02,0x00,0x16,0x92,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
+0x30,0x83,0x00,0xff,0x10,0x60,0x00,0x05,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x16,
+0x00,0x00,0x00,0x00,0x34,0x42,0x00,0x02,0xa2,0x02,0x00,0x16,0x10,0x60,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x14,0xa0,0x00,0x08,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,
+0xa2,0x00,0x00,0x17,0xa6,0x02,0x00,0x14,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x14,0x80,0x00,0x05,0x24,0x02,0x00,0x01,
+0x96,0x03,0x00,0x06,0xa2,0x02,0x00,0x17,0x08,0x00,0x26,0x82,0xa6,0x03,0x00,0x14,
+0x96,0x04,0x00,0x00,0x96,0x05,0x00,0x06,0x27,0x86,0x99,0x40,0x00,0x04,0x10,0xc0,
+0x00,0x05,0x18,0xc0,0x00,0x44,0x10,0x21,0x00,0x65,0x18,0x21,0x00,0x02,0x10,0x80,
+0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x00,0x46,0x10,0x21,0x8c,0x65,0x00,0x08,
+0x8c,0x44,0x00,0x08,0x0c,0x00,0x1a,0x19,0x00,0x00,0x00,0x00,0x30,0x43,0x00,0xff,
+0x10,0x60,0x00,0x04,0xa2,0x02,0x00,0x17,0x96,0x02,0x00,0x06,0x08,0x00,0x26,0x82,
+0xa6,0x02,0x00,0x14,0x96,0x02,0x00,0x00,0x08,0x00,0x26,0x82,0xa6,0x02,0x00,0x14,
+0x96,0x05,0x00,0x00,0x0c,0x00,0x26,0xae,0x02,0x00,0x20,0x21,0x08,0x00,0x26,0x69,
+0x02,0x22,0x88,0x21,0x94,0x85,0x00,0x06,0x0c,0x00,0x26,0xae,0x00,0x00,0x00,0x00,
+0x08,0x00,0x26,0x65,0x00,0x40,0x88,0x21,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x63,0x00,0x20,0x24,0x42,0x9a,0xb8,0x27,0xbd,0xff,0xf0,0xac,0x62,0x00,0x00,
+0x00,0x00,0x10,0x21,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x10,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x01,0x34,0x63,0x00,0x20,0x24,0x42,0x9a,0xdc,0xac,0x62,0x00,0x00,
+0x90,0x89,0x00,0x0a,0x00,0x80,0x30,0x21,0x11,0x20,0x00,0x05,0x00,0xa0,0x50,0x21,
+0x90,0x82,0x00,0x17,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x1b,0x00,0x00,0x00,0x00,
+0x90,0xc7,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0xe0,0x00,0x1b,0x00,0x00,0x00,0x00,
+0x94,0xc8,0x00,0x00,0x27,0x83,0x99,0x40,0x93,0x85,0x94,0x50,0x00,0x08,0x10,0xc0,
+0x00,0x48,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x08,
+0x00,0xe5,0x28,0x2b,0x10,0xa0,0x00,0x06,0x01,0x44,0x18,0x23,0x8f,0x82,0x94,0x68,
+0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x2b,0x10,0x40,0x00,0x05,0x00,0x00,0x00,0x00,
+0x24,0x03,0x00,0x10,0xa4,0xc8,0x00,0x14,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,
+0x11,0x20,0x00,0x05,0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x06,0x24,0x03,0x00,0x08,
+0x08,0x00,0x26,0xda,0xa4,0xc2,0x00,0x14,0x08,0x00,0x26,0xda,0x00,0x00,0x18,0x21,
+0x27,0xbd,0xff,0xc8,0xaf,0xb5,0x00,0x2c,0xaf,0xb4,0x00,0x28,0xaf,0xb3,0x00,0x24,
+0xaf,0xb0,0x00,0x18,0xaf,0xbf,0x00,0x30,0xaf,0xb2,0x00,0x20,0xaf,0xb1,0x00,0x1c,
+0x94,0x91,0x00,0x06,0x00,0x80,0xa0,0x21,0x3c,0x02,0x80,0x01,0x3c,0x04,0xb0,0x03,
+0x00,0x11,0xa8,0xc0,0x34,0x84,0x00,0x20,0x24,0x42,0x9b,0x90,0x02,0xb1,0x48,0x21,
+0xac,0x82,0x00,0x00,0x00,0x09,0x48,0x80,0x24,0x03,0x00,0x01,0x27,0x82,0x99,0x50,
+0xa2,0x83,0x00,0x12,0x01,0x22,0x10,0x21,0x27,0x84,0x99,0x44,0x01,0x24,0x20,0x21,
+0x80,0x48,0x00,0x06,0x8c,0x8a,0x00,0x18,0x27,0x83,0x99,0x60,0x01,0x23,0x48,0x21,
+0x8d,0x24,0x00,0x00,0x25,0x08,0x00,0x02,0x8d,0x42,0x00,0x00,0x8d,0x49,0x00,0x04,
+0x00,0x08,0x17,0xc2,0x8d,0x43,0x00,0x08,0x01,0x02,0x40,0x21,0x00,0x04,0x25,0xc2,
+0x00,0x08,0x40,0x43,0x30,0x84,0x00,0x01,0x00,0x03,0x1f,0xc2,0x00,0x08,0x40,0x40,
+0x00,0xe0,0x80,0x21,0x00,0x64,0x18,0x24,0x00,0x09,0x49,0x42,0x01,0x48,0x10,0x21,
+0x00,0xa0,0x98,0x21,0x00,0xa0,0x20,0x21,0x00,0x40,0x38,0x21,0x02,0x00,0x28,0x21,
+0x14,0x60,0x00,0x19,0x31,0x29,0x00,0x01,0x94,0x42,0x00,0x00,0x02,0xb1,0x88,0x21,
+0x02,0x00,0x28,0x21,0x00,0x11,0x88,0x80,0x27,0x90,0x99,0x40,0x02,0x30,0x80,0x21,
+0x96,0x03,0x00,0x06,0x30,0x52,0xff,0xff,0x02,0x60,0x20,0x21,0x00,0x60,0x30,0x21,
+0xa6,0x83,0x00,0x1a,0x27,0x82,0x99,0x48,0x0c,0x00,0x10,0x80,0x02,0x22,0x88,0x21,
+0x00,0x52,0x10,0x21,0x96,0x03,0x00,0x06,0xa6,0x22,0x00,0x04,0x8f,0xbf,0x00,0x30,
+0x7b,0xb4,0x01,0x7c,0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x00,0x60,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0xaf,0xa9,0x00,0x10,0x0c,0x00,0x10,0xa7,
+0xaf,0xa0,0x00,0x14,0x08,0x00,0x27,0x18,0x02,0xb1,0x88,0x21,0x27,0xbd,0xff,0xc0,
+0xaf,0xbe,0x00,0x38,0xaf,0xb7,0x00,0x34,0xaf,0xb6,0x00,0x30,0xaf,0xb5,0x00,0x2c,
+0xaf,0xb3,0x00,0x24,0xaf,0xb1,0x00,0x1c,0xaf,0xbf,0x00,0x3c,0xaf,0xb4,0x00,0x28,
+0xaf,0xb2,0x00,0x20,0xaf,0xb0,0x00,0x18,0x94,0x90,0x00,0x00,0x3c,0x08,0xb0,0x03,
+0x35,0x08,0x00,0x20,0x00,0x10,0x10,0xc0,0x00,0x50,0x18,0x21,0x00,0x40,0x88,0x21,
+0x3c,0x02,0x80,0x01,0x00,0x03,0x48,0x80,0x24,0x42,0x9c,0xcc,0x00,0x80,0x98,0x21,
+0x27,0x84,0x99,0x50,0x01,0x24,0x20,0x21,0x93,0xb7,0x00,0x53,0xad,0x02,0x00,0x00,
+0x80,0x83,0x00,0x06,0x27,0x82,0x99,0x44,0x01,0x22,0x10,0x21,0x8c,0x44,0x00,0x18,
+0x24,0x63,0x00,0x02,0x00,0x03,0x17,0xc2,0x8c,0x88,0x00,0x08,0x00,0x62,0x18,0x21,
+0x00,0x03,0x18,0x43,0x00,0x03,0x18,0x40,0xaf,0xa7,0x00,0x4c,0x2c,0xa2,0x00,0x10,
+0x00,0xa0,0xa8,0x21,0x00,0x83,0x50,0x21,0x00,0x08,0x47,0xc2,0x00,0xc0,0x58,0x21,
+0x00,0x00,0xb0,0x21,0x8c,0x92,0x00,0x0c,0x14,0x40,0x00,0x13,0x00,0x00,0xf0,0x21,
+0x92,0x67,0x00,0x04,0x24,0x14,0x00,0x01,0x12,0x87,0x00,0x10,0x02,0x30,0x10,0x21,
+0x27,0x83,0x99,0x58,0x01,0x23,0x18,0x21,0x80,0x64,0x00,0x00,0x27,0x83,0xbe,0xb0,
+0x00,0x04,0x11,0x00,0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x04,0x00,0x00,0x00,0x00,
+0x10,0x80,0x00,0x23,0x00,0x00,0x00,0x00,0x02,0x30,0x10,0x21,0x00,0x02,0x80,0x80,
+0x24,0x04,0x00,0x01,0x27,0x83,0x99,0x60,0xa2,0x64,0x00,0x12,0x02,0x03,0x18,0x21,
+0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x15,0xc2,0x30,0x42,0x00,0x01,
+0x01,0x02,0x10,0x24,0x14,0x40,0x00,0x0e,0x02,0xa0,0x20,0x21,0x27,0x82,0x99,0x40,
+0x02,0x02,0x10,0x21,0x94,0x43,0x00,0x06,0x00,0x00,0x00,0x00,0xa6,0x63,0x00,0x1a,
+0x94,0x42,0x00,0x06,0x7b,0xbe,0x01,0xfc,0x7b,0xb6,0x01,0xbc,0x7b,0xb4,0x01,0x7c,
+0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,
+0x8f,0xa5,0x00,0x4c,0x01,0x60,0x30,0x21,0x01,0x40,0x38,0x21,0xaf,0xa0,0x00,0x10,
+0x0c,0x00,0x10,0xa7,0xaf,0xa0,0x00,0x14,0x08,0x00,0x27,0x7f,0x00,0x00,0x00,0x00,
+0x27,0x83,0x99,0x60,0x01,0x23,0x18,0x21,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0x15,0xc2,0x30,0x42,0x00,0x01,0x01,0x02,0x10,0x24,0x14,0x40,0x00,0xaf,
+0x00,0xa0,0x20,0x21,0x32,0x4f,0x00,0x03,0x00,0x12,0x10,0x82,0x25,0xe3,0x00,0x0d,
+0x30,0x45,0x00,0x07,0x00,0x74,0x78,0x04,0x10,0xa0,0x00,0x0e,0x00,0x00,0x90,0x21,
+0x27,0x82,0x86,0x30,0x00,0x15,0x18,0x40,0x00,0x62,0x18,0x21,0x94,0x64,0x00,0x00,
+0x24,0xa2,0x00,0x05,0x00,0x54,0x10,0x04,0x00,0x44,0x00,0x1a,0x14,0x80,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0d,0x00,0x00,0x10,0x12,0x24,0x42,0x00,0x10,
+0x30,0x52,0xff,0xfc,0x02,0x30,0x10,0x21,0x27,0x83,0x99,0x50,0x00,0x02,0x10,0x80,
+0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x03,0x00,0x00,0x00,0x00,0x30,0x83,0x00,0xff,
+0x2c,0x62,0x00,0x0c,0x14,0x40,0x00,0x04,0x2c,0x62,0x00,0x19,0x30,0x82,0x00,0x0f,
+0x24,0x43,0x00,0x0c,0x2c,0x62,0x00,0x19,0x10,0x40,0x00,0x19,0x24,0x0e,0x00,0x20,
+0x24,0x62,0xff,0xe9,0x2c,0x42,0x00,0x02,0x14,0x40,0x00,0x15,0x24,0x0e,0x00,0x10,
+0x24,0x62,0xff,0xeb,0x2c,0x42,0x00,0x02,0x14,0x40,0x00,0x11,0x24,0x0e,0x00,0x08,
+0x24,0x02,0x00,0x14,0x10,0x62,0x00,0x0e,0x24,0x0e,0x00,0x02,0x24,0x62,0xff,0xef,
+0x2c,0x42,0x00,0x03,0x14,0x40,0x00,0x0a,0x24,0x0e,0x00,0x10,0x24,0x62,0xff,0xf1,
+0x2c,0x42,0x00,0x02,0x14,0x40,0x00,0x06,0x24,0x0e,0x00,0x08,0x24,0x62,0xff,0xf3,
+0x2c,0x42,0x00,0x02,0x24,0x0e,0x00,0x04,0x24,0x03,0x00,0x02,0x00,0x62,0x70,0x0a,
+0x30,0xe2,0x00,0xff,0x00,0x00,0x48,0x21,0x00,0x00,0x68,0x21,0x10,0x40,0x00,0x6d,
+0x00,0x00,0x58,0x21,0x3c,0x14,0x80,0xff,0x27,0x99,0x99,0x40,0x01,0xf2,0xc0,0x23,
+0x36,0x94,0xff,0xff,0x01,0xc9,0x10,0x2a,0x14,0x40,0x00,0x64,0x24,0x03,0x00,0x04,
+0x00,0x10,0x28,0xc0,0x00,0xb0,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x59,0x10,0x21,
+0x94,0x56,0x00,0x06,0x00,0x00,0x00,0x00,0x32,0xcc,0x00,0x03,0x00,0x6c,0x10,0x23,
+0x30,0x42,0x00,0x03,0x02,0xc2,0x10,0x21,0x24,0x42,0x00,0x04,0x30,0x51,0xff,0xff,
+0x02,0x32,0x18,0x2b,0x10,0x60,0x00,0x4d,0x01,0xf1,0x10,0x23,0x02,0x51,0x10,0x23,
+0x01,0x78,0x18,0x2b,0x10,0x60,0x00,0x34,0x30,0x44,0xff,0xff,0x29,0x22,0x00,0x40,
+0x10,0x40,0x00,0x31,0x01,0x72,0x18,0x21,0x25,0x22,0x00,0x01,0x00,0x02,0x16,0x00,
+0x00,0x02,0x4e,0x03,0x00,0xb0,0x10,0x21,0x00,0x02,0x30,0x80,0x27,0x82,0x99,0x44,
+0x30,0x6b,0xff,0xff,0x00,0xc2,0x18,0x21,0x8c,0x67,0x00,0x18,0x00,0x04,0x25,0x80,
+0x3c,0x03,0x7f,0x00,0x8c,0xe2,0x00,0x04,0x00,0x83,0x20,0x24,0x27,0x83,0x99,0x50,
+0x00,0x54,0x10,0x24,0x00,0xc3,0x28,0x21,0x00,0x44,0x10,0x25,0xac,0xe2,0x00,0x04,
+0x16,0xe0,0x00,0x02,0xa0,0xb5,0x00,0x00,0xa0,0xb5,0x00,0x03,0x27,0x84,0x99,0x60,
+0x00,0xc4,0x18,0x21,0x8c,0x62,0x00,0x00,0x8c,0xe8,0x00,0x08,0x00,0x02,0x15,0xc2,
+0x00,0x08,0x47,0xc2,0x30,0x42,0x00,0x01,0x01,0x02,0x10,0x24,0x10,0x40,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x80,0xa2,0x00,0x06,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,
+0x00,0xe2,0x50,0x21,0xa5,0x5e,0x00,0x00,0x92,0x62,0x00,0x04,0x25,0xad,0x00,0x01,
+0x27,0x84,0x99,0x40,0x00,0xc4,0x18,0x21,0x01,0xa2,0x10,0x2a,0x94,0x70,0x00,0x02,
+0x14,0x40,0xff,0xb8,0x00,0x00,0x00,0x00,0x96,0x63,0x00,0x14,0x00,0x0c,0x10,0x23,
+0xa2,0x69,0x00,0x12,0x30,0x42,0x00,0x03,0x01,0x62,0x10,0x23,0x00,0x03,0x80,0xc0,
+0x8f,0xa5,0x00,0x4c,0x30,0x4b,0xff,0xff,0x02,0x03,0x80,0x21,0x27,0x82,0x99,0x48,
+0x00,0x10,0x80,0x80,0xa6,0x6b,0x00,0x1a,0x02,0xa0,0x20,0x21,0x01,0x60,0x30,0x21,
+0x01,0x60,0x88,0x21,0x0c,0x00,0x10,0x80,0x02,0x02,0x80,0x21,0x00,0x5e,0x10,0x21,
+0xa6,0x02,0x00,0x04,0x08,0x00,0x27,0x85,0x02,0x20,0x10,0x21,0x01,0x62,0x10,0x2b,
+0x10,0x40,0xff,0xe9,0x00,0x00,0x20,0x21,0x29,0x22,0x00,0x40,0x10,0x40,0xff,0xe6,
+0x01,0x71,0x18,0x21,0x08,0x00,0x27,0xfb,0x25,0x22,0x00,0x01,0x08,0x00,0x28,0x2a,
+0x32,0xcc,0x00,0x03,0x08,0x00,0x28,0x2a,0x00,0x00,0x60,0x21,0x8f,0xa5,0x00,0x4c,
+0x01,0x40,0x38,0x21,0xaf,0xa0,0x00,0x10,0x0c,0x00,0x10,0xa7,0xaf,0xb4,0x00,0x14,
+0x92,0x67,0x00,0x04,0x08,0x00,0x27,0x9d,0x30,0x5e,0xff,0xff,0x30,0x84,0xff,0xff,
+0x00,0x04,0x30,0xc0,0x00,0xc4,0x20,0x21,0x00,0x04,0x20,0x80,0x27,0x82,0x99,0x40,
+0x3c,0x03,0xb0,0x08,0x30,0xa5,0xff,0xff,0x00,0x82,0x20,0x21,0x00,0xc3,0x30,0x21,
+0xac,0xc5,0x00,0x00,0x03,0xe0,0x00,0x08,0xa4,0x85,0x00,0x00,0x30,0x84,0xff,0xff,
+0x00,0x04,0x30,0xc0,0x00,0xc4,0x30,0x21,0x27,0x88,0x99,0x40,0x00,0x06,0x30,0x80,
+0x00,0xc8,0x30,0x21,0x94,0xc3,0x00,0x04,0x3c,0x02,0xb0,0x08,0x3c,0x07,0xb0,0x03,
+0x00,0x03,0x20,0xc0,0x00,0x83,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x82,0x20,0x21,
+0x3c,0x02,0x80,0x01,0x30,0xa5,0xff,0xff,0x00,0x68,0x18,0x21,0x34,0xe7,0x00,0x20,
+0x24,0x42,0xa1,0x7c,0xac,0xe2,0x00,0x00,0xa4,0xc5,0x00,0x02,0xa4,0x65,0x00,0x00,
+0x03,0xe0,0x00,0x08,0xac,0x85,0x00,0x00,0x30,0x84,0xff,0xff,0x00,0x04,0x10,0xc0,
+0x00,0x44,0x10,0x21,0x27,0x89,0x99,0x40,0x00,0x02,0x10,0x80,0x00,0x49,0x10,0x21,
+0x97,0x83,0x99,0x30,0x94,0x4a,0x00,0x04,0x3c,0x02,0xb0,0x08,0x00,0x03,0x38,0xc0,
+0x00,0x0a,0x40,0xc0,0x00,0xe3,0x18,0x21,0x01,0x0a,0x28,0x21,0x00,0xe2,0x38,0x21,
+0x01,0x02,0x40,0x21,0x00,0x03,0x18,0x80,0x00,0x05,0x28,0x80,0x3c,0x06,0xb0,0x03,
+0x3c,0x02,0x80,0x01,0x00,0xa9,0x28,0x21,0x00,0x69,0x18,0x21,0x34,0xc6,0x00,0x20,
+0x34,0x09,0xff,0xff,0x24,0x42,0xa1,0xd8,0xac,0xc2,0x00,0x00,0xa4,0x64,0x00,0x00,
+0xac,0xe4,0x00,0x00,0xa4,0xa9,0x00,0x00,0xad,0x09,0x00,0x00,0xa7,0x8a,0x99,0x30,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x63,0x00,0x20,0x24,0x42,0xa2,0x58,0x3c,0x04,0xb0,0x03,0xac,0x62,0x00,0x00,
+0x34,0x84,0x01,0x10,0x8c,0x82,0x00,0x00,0x97,0x83,0x87,0x74,0x30,0x42,0xff,0xff,
+0x10,0x62,0x00,0x16,0x24,0x0a,0x00,0x01,0xa7,0x82,0x87,0x74,0xaf,0x80,0xbd,0x90,
+0x00,0x40,0x28,0x21,0x24,0x06,0x00,0x01,0x27,0x84,0xbd,0x94,0x25,0x43,0xff,0xff,
+0x00,0x66,0x10,0x04,0x00,0xa2,0x10,0x24,0x14,0x40,0x00,0x07,0x00,0x00,0x00,0x00,
+0x8c,0x83,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x66,0x10,0x04,0x00,0xa2,0x10,0x24,
+0x38,0x42,0x00,0x00,0x01,0x42,0x18,0x0a,0x25,0x4a,0x00,0x01,0x2d,0x42,0x00,0x14,
+0xac,0x83,0x00,0x00,0x14,0x40,0xff,0xf1,0x24,0x84,0x00,0x04,0x3c,0x0b,0xb0,0x03,
+0x00,0x00,0x50,0x21,0x3c,0x0c,0x80,0x00,0x27,0x89,0xbd,0xe0,0x35,0x6b,0x01,0x20,
+0x8d,0x68,0x00,0x00,0x8d,0x23,0x00,0x04,0x01,0x0c,0x10,0x24,0x00,0x02,0x17,0xc2,
+0x11,0x03,0x00,0x37,0xa1,0x22,0x00,0xdc,0xa1,0x20,0x00,0xd5,0xa1,0x20,0x00,0xd6,
+0x01,0x20,0x30,0x21,0x00,0x00,0x38,0x21,0x00,0x00,0x28,0x21,0x01,0x20,0x20,0x21,
+0x00,0xa8,0x10,0x06,0x30,0x42,0x00,0x01,0x10,0xe0,0x00,0x10,0xa0,0x82,0x00,0x0a,
+0x90,0x82,0x00,0x07,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x31,0x24,0xa2,0xff,0xff,
+0xa0,0x82,0x00,0x08,0x90,0x82,0x00,0x0a,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x09,
+0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x03,0x10,0x40,
+0x00,0x43,0x10,0x21,0x00,0x46,0x10,0x21,0xa0,0x45,0x00,0x09,0x90,0x82,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x04,
+0x00,0x00,0x00,0x00,0xa0,0xc5,0x00,0xd5,0x24,0x07,0x00,0x01,0xa0,0x85,0x00,0x08,
+0xa0,0xc5,0x00,0xd6,0x24,0xa5,0x00,0x01,0x2c,0xa2,0x00,0x1c,0x14,0x40,0xff,0xe0,
+0x24,0x84,0x00,0x03,0x90,0xc4,0x00,0xd5,0x00,0x00,0x28,0x21,0x00,0xa4,0x10,0x2b,
+0x10,0x40,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0xc0,0x18,0x21,0xa0,0x64,0x00,0x08,
+0x90,0xc2,0x00,0xd5,0x24,0xa5,0x00,0x01,0xa0,0x62,0x00,0x09,0x90,0xc4,0x00,0xd5,
+0x00,0x00,0x00,0x00,0x00,0xa4,0x10,0x2b,0x14,0x40,0xff,0xf8,0x24,0x63,0x00,0x03,
+0x25,0x4a,0x00,0x01,0x2d,0x42,0x00,0x08,0xad,0x28,0x00,0x04,0x25,0x6b,0x00,0x04,
+0x14,0x40,0xff,0xbf,0x25,0x29,0x00,0xec,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x90,0x82,0x00,0x05,0x08,0x00,0x28,0xd1,0xa0,0x82,0x00,0x08,0x97,0x85,0x94,0x5a,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x63,0x00,0x20,
+0x24,0x42,0xa4,0x0c,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x62,0x00,0x00,
+0x30,0x90,0x00,0xff,0x00,0x05,0x28,0x42,0x00,0x00,0x48,0x21,0x27,0x8f,0xbd,0xe4,
+0x00,0x00,0x50,0x21,0x00,0x00,0x58,0x21,0x27,0x98,0xbe,0xc4,0x27,0x99,0xbe,0xc0,
+0x27,0x8e,0xbe,0xbe,0x27,0x8c,0xbd,0xe8,0x27,0x8d,0xbe,0x40,0x27,0x88,0xbe,0xb8,
+0x00,0x0a,0x18,0x80,0x01,0x6f,0x10,0x21,0xac,0x40,0x00,0x00,0xac,0x45,0x00,0x58,
+0x00,0x6e,0x20,0x21,0x00,0x78,0x10,0x21,0xa1,0x00,0xff,0xfc,0xad,0x00,0x00,0x00,
+0xa1,0x00,0x00,0x04,0xa1,0x00,0x00,0x05,0xad,0x00,0xff,0xf8,0x00,0x79,0x18,0x21,
+0x24,0x06,0x00,0x01,0x24,0xc6,0xff,0xff,0xa0,0x80,0x00,0x00,0xa4,0x60,0x00,0x00,
+0xac,0x40,0x00,0x00,0x24,0x63,0x00,0x02,0x24,0x42,0x00,0x04,0x04,0xc1,0xff,0xf9,
+0x24,0x84,0x00,0x01,0x00,0x0a,0x10,0x80,0x00,0x4d,0x20,0x21,0x00,0x00,0x30,0x21,
+0x00,0x4c,0x18,0x21,0x27,0x87,0x87,0x78,0x8c,0xe2,0x00,0x00,0x24,0xe7,0x00,0x04,
+0xac,0x82,0x00,0x00,0xa0,0x66,0x00,0x00,0xa0,0x66,0x00,0x01,0x24,0xc6,0x00,0x01,
+0x28,0xc2,0x00,0x1c,0xa0,0x60,0x00,0x02,0x24,0x84,0x00,0x04,0x14,0x40,0xff,0xf6,
+0x24,0x63,0x00,0x03,0x25,0x29,0x00,0x01,0x29,0x22,0x00,0x08,0x25,0x4a,0x00,0x3b,
+0x25,0x08,0x00,0xec,0x14,0x40,0xff,0xd6,0x25,0x6b,0x00,0xec,0xa7,0x80,0x87,0x74,
+0x00,0x00,0x48,0x21,0x27,0x83,0xbd,0x90,0xac,0x69,0x00,0x00,0x25,0x29,0x00,0x01,
+0x29,0x22,0x00,0x0c,0x14,0x40,0xff,0xfc,0x24,0x63,0x00,0x04,0x0c,0x00,0x28,0x96,
+0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x14,0x27,0x83,0xbd,0xe0,0x24,0x09,0x00,0x07,
+0x10,0x80,0x00,0x0a,0x00,0x00,0x00,0x00,0x90,0x62,0x00,0xd5,0x25,0x29,0xff,0xff,
+0xa0,0x62,0x00,0x00,0x05,0x21,0xff,0xfa,0x24,0x63,0x00,0xec,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x90,0x62,0x00,0xd6,
+0x08,0x00,0x29,0x54,0x25,0x29,0xff,0xff,0x30,0x84,0x00,0xff,0x00,0x04,0x11,0x00,
+0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,
+0x27,0x83,0xbd,0xe0,0x00,0x43,0x60,0x21,0x3c,0x04,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x84,0x00,0x20,0x24,0x42,0xa5,0x78,0x30,0xc6,0x00,0xff,0x93,0xaa,0x00,0x13,
+0x30,0xa5,0x00,0xff,0x30,0xe7,0x00,0xff,0xac,0x82,0x00,0x00,0x10,0xc0,0x00,0xe8,
+0x25,0x8f,0x00,0xd0,0x91,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x42,0xff,0xfc,
+0x2c,0x43,0x00,0x18,0x10,0x60,0x00,0xc7,0x3c,0x03,0x80,0x01,0x00,0x02,0x10,0x80,
+0x24,0x63,0x09,0x3c,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x30,0x14,0x40,0x00,0x1c,
+0x00,0x00,0x00,0x00,0x10,0xa0,0x00,0x17,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x11,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x0c,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x06,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x42,0xff,0xe0,0x03,0xe0,0x00,0x08,
+0xad,0x82,0x00,0xd0,0x8d,0x82,0x00,0xd0,0x08,0x00,0x29,0x8f,0x24,0x42,0xff,0xe8,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x29,0x8f,
+0x24,0x42,0x00,0x01,0x8d,0x82,0x00,0xd0,0x08,0x00,0x29,0x8f,0x24,0x42,0x00,0x02,
+0x10,0xa0,0xff,0xf9,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xe9,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0xe6,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x29,0x8f,0x24,0x42,0xff,0xd0,0x8d,0x82,0x00,0xd0,0x08,0x00,0x29,0x8f,
+0x24,0x42,0xff,0xfc,0x10,0xa0,0xff,0xeb,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0xe5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xe0,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xdb,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x29,0x8f,0x24,0x42,0xff,0xf8,0x2d,0x42,0x00,0x19,0x14,0x40,0xff,0xc5,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xdb,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0xd5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xd0,
+0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0xf1,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x29,0x8f,0x24,0x42,0xff,0xf0,0x2d,0x42,0x00,0x1b,0x10,0x40,0xff,0xf1,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xcb,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0xc5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x14,0xa2,0xff,0xb5,
+0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x29,0x8f,0x24,0x42,0xff,0xf4,
+0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xe3,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xbd,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xb5,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0xd6,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0x8a,0x24,0x02,0x00,0x03,
+0x2d,0x42,0x00,0x23,0x10,0x40,0xff,0xd7,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xae,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xa9,0x24,0x02,0x00,0x02,
+0x14,0xa2,0xff,0xb7,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xc7,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x25,0x10,0x40,0xff,0xcb,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0x9c,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x16,0x14,0x40,0x00,0x0e,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0xa0,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x9a,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x95,0x24,0x02,0x00,0x03,
+0x14,0xa2,0xff,0xb6,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x29,0x8f,
+0x24,0x42,0xff,0xfa,0x10,0xa0,0xff,0x93,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x8d,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x88,
+0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xb7,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x17,
+0x14,0x40,0xff,0xac,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xf8,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x19,0x10,0x40,0xff,0xe2,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0x81,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x7b,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x76,0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0x97,
+0x00,0x00,0x00,0x00,0x08,0x00,0x29,0x8c,0x00,0x00,0x00,0x00,0x08,0x00,0x2a,0x15,
+0x2d,0x42,0x00,0x1b,0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xde,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0x70,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x6a,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x65,0x24,0x02,0x00,0x03,
+0x10,0xa2,0xff,0x96,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0x8c,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x23,0x14,0x40,0xff,0xf2,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xbd,
+0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xbb,0x2d,0x42,0x00,0x25,0x08,0x00,0x29,0xf1,
+0x2d,0x42,0x00,0x27,0x10,0xa0,0xff,0x5b,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x55,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x50,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0x71,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xaa,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x27,0x14,0x40,0xff,0xad,0x00,0x00,0x00,0x00,
+0x08,0x00,0x2a,0x3d,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x2a,0x14,0x40,0xff,0xd8,
+0x00,0x00,0x00,0x00,0x08,0x00,0x29,0xad,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x2c,
+0x14,0x40,0xff,0x78,0x00,0x00,0x00,0x00,0x08,0x00,0x29,0x81,0x00,0x00,0x00,0x00,
+0x91,0x86,0x00,0x00,0x91,0x83,0x00,0xd4,0x25,0x8d,0x00,0x5c,0x30,0xc4,0x00,0xff,
+0x00,0x04,0x10,0x40,0x00,0x44,0x10,0x21,0x00,0x04,0x48,0x80,0x01,0x82,0x58,0x21,
+0x01,0x89,0x40,0x21,0x25,0x78,0x00,0x08,0x10,0x60,0x00,0x37,0x25,0x0e,0x00,0x60,
+0x2c,0xa2,0x00,0x03,0x14,0x40,0x00,0x25,0x00,0x00,0x00,0x00,0x91,0x82,0x00,0xdd,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x1e,0x00,0x00,0x00,0x00,0x27,0x87,0x87,0x78,
+0x01,0x27,0x10,0x21,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x60,
+0x91,0x62,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x21,0xa1,0x82,0x00,0x00,
+0x30,0xc2,0x00,0xff,0x00,0x02,0x10,0x80,0x00,0x47,0x10,0x21,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x42,0xad,0xa3,0x00,0x00,0x91,0x84,0x00,0x00,
+0x8d,0xc5,0x00,0x00,0x00,0x04,0x20,0x80,0x00,0x87,0x10,0x21,0x8c,0x43,0x00,0x00,
+0x00,0x05,0x28,0x40,0x00,0x8c,0x20,0x21,0x00,0x03,0x18,0x80,0x00,0xa3,0x10,0x2b,
+0x00,0x62,0x28,0x0a,0xac,0x85,0x00,0x60,0x03,0xe0,0x00,0x08,0xa1,0x80,0x00,0xd4,
+0x27,0x87,0x87,0x78,0x08,0x00,0x2a,0x74,0xa1,0x80,0x00,0xdd,0x27,0x82,0x87,0xe8,
+0x8d,0x83,0x00,0xd8,0x00,0x82,0x10,0x21,0x90,0x44,0x00,0x00,0x24,0x63,0x00,0x01,
+0x00,0x64,0x20,0x2b,0x14,0x80,0xff,0x02,0xad,0x83,0x00,0xd8,0x8d,0x02,0x00,0x60,
+0xa1,0x80,0x00,0xd4,0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,
+0x03,0xe0,0x00,0x08,0xad,0x82,0x00,0x5c,0x10,0xe0,0x00,0x1d,0x24,0x83,0xff,0xfc,
+0x2c,0x62,0x00,0x18,0x10,0x40,0x01,0x10,0x00,0x03,0x10,0x80,0x3c,0x03,0x80,0x01,
+0x24,0x63,0x09,0x9c,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x30,0x14,0x40,0x00,0x65,
+0x00,0x00,0x00,0x00,0x10,0xa0,0x00,0x60,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x5a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x08,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x51,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x42,0xff,0xe0,0xad,0x82,0x00,0xd0,
+0x8d,0xe3,0x00,0x00,0x8d,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x21,
+0xad,0xa2,0x00,0x00,0xad,0xe0,0x00,0x00,0x8d,0xa3,0x00,0x00,0x8d,0xc4,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x83,0x10,0x2a,0x10,0x40,0x00,0x22,0x00,0x00,0x00,0x00,
+0x93,0x05,0x00,0x01,0x91,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x45,0x00,0x05,
+0x24,0x02,0x00,0x01,0xa1,0x85,0x00,0x00,0xa1,0x82,0x00,0xd4,0x03,0xe0,0x00,0x08,
+0xad,0x80,0x00,0xd8,0x91,0x82,0x00,0xdd,0x24,0x03,0x00,0x01,0x10,0x43,0x00,0x05,
+0x00,0x00,0x00,0x00,0xa1,0x83,0x00,0xd4,0xad,0x80,0x00,0xd8,0x03,0xe0,0x00,0x08,
+0xa1,0x83,0x00,0xdd,0x00,0x04,0x17,0xc2,0x00,0x82,0x10,0x21,0x00,0x02,0x10,0x43,
+0xad,0xa2,0x00,0x00,0x91,0x83,0x00,0x00,0x27,0x82,0x87,0x78,0x8d,0xc5,0x00,0x00,
+0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,0x8c,0x64,0x00,0x00,0x00,0x05,0x28,0x40,
+0x00,0x04,0x18,0x80,0x00,0xa3,0x10,0x2b,0x00,0x62,0x28,0x0a,0x08,0x00,0x2a,0x86,
+0xad,0xc5,0x00,0x00,0x97,0x82,0x94,0x5c,0x00,0x00,0x00,0x00,0x00,0x62,0x10,0x2a,
+0x10,0x40,0xfe,0xab,0x00,0x00,0x00,0x00,0x91,0x82,0x00,0xdd,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x15,0x00,0x00,0x00,0x00,0x91,0x83,0x00,0x00,0x27,0x82,0x87,0x78,
+0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x6c,0x18,0x21,
+0xac,0x64,0x00,0x60,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x10,0x80,
+0x01,0x82,0x10,0x21,0x24,0x4e,0x00,0x60,0xa1,0x85,0x00,0x00,0x8d,0xc2,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,
+0x03,0xe0,0x00,0x08,0xad,0xa2,0x00,0x00,0x08,0x00,0x2a,0xfb,0xa1,0x80,0x00,0xdd,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x2a,0xb7,0x24,0x42,0xff,0xe8,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x2a,0xb7,0x24,0x42,0x00,0x01,0x8d,0x82,0x00,0xd0,0x08,0x00,0x2a,0xb7,
+0x24,0x42,0x00,0x02,0x10,0xa0,0xff,0xf9,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x0a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xa0,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0x9d,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x2a,0xb7,0x24,0x42,0xff,0xd0,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x2a,0xb7,0x24,0x42,0xff,0xfc,0x10,0xa0,0xff,0xeb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xe5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x93,0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xdd,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x2a,0xb7,0x24,0x42,0xff,0xf8,0x2d,0x42,0x00,0x19,
+0x14,0x40,0xff,0x7c,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xdb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xd5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x83,0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0xf1,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x2a,0xb7,0x24,0x42,0xff,0xf0,0x2d,0x42,0x00,0x1b,
+0x10,0x40,0xff,0xf1,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xcb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xc5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x14,0xa2,0xff,0x6c,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x2a,0xb7,
+0x24,0x42,0xff,0xf4,0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xe3,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0xbd,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x68,
+0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xd6,0x00,0x00,0x00,0x00,0x08,0x00,0x2a,0xb2,
+0x24,0x02,0x00,0x03,0x2d,0x42,0x00,0x23,0x10,0x40,0xff,0xd7,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0xae,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x5c,
+0x24,0x02,0x00,0x02,0x14,0xa2,0xff,0xb7,0x00,0x00,0x00,0x00,0x08,0x00,0x2b,0x38,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x25,0x10,0x40,0xff,0xcb,0x00,0x00,0x00,0x00,
+0x08,0x00,0x2b,0x0d,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x16,0x14,0x40,0x00,0x0e,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xa0,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x9a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x48,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xb6,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x2a,0xb7,0x24,0x42,0xff,0xfa,0x10,0xa0,0xff,0x93,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x8d,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x3b,0x00,0x00,0x00,0x00,0x08,0x00,0x2b,0x28,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x17,0x14,0x40,0xff,0xac,0x00,0x00,0x00,0x00,0x08,0x00,0x2b,0x69,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x19,0x10,0x40,0xff,0xe2,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0x81,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x7b,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x29,0x24,0x02,0x00,0x03,
+0x10,0xa2,0xff,0x97,0x00,0x00,0x00,0x00,0x08,0x00,0x2a,0xb4,0x00,0x00,0x00,0x00,
+0x08,0x00,0x2b,0x86,0x2d,0x42,0x00,0x1b,0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xde,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0x70,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x6a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x18,
+0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0x96,0x00,0x00,0x00,0x00,0x08,0x00,0x2a,0xb4,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x23,0x14,0x40,0xff,0xf2,0x00,0x00,0x00,0x00,
+0x08,0x00,0x2b,0x2e,0x00,0x00,0x00,0x00,0x08,0x00,0x2b,0x2c,0x2d,0x42,0x00,0x25,
+0x08,0x00,0x2b,0x62,0x2d,0x42,0x00,0x27,0x10,0xa0,0xff,0x5b,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x55,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x03,0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0x71,0x00,0x00,0x00,0x00,
+0x08,0x00,0x2b,0x1b,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x27,0x14,0x40,0xff,0xad,
+0x00,0x00,0x00,0x00,0x08,0x00,0x2b,0xae,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x2a,
+0x14,0x40,0xff,0xd8,0x00,0x00,0x00,0x00,0x08,0x00,0x2b,0x1e,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x2c,0x14,0x40,0xff,0x78,0x00,0x00,0x00,0x00,0x08,0x00,0x2a,0xa9,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe8,0x3c,0x02,0xb0,0x03,0xaf,0xbf,0x00,0x14,
+0xaf,0xb0,0x00,0x10,0x34,0x42,0x01,0x18,0x3c,0x03,0xb0,0x03,0x8c,0x50,0x00,0x00,
+0x34,0x63,0x01,0x2c,0x90,0x62,0x00,0x00,0x32,0x05,0x00,0x01,0xa3,0x82,0x80,0x10,
+0x14,0xa0,0x00,0x14,0x30,0x44,0x00,0xff,0x32,0x02,0x01,0x00,0x14,0x40,0x00,0x09,
+0x00,0x00,0x00,0x00,0x32,0x02,0x08,0x00,0x10,0x40,0x00,0x02,0x24,0x02,0x00,0x01,
+0xa3,0x82,0xc5,0x58,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x0c,0x00,0x0b,0x3e,0x00,0x00,0x00,0x00,0x26,0x02,0xff,0x00,
+0xa3,0x80,0xc5,0x58,0x3c,0x01,0xb0,0x03,0xac,0x22,0x01,0x18,0x08,0x00,0x2b,0xda,
+0x32,0x02,0x08,0x00,0x0c,0x00,0x29,0x03,0x00,0x00,0x00,0x00,0x26,0x02,0xff,0xff,
+0x3c,0x01,0xb0,0x03,0xac,0x22,0x01,0x18,0x08,0x00,0x2b,0xd7,0x32,0x02,0x01,0x00,
+0x27,0xbd,0xff,0xe0,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xd0,0xaf,0xbf,0x00,0x18,
+0x8c,0x43,0x00,0x00,0x3c,0x02,0x00,0x40,0x24,0x07,0x0f,0xff,0x00,0x03,0x33,0x02,
+0x00,0x03,0x2d,0x02,0x00,0x03,0x43,0x02,0x30,0x69,0x0f,0xff,0x00,0x62,0x18,0x24,
+0x30,0xa5,0x00,0x03,0x30,0xc6,0x00,0xff,0x10,0x60,0x00,0x08,0x31,0x08,0x00,0xff,
+0x01,0x00,0x30,0x21,0x0c,0x00,0x2c,0xa6,0xaf,0xa9,0x00,0x10,0x8f,0xbf,0x00,0x18,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x0c,0x00,0x2c,0xf8,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0xd4,0x08,0x00,0x2c,0x03,
+0xac,0x62,0x00,0x00,0x27,0xbd,0xff,0xc0,0x3c,0x02,0xb0,0x03,0xaf,0xb6,0x00,0x30,
+0xaf,0xb5,0x00,0x2c,0xaf,0xb1,0x00,0x1c,0xaf,0xb0,0x00,0x18,0xaf,0xbf,0x00,0x3c,
+0xaf,0xbe,0x00,0x38,0xaf,0xb7,0x00,0x34,0xaf,0xb4,0x00,0x28,0xaf,0xb3,0x00,0x24,
+0xaf,0xb2,0x00,0x20,0x34,0x42,0x00,0x3f,0x90,0x43,0x00,0x00,0x00,0x80,0x80,0x21,
+0x00,0x00,0xb0,0x21,0x00,0x00,0x88,0x21,0x10,0x60,0x00,0x7a,0x00,0x00,0xa8,0x21,
+0x3c,0x01,0xb0,0x03,0xa0,0x20,0x00,0x3f,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x47,
+0x90,0x44,0x00,0x00,0x00,0x10,0x1a,0x02,0x3c,0x14,0xfd,0xff,0x30,0x84,0x00,0xff,
+0xa0,0x50,0x00,0x00,0x30,0x73,0x00,0x0f,0xaf,0xa4,0x00,0x10,0x00,0x00,0x90,0x21,
+0x3c,0x17,0x02,0x00,0x36,0x94,0xff,0xff,0x24,0x1e,0x00,0x04,0x0c,0x00,0x0e,0x76,
+0x24,0x04,0x00,0x78,0x00,0x57,0x10,0x25,0x00,0x40,0x28,0x21,0x0c,0x00,0x0e,0x64,
+0x24,0x04,0x00,0x78,0x00,0x00,0x80,0x21,0x0c,0x00,0x2d,0xc0,0x00,0x00,0x00,0x00,
+0x26,0x03,0x00,0x01,0x10,0x40,0x00,0x53,0x30,0x70,0x00,0xff,0x12,0x00,0xff,0xfa,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x0e,0x76,0x24,0x04,0x00,0x78,0x00,0x54,0x10,0x24,
+0x00,0x40,0x28,0x21,0x0c,0x00,0x0e,0x64,0x24,0x04,0x00,0x78,0x24,0x02,0x00,0x01,
+0x12,0x62,0x00,0x44,0x24,0x04,0x00,0xe0,0x12,0x60,0x00,0x42,0x24,0x04,0x00,0xe4,
+0x32,0x22,0x00,0x60,0x32,0x23,0x0c,0x00,0x00,0x03,0x1a,0x02,0x3c,0x05,0x00,0x60,
+0x00,0x02,0x11,0x42,0x02,0x25,0x20,0x24,0x00,0x43,0x10,0x25,0x3c,0x03,0x04,0x00,
+0x02,0x23,0x28,0x24,0x00,0x04,0x24,0x42,0x00,0x44,0x10,0x25,0x00,0x05,0x2d,0x02,
+0x00,0x45,0x88,0x25,0x12,0x20,0x00,0x03,0x26,0xc2,0x00,0x01,0x30,0x56,0x00,0xff,
+0x02,0xb1,0xa8,0x21,0x12,0x5e,0x00,0x2a,0x3c,0x05,0xb0,0x03,0x02,0x45,0x10,0x21,
+0xa0,0x51,0x00,0x34,0x26,0x42,0x00,0x01,0x30,0x52,0x00,0xff,0x2e,0x43,0x00,0x05,
+0x14,0x60,0xff,0xce,0x3c,0x02,0xb0,0x03,0x8f,0xa3,0x00,0x10,0x34,0x42,0x01,0x47,
+0xa0,0x43,0x00,0x00,0x12,0xa0,0x00,0x0e,0x3c,0x02,0xb0,0x03,0x12,0xc0,0x00,0x0d,
+0x34,0x42,0x00,0x3c,0x00,0x15,0x10,0x40,0x00,0x55,0x10,0x21,0x00,0x02,0x10,0xc0,
+0x00,0x55,0x10,0x21,0x00,0x02,0xa8,0x80,0x02,0xb6,0x00,0x1b,0x16,0xc0,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0d,0x00,0x00,0xa8,0x12,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x00,0x3c,0x3c,0x03,0xb0,0x03,0x3c,0x04,0xb0,0x03,0xa4,0x55,0x00,0x00,
+0x34,0x63,0x00,0x1c,0x34,0x84,0x00,0x1d,0x24,0x02,0x00,0x01,0xa0,0x60,0x00,0x00,
+0xa0,0x82,0x00,0x00,0x7b,0xbe,0x01,0xfc,0x7b,0xb6,0x01,0xbc,0x7b,0xb4,0x01,0x7c,
+0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x3e,0xa0,0x51,0x00,0x00,0x08,0x00,0x2c,0x5e,
+0x26,0x42,0x00,0x01,0x0c,0x00,0x0e,0x76,0x00,0x00,0x00,0x00,0x08,0x00,0x2c,0x48,
+0x00,0x40,0x88,0x21,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x3c,0x3c,0x04,0xb0,0x03,
+0x3c,0x05,0xb0,0x03,0xa4,0x60,0x00,0x00,0x34,0x84,0x00,0x1c,0x34,0xa5,0x00,0x1d,
+0x24,0x02,0x00,0x02,0x24,0x03,0x00,0x01,0xa0,0x82,0x00,0x00,0x08,0x00,0x2c,0x7d,
+0xa0,0xa3,0x00,0x00,0x0c,0x00,0x1f,0x64,0x00,0x00,0x00,0x00,0x10,0x40,0xff,0x87,
+0x3c,0x02,0xb0,0x03,0x3c,0x04,0xb0,0x03,0x34,0x42,0x00,0x3c,0x34,0x84,0x00,0x14,
+0x24,0x03,0x00,0x01,0xa4,0x40,0x00,0x00,0x3c,0x01,0xb0,0x03,0xa0,0x23,0x00,0x3f,
+0x08,0x00,0x2c,0x7d,0xac,0x90,0x00,0x00,0x27,0xbd,0xff,0xd8,0xaf,0xb0,0x00,0x10,
+0x30,0xd0,0x00,0xff,0x2e,0x02,0x00,0x2e,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,
+0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,0x30,0xb1,0x00,0xff,0x14,0x40,0x00,0x06,
+0x00,0x80,0x90,0x21,0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x2e,0x13,0x00,0x10,0x24,0x05,0x00,0x14,
+0x0c,0x00,0x1b,0x85,0x24,0x06,0x01,0x07,0x12,0x60,0x00,0x38,0x02,0x00,0x30,0x21,
+0x8f,0xa2,0x00,0x38,0x30,0xc3,0x00,0x3f,0x3c,0x04,0xb0,0x09,0x00,0x02,0x14,0x00,
+0x00,0x43,0x30,0x25,0x34,0x84,0x01,0x60,0x90,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x40,0xff,0xfd,0x24,0x02,0x00,0x01,0x12,0x22,0x00,0x2a,0x2a,0x22,0x00,0x02,
+0x14,0x40,0x00,0x24,0x24,0x02,0x00,0x02,0x12,0x22,0x00,0x20,0x24,0x02,0x00,0x03,
+0x12,0x22,0x00,0x19,0x00,0x00,0x00,0x00,0x16,0x60,0xff,0xe2,0x24,0x02,0x00,0x01,
+0x12,0x22,0x00,0x13,0x2a,0x22,0x00,0x02,0x14,0x40,0x00,0x0d,0x24,0x02,0x00,0x02,
+0x12,0x22,0x00,0x09,0x24,0x02,0x00,0x03,0x16,0x22,0xff,0xda,0x00,0x00,0x00,0x00,
+0x24,0x04,0x08,0x4c,0x24,0x05,0xff,0xff,0x0c,0x00,0x1b,0x40,0x3c,0x06,0x0c,0xb8,
+0x08,0x00,0x2c,0xb1,0x00,0x00,0x00,0x00,0x08,0x00,0x2c,0xd9,0x24,0x04,0x08,0x48,
+0x16,0x20,0xff,0xd0,0x00,0x00,0x00,0x00,0x08,0x00,0x2c,0xd9,0x24,0x04,0x08,0x40,
+0x08,0x00,0x2c,0xd9,0x24,0x04,0x08,0x44,0x24,0x04,0x08,0x4c,0x0c,0x00,0x1b,0x40,
+0x24,0x05,0xff,0xff,0x08,0x00,0x2c,0xce,0x00,0x00,0x00,0x00,0x08,0x00,0x2c,0xe7,
+0x24,0x04,0x08,0x48,0x16,0x20,0xff,0xe0,0x00,0x00,0x00,0x00,0x08,0x00,0x2c,0xe7,
+0x24,0x04,0x08,0x40,0x08,0x00,0x2c,0xe7,0x24,0x04,0x08,0x44,0x02,0x40,0x20,0x21,
+0x0c,0x00,0x2d,0x38,0x02,0x20,0x28,0x21,0x08,0x00,0x2c,0xbc,0x00,0x40,0x30,0x21,
+0x27,0xbd,0xff,0xd8,0x2c,0xc2,0x00,0x2e,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,0x00,0xc0,0x80,0x21,
+0x30,0xb1,0x00,0xff,0x00,0x80,0x90,0x21,0x14,0x40,0x00,0x07,0x00,0x00,0x18,0x21,
+0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x00,0x60,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x2e,0x13,0x00,0x10,0x24,0x05,0x00,0x14,
+0x0c,0x00,0x1b,0x85,0x24,0x06,0x01,0x07,0x12,0x60,0x00,0x24,0x02,0x00,0x30,0x21,
+0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x60,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x14,0x40,0xff,0xfd,0x30,0xc5,0x00,0x3f,0x0c,0x00,0x2d,0x75,0x02,0x20,0x20,0x21,
+0x16,0x60,0x00,0x0a,0x00,0x40,0x80,0x21,0x24,0x02,0x00,0x01,0x12,0x22,0x00,0x15,
+0x2a,0x22,0x00,0x02,0x14,0x40,0x00,0x0f,0x24,0x02,0x00,0x02,0x12,0x22,0x00,0x0b,
+0x24,0x02,0x00,0x03,0x12,0x22,0x00,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x2d,0x04,
+0x02,0x00,0x18,0x21,0x24,0x04,0x08,0x4c,0x24,0x05,0xff,0xff,0x0c,0x00,0x1b,0x40,
+0x3c,0x06,0x0c,0xb8,0x08,0x00,0x2d,0x04,0x02,0x00,0x18,0x21,0x08,0x00,0x2d,0x26,
+0x24,0x04,0x08,0x48,0x16,0x20,0xff,0xf5,0x00,0x00,0x00,0x00,0x08,0x00,0x2d,0x26,
+0x24,0x04,0x08,0x40,0x08,0x00,0x2d,0x26,0x24,0x04,0x08,0x44,0x02,0x40,0x20,0x21,
+0x0c,0x00,0x2d,0x38,0x02,0x20,0x28,0x21,0x08,0x00,0x2d,0x10,0x00,0x40,0x30,0x21,
+0x27,0xbd,0xff,0xe8,0x2c,0xc2,0x00,0x1f,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,
+0x00,0xc0,0x80,0x21,0x14,0x40,0x00,0x1d,0x30,0xa5,0x00,0xff,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x18,0x28,0xa2,0x00,0x02,0x14,0x40,0x00,0x12,0x24,0x02,0x00,0x02,
+0x10,0xa2,0x00,0x0e,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x07,0x24,0x04,0x08,0x4c,
+0x26,0x10,0xff,0xe2,0x02,0x00,0x10,0x21,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x24,0x05,0xff,0xff,0x0c,0x00,0x1b,0x40,
+0x3c,0x06,0x0d,0xf8,0x08,0x00,0x2d,0x49,0x26,0x10,0xff,0xe2,0x08,0x00,0x2d,0x4e,
+0x24,0x04,0x08,0x48,0x14,0xa0,0xff,0xf2,0x24,0x04,0x08,0x40,0x08,0x00,0x2d,0x4f,
+0x24,0x05,0xff,0xff,0x08,0x00,0x2d,0x4e,0x24,0x04,0x08,0x44,0x2c,0xc2,0x00,0x10,
+0x14,0x40,0xff,0xec,0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x14,0x28,0xa2,0x00,0x02,
+0x14,0x40,0x00,0x0e,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x0a,0x24,0x02,0x00,0x03,
+0x10,0xa2,0x00,0x03,0x24,0x04,0x08,0x4c,0x08,0x00,0x2d,0x49,0x26,0x10,0xff,0xf1,
+0x24,0x05,0xff,0xff,0x0c,0x00,0x1b,0x40,0x3c,0x06,0x0d,0xb8,0x08,0x00,0x2d,0x49,
+0x26,0x10,0xff,0xf1,0x08,0x00,0x2d,0x68,0x24,0x04,0x08,0x48,0x14,0xa0,0xff,0xf6,
+0x24,0x04,0x08,0x40,0x08,0x00,0x2d,0x69,0x24,0x05,0xff,0xff,0x08,0x00,0x2d,0x68,
+0x24,0x04,0x08,0x44,0x27,0xbd,0xff,0xe8,0x30,0x84,0x00,0xff,0x24,0x02,0x00,0x01,
+0x10,0x82,0x00,0x39,0xaf,0xbf,0x00,0x10,0x28,0x82,0x00,0x02,0x14,0x40,0x00,0x27,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x17,0x00,0xa0,0x30,0x21,
+0x24,0x02,0x00,0x03,0x10,0x82,0x00,0x05,0x24,0x04,0x08,0x3c,0x8f,0xbf,0x00,0x10,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x1b,0x40,
+0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x3c,0x3c,0x05,0x80,0x00,0x0c,0x00,0x1b,0x40,
+0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x3c,0x3c,0x05,0x80,0x00,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x01,0x24,0x04,0x08,0xac,0x0c,0x00,0x1b,0x22,0x24,0x05,0x0f,0xff,
+0x08,0x00,0x2d,0x83,0x00,0x00,0x00,0x00,0x24,0x04,0x08,0x34,0x0c,0x00,0x1b,0x40,
+0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x34,0x3c,0x05,0x80,0x00,0x0c,0x00,0x1b,0x40,
+0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x34,0x3c,0x05,0x80,0x00,0x0c,0x00,0x1b,0x40,
+0x24,0x06,0x00,0x01,0x08,0x00,0x2d,0x92,0x24,0x04,0x08,0xa8,0x14,0x80,0xff,0xdf,
+0x00,0xa0,0x30,0x21,0x24,0x04,0x08,0x24,0x0c,0x00,0x1b,0x40,0x3c,0x05,0x3f,0x00,
+0x24,0x04,0x08,0x24,0x3c,0x05,0x80,0x00,0x0c,0x00,0x1b,0x40,0x00,0x00,0x30,0x21,
+0x24,0x04,0x08,0x24,0x3c,0x05,0x80,0x00,0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x01,
+0x08,0x00,0x2d,0x92,0x24,0x04,0x08,0xa0,0x00,0xa0,0x30,0x21,0x24,0x04,0x08,0x2c,
+0x0c,0x00,0x1b,0x40,0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x2c,0x3c,0x05,0x80,0x00,
+0x0c,0x00,0x1b,0x40,0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x2c,0x3c,0x05,0x80,0x00,
+0x0c,0x00,0x1b,0x40,0x24,0x06,0x00,0x01,0x08,0x00,0x2d,0x92,0x24,0x04,0x08,0xa4,
+0x3c,0x05,0x00,0x14,0x3c,0x02,0xb0,0x05,0x34,0x42,0x04,0x20,0x3c,0x06,0xc0,0x00,
+0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0x34,0xa5,0x17,0x09,0xac,0x45,0x00,0x00,
+0x34,0xc6,0x05,0x07,0x34,0x63,0x04,0x24,0x34,0x84,0x02,0x28,0x3c,0x07,0xb0,0x05,
+0x24,0x02,0x00,0x20,0xac,0x66,0x00,0x00,0x34,0xe7,0x04,0x50,0xa0,0x82,0x00,0x00,
+0x90,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x03,0x10,0x40,0xff,0xfc,
+0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe8,
+0xaf,0xbf,0x00,0x10,0x0c,0x00,0x2e,0x85,0x00,0x00,0x00,0x00,0x0c,0x00,0x2e,0x87,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x2e,0xae,0x00,0x00,0x00,0x00,0x3c,0x04,0xb0,0x05,
+0x34,0x84,0x00,0x04,0x0c,0x00,0x2e,0x8e,0x34,0x05,0x9c,0x40,0x8f,0xbf,0x00,0x10,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0x24,0x02,0x00,0x01,0x97,0x82,0x88,0x10,
+0x00,0x00,0x00,0x00,0x2c,0x43,0x00,0x64,0x24,0x42,0x00,0x01,0xa7,0x82,0x88,0x10,
+0x14,0x60,0x00,0x28,0x00,0x80,0x30,0x21,0x8c,0x82,0x00,0x00,0x3c,0x03,0x20,0x00,
+0xa7,0x80,0x88,0x10,0x00,0x43,0x10,0x24,0x10,0x40,0x00,0x22,0x00,0x00,0x00,0x00,
+0x8c,0x82,0x00,0x00,0x3c,0x03,0x80,0x00,0x00,0x43,0x10,0x25,0x97,0x83,0x88,0x04,
+0xac,0x82,0x00,0x00,0x8c,0x85,0x00,0x00,0x24,0x63,0x00,0x01,0x3c,0x02,0x40,0x64,
+0x34,0x42,0x64,0x00,0x00,0x03,0x24,0x00,0x00,0xa2,0x28,0x25,0x00,0x04,0x24,0x03,
+0x24,0x02,0x00,0x64,0xac,0xc5,0x00,0x00,0xa7,0x83,0x88,0x04,0x10,0x82,0x00,0x2b,
+0x00,0x00,0x00,0x00,0x87,0x82,0x88,0x06,0x24,0x03,0x00,0x3c,0x10,0x43,0x00,0x21,
+0x00,0x00,0x00,0x00,0x87,0x82,0x88,0x08,0x00,0x00,0x00,0x00,0x10,0x43,0x00,0x17,
+0x00,0x00,0x00,0x00,0x87,0x83,0x88,0x0a,0x24,0x02,0x00,0x18,0x10,0x62,0x00,0x0d,
+0x00,0x00,0x00,0x00,0x87,0x83,0x88,0x0c,0x24,0x02,0x01,0x6d,0x10,0x62,0x00,0x03,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x97,0x82,0x88,0x0e,
+0xa7,0x80,0x88,0x0c,0x24,0x42,0x00,0x01,0xa7,0x82,0x88,0x0e,0x08,0x00,0x2e,0x1d,
+0x00,0x00,0x00,0x00,0x97,0x82,0x88,0x0c,0xa7,0x80,0x88,0x0a,0x24,0x42,0x00,0x01,
+0xa7,0x82,0x88,0x0c,0x08,0x00,0x2e,0x19,0x00,0x00,0x00,0x00,0x97,0x82,0x88,0x0a,
+0xa7,0x80,0x88,0x08,0x24,0x42,0x00,0x01,0xa7,0x82,0x88,0x0a,0x08,0x00,0x2e,0x15,
+0x00,0x00,0x00,0x00,0x97,0x82,0x88,0x08,0xa7,0x80,0x88,0x06,0x24,0x42,0x00,0x01,
+0xa7,0x82,0x88,0x08,0x08,0x00,0x2e,0x11,0x00,0x00,0x00,0x00,0x97,0x82,0x88,0x06,
+0xa7,0x80,0x88,0x04,0x24,0x42,0x00,0x01,0xa7,0x82,0x88,0x06,0x08,0x00,0x2e,0x0d,
+0x00,0x00,0x00,0x00,0x00,0x04,0x24,0x00,0x3c,0x03,0xb0,0x07,0x00,0x04,0x24,0x03,
+0x34,0x63,0x00,0x28,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x40,
+0x10,0x40,0xff,0xfc,0x00,0x00,0x00,0x00,0x3c,0x01,0xb0,0x07,0xa0,0x24,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x10,0x21,0x3c,0x02,0xb0,0x07,0x34,0x42,0x00,0x28,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,0x10,0x60,0x00,0x06,
+0x24,0x02,0xff,0xff,0x3c,0x02,0xb0,0x07,0x90,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0x16,0x00,0x00,0x02,0x16,0x03,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x27,0xbd,0xff,0xe0,0xaf,0xb0,0x00,0x10,0x3c,0x10,0x04,0xc4,0x00,0x04,0x11,0x00,
+0x36,0x10,0xb4,0x00,0x02,0x02,0x00,0x1b,0xaf,0xb1,0x00,0x14,0x3c,0x11,0xb0,0x07,
+0x36,0x31,0x00,0x18,0x24,0x04,0x00,0x0a,0xaf,0xbf,0x00,0x18,0x14,0x40,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0d,0x00,0x00,0x80,0x12,0x0c,0x00,0x2e,0xda,
+0x00,0x00,0x00,0x00,0x92,0x22,0x00,0x00,0x24,0x03,0xff,0x80,0x24,0x04,0x00,0x0a,
+0x00,0x43,0x10,0x25,0x0c,0x00,0x2e,0xda,0xa2,0x22,0x00,0x00,0x24,0x04,0x00,0x0a,
+0x3c,0x01,0xb0,0x07,0xa0,0x30,0x00,0x00,0x0c,0x00,0x2e,0xda,0x00,0x10,0x82,0x03,
+0x3c,0x02,0xb0,0x07,0x34,0x42,0x00,0x08,0xa0,0x50,0x00,0x00,0x0c,0x00,0x2e,0xda,
+0x24,0x04,0x00,0x0a,0x92,0x22,0x00,0x00,0x8f,0xbf,0x00,0x18,0x8f,0xb0,0x00,0x10,
+0x30,0x42,0x00,0x7f,0xa2,0x22,0x00,0x00,0x8f,0xb1,0x00,0x14,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x34,0x63,0x00,0x58,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x42,0x07,0xa4,
+0x03,0xe0,0x00,0x08,0xac,0x62,0x00,0x00,0x27,0xbd,0xff,0xf8,0x00,0x80,0x38,0x21,
+0x00,0xa0,0x30,0x21,0x00,0x00,0x18,0x21,0x00,0x63,0x00,0x18,0x00,0x00,0x10,0x12,
+0x00,0xc2,0x10,0x2b,0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,
+0x2c,0x62,0x01,0x00,0x14,0x40,0xff,0xf9,0x00,0x63,0x00,0x18,0x24,0x63,0xff,0xff,
+0x00,0x63,0x00,0x18,0x30,0x63,0x00,0xff,0x8c,0xe4,0x00,0x00,0x00,0x03,0x2a,0x00,
+0x00,0x03,0x1c,0x00,0x00,0x00,0x10,0x12,0x00,0xc2,0x10,0x23,0x30,0x42,0x00,0xff,
+0x00,0x45,0x10,0x21,0x00,0x43,0x10,0x21,0x00,0x82,0x20,0x25,0xac,0xe4,0x00,0x00,
+0x8c,0xe2,0x00,0x00,0x3c,0x03,0x40,0x00,0x00,0x43,0x10,0x25,0xac,0xe2,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x08,0x27,0xbd,0xff,0xe0,0xaf,0xbf,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x3c,0x04,0xb0,0x03,0x8c,0x82,0x00,0x00,
+0x3c,0x06,0xb0,0x03,0x34,0xc6,0x00,0x08,0x34,0x42,0x40,0x00,0xac,0x82,0x00,0x00,
+0x8c,0x83,0x00,0x00,0x24,0x02,0xcf,0xff,0x3c,0x11,0xb0,0x07,0x00,0x62,0x18,0x24,
+0xac,0x83,0x00,0x00,0x8c,0xc5,0x00,0x00,0x3c,0x02,0x00,0xff,0x24,0x04,0x00,0x0a,
+0x00,0xa2,0x28,0x25,0xac,0xc5,0x00,0x00,0x0c,0x00,0x2e,0xda,0x36,0x31,0x00,0x18,
+0x24,0x02,0xff,0x83,0x3c,0x04,0x00,0x01,0xa2,0x22,0x00,0x00,0x0c,0x00,0x2e,0x58,
+0x34,0x84,0xc2,0x00,0x0c,0x00,0x2e,0xda,0x24,0x04,0x00,0x0a,0x24,0x02,0x00,0x03,
+0xa2,0x22,0x00,0x00,0x24,0x04,0x00,0x0a,0x0c,0x00,0x2e,0xda,0x3c,0x10,0xb0,0x07,
+0x36,0x10,0x00,0x10,0x24,0x02,0x00,0x06,0xa2,0x02,0x00,0x00,0x0c,0x00,0x2e,0xda,
+0x24,0x04,0x00,0x0a,0xa2,0x00,0x00,0x00,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x10,0x80,0x00,0x05,0x00,0x00,0x18,0x21,
+0x24,0x63,0x00,0x01,0x00,0x64,0x10,0x2b,0x14,0x40,0xff,0xfd,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xc0,0xaf,0xb5,0x00,0x34,
+0xaf,0xb2,0x00,0x28,0xaf,0xb0,0x00,0x20,0xaf,0xbf,0x00,0x38,0xaf,0xb4,0x00,0x30,
+0xaf,0xb3,0x00,0x2c,0xaf,0xb1,0x00,0x24,0xaf,0xa5,0x00,0x44,0x90,0xa7,0x00,0x00,
+0x00,0x80,0xa8,0x21,0x00,0xc0,0x90,0x21,0x00,0x07,0x1e,0x00,0x10,0x60,0x00,0x0f,
+0x00,0x80,0x80,0x21,0x00,0x03,0x1e,0x03,0x24,0x02,0x00,0x25,0x10,0x62,0x00,0x13,
+0x00,0x00,0x88,0x21,0xa2,0x07,0x00,0x00,0x8f,0xa5,0x00,0x44,0x26,0x10,0x00,0x01,
+0x24,0xa5,0x00,0x01,0xaf,0xa5,0x00,0x44,0x90,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x07,0x1e,0x00,0x14,0x60,0xff,0xf3,0x00,0x00,0x00,0x00,0x02,0x15,0x10,0x23,
+0xa2,0x00,0x00,0x00,0x8f,0xbf,0x00,0x38,0x7b,0xb4,0x01,0xbc,0x7b,0xb2,0x01,0x7c,
+0x7b,0xb0,0x01,0x3c,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,0x24,0xa5,0x00,0x01,
+0xaf,0xa5,0x00,0x44,0x80,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x63,0xff,0xe0,
+0x2c,0x62,0x00,0x11,0x10,0x40,0x00,0x11,0x00,0xa0,0x38,0x21,0x00,0x03,0x10,0x80,
+0x3c,0x03,0x80,0x01,0x24,0x63,0x09,0xfc,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x2f,0x07,
+0x36,0x31,0x00,0x10,0x08,0x00,0x2f,0x07,0x36,0x31,0x00,0x08,0x08,0x00,0x2f,0x07,
+0x36,0x31,0x00,0x20,0x08,0x00,0x2f,0x07,0x36,0x31,0x00,0x04,0x90,0xe4,0x00,0x00,
+0x3c,0x02,0x80,0x01,0x24,0x42,0x02,0x1c,0x00,0x44,0x10,0x21,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x04,0x14,0x60,0x00,0xfd,0x24,0x14,0xff,0xff,
+0x00,0x04,0x16,0x00,0x00,0x02,0x16,0x03,0x24,0x03,0x00,0x2a,0x10,0x43,0x00,0xee,
+0x26,0x42,0x00,0x03,0x80,0xa3,0x00,0x00,0x24,0x02,0x00,0x2e,0x10,0x62,0x00,0xcc,
+0x24,0x08,0xff,0xff,0x80,0xa3,0x00,0x00,0x24,0x02,0x00,0x68,0x10,0x62,0x00,0xc4,
+0x24,0x06,0xff,0xff,0x24,0x02,0x00,0x6c,0x10,0x62,0x00,0xc1,0x24,0x02,0x00,0x4c,
+0x10,0x62,0x00,0xbf,0x24,0x02,0x00,0x5a,0x10,0x62,0x00,0xbd,0x00,0x00,0x00,0x00,
+0x80,0xa3,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x63,0xff,0xdb,0x2c,0x62,0x00,0x54,
+0x10,0x40,0x00,0xaa,0x24,0x09,0x00,0x0a,0x00,0x03,0x10,0x80,0x3c,0x03,0x80,0x01,
+0x24,0x63,0x0a,0x40,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x32,0x22,0x00,0x10,0x14,0x40,0x00,0x09,
+0x24,0x02,0xff,0xfc,0x26,0x94,0xff,0xff,0x1a,0x80,0x00,0x05,0x24,0x02,0x00,0x20,
+0x26,0x94,0xff,0xff,0xa2,0x02,0x00,0x00,0x1e,0x80,0xff,0xfd,0x26,0x10,0x00,0x01,
+0x24,0x02,0xff,0xfc,0x26,0x44,0x00,0x03,0x00,0x82,0x90,0x24,0x92,0x42,0x00,0x03,
+0x26,0x94,0xff,0xff,0x26,0x52,0x00,0x04,0xa2,0x02,0x00,0x00,0x1a,0x80,0x00,0x06,
+0x26,0x10,0x00,0x01,0x24,0x02,0x00,0x20,0x26,0x94,0xff,0xff,0xa2,0x02,0x00,0x00,
+0x1e,0x80,0xff,0xfd,0x26,0x10,0x00,0x01,0x8f,0xa5,0x00,0x44,0x08,0x00,0x2e,0xf9,
+0x24,0xa5,0x00,0x01,0x24,0x02,0x00,0x25,0x08,0x00,0x2e,0xf6,0xa2,0x02,0x00,0x00,
+0x36,0x31,0x00,0x40,0x24,0x09,0x00,0x10,0x24,0x02,0x00,0x4c,0x10,0xc2,0x00,0x2a,
+0x24,0x02,0x00,0x6c,0x10,0xc2,0x00,0x05,0x24,0x02,0x00,0x5a,0x10,0xc2,0x00,0x1f,
+0x24,0x02,0x00,0x68,0x10,0xc2,0x00,0x13,0x24,0x02,0xff,0xfc,0x24,0x02,0xff,0xfc,
+0x26,0x43,0x00,0x03,0x00,0x62,0x90,0x24,0x32,0x22,0x00,0x02,0x8e,0x47,0x00,0x00,
+0x00,0x00,0x30,0x21,0x10,0x40,0x00,0x03,0x26,0x52,0x00,0x04,0x00,0xe0,0x10,0x21,
+0x00,0x02,0x37,0xc3,0x02,0x00,0x20,0x21,0xaf,0xa9,0x00,0x10,0xaf,0xb4,0x00,0x14,
+0xaf,0xa8,0x00,0x18,0x0c,0x00,0x30,0x47,0xaf,0xb1,0x00,0x1c,0x08,0x00,0x2f,0x62,
+0x00,0x40,0x80,0x21,0x26,0x43,0x00,0x03,0x00,0x62,0x90,0x24,0x32,0x22,0x00,0x02,
+0x96,0x47,0x00,0x02,0x00,0x00,0x30,0x21,0x10,0x40,0xff,0xf2,0x26,0x52,0x00,0x04,
+0x00,0x07,0x14,0x00,0x08,0x00,0x2f,0x7c,0x00,0x02,0x3c,0x03,0x26,0x42,0x00,0x03,
+0x24,0x03,0xff,0xfc,0x00,0x43,0x90,0x24,0x8e,0x47,0x00,0x00,0x00,0x00,0x30,0x21,
+0x08,0x00,0x2f,0x7d,0x26,0x52,0x00,0x04,0x26,0x42,0x00,0x07,0x24,0x03,0xff,0xf8,
+0x00,0x43,0x90,0x24,0x8e,0x46,0x00,0x00,0x8e,0x47,0x00,0x04,0x08,0x00,0x2f,0x7d,
+0x26,0x52,0x00,0x08,0x08,0x00,0x2f,0x6a,0x36,0x31,0x00,0x02,0x26,0x44,0x00,0x03,
+0x24,0x02,0xff,0xfc,0x00,0x82,0x90,0x24,0x8e,0x44,0x00,0x00,0x02,0x15,0x10,0x23,
+0x26,0x52,0x00,0x04,0x08,0x00,0x2e,0xf8,0xac,0x82,0x00,0x00,0x08,0x00,0x2f,0x6a,
+0x24,0x09,0x00,0x08,0x24,0x02,0xff,0xff,0x12,0x82,0x00,0x11,0x00,0x00,0x00,0x00,
+0x26,0x43,0x00,0x03,0x24,0x02,0xff,0xfc,0x00,0x62,0x90,0x24,0x8e,0x47,0x00,0x00,
+0x02,0x00,0x20,0x21,0x24,0x02,0x00,0x10,0x00,0x00,0x30,0x21,0xaf,0xa2,0x00,0x10,
+0xaf,0xb4,0x00,0x14,0xaf,0xa8,0x00,0x18,0x0c,0x00,0x30,0x47,0xaf,0xb1,0x00,0x1c,
+0x8f,0xa5,0x00,0x44,0x00,0x40,0x80,0x21,0x08,0x00,0x2e,0xf8,0x26,0x52,0x00,0x04,
+0x24,0x14,0x00,0x08,0x08,0x00,0x2f,0xac,0x36,0x31,0x00,0x01,0x26,0x42,0x00,0x03,
+0x24,0x03,0xff,0xfc,0x00,0x43,0x90,0x24,0x8e,0x53,0x00,0x00,0x00,0x00,0x00,0x00,
+0x12,0x60,0x00,0x23,0x26,0x52,0x00,0x04,0x02,0x60,0x20,0x21,0x0c,0x00,0x31,0x15,
+0x01,0x00,0x28,0x21,0x00,0x40,0x20,0x21,0x32,0x22,0x00,0x10,0x14,0x40,0x00,0x09,
+0x00,0x94,0x10,0x2a,0x10,0x40,0x00,0x07,0x26,0x94,0xff,0xff,0x24,0x03,0x00,0x20,
+0x00,0x94,0x10,0x2a,0xa2,0x03,0x00,0x00,0x26,0x94,0xff,0xff,0x14,0x40,0xff,0xfc,
+0x26,0x10,0x00,0x01,0x18,0x80,0x00,0x07,0x00,0x80,0x18,0x21,0x92,0x62,0x00,0x00,
+0x24,0x63,0xff,0xff,0x26,0x73,0x00,0x01,0xa2,0x02,0x00,0x00,0x14,0x60,0xff,0xfb,
+0x26,0x10,0x00,0x01,0x00,0x94,0x10,0x2a,0x10,0x40,0xff,0x83,0x26,0x94,0xff,0xff,
+0x24,0x03,0x00,0x20,0x00,0x94,0x10,0x2a,0xa2,0x03,0x00,0x00,0x26,0x94,0xff,0xff,
+0x14,0x40,0xff,0xfc,0x26,0x10,0x00,0x01,0x08,0x00,0x2f,0x62,0x00,0x00,0x00,0x00,
+0x3c,0x02,0x80,0x01,0x08,0x00,0x2f,0xc6,0x24,0x53,0x08,0x04,0x24,0x02,0x00,0x25,
+0xa2,0x02,0x00,0x00,0x8f,0xa5,0x00,0x44,0x00,0x00,0x00,0x00,0x80,0xa2,0x00,0x00,
+0x90,0xa3,0x00,0x00,0x10,0x40,0x00,0x03,0x26,0x10,0x00,0x01,0x08,0x00,0x2e,0xf6,
+0xa2,0x03,0x00,0x00,0x24,0xa5,0xff,0xff,0x08,0x00,0x2e,0xf8,0xaf,0xa5,0x00,0x44,
+0x80,0xa6,0x00,0x00,0x24,0xa5,0x00,0x01,0x08,0x00,0x2f,0x3c,0xaf,0xa5,0x00,0x44,
+0x24,0xa5,0x00,0x01,0xaf,0xa5,0x00,0x44,0x90,0xa4,0x00,0x00,0x3c,0x02,0x80,0x01,
+0x24,0x42,0x02,0x1c,0x00,0x44,0x10,0x21,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x63,0x00,0x04,0x14,0x60,0x00,0x0f,0x00,0x04,0x16,0x00,0x00,0x02,0x16,0x03,
+0x24,0x03,0x00,0x2a,0x10,0x43,0x00,0x04,0x26,0x42,0x00,0x03,0x29,0x02,0x00,0x00,
+0x08,0x00,0x2f,0x31,0x00,0x02,0x40,0x0b,0x24,0x03,0xff,0xfc,0x00,0x43,0x90,0x24,
+0x24,0xa5,0x00,0x01,0x8e,0x48,0x00,0x00,0xaf,0xa5,0x00,0x44,0x08,0x00,0x30,0x0b,
+0x26,0x52,0x00,0x04,0x0c,0x00,0x30,0x2b,0x27,0xa4,0x00,0x44,0x8f,0xa5,0x00,0x44,
+0x08,0x00,0x30,0x0b,0x00,0x40,0x40,0x21,0x24,0x03,0xff,0xfc,0x00,0x43,0x90,0x24,
+0x8e,0x54,0x00,0x00,0x24,0xe5,0x00,0x01,0xaf,0xa5,0x00,0x44,0x06,0x81,0xff,0x0d,
+0x26,0x52,0x00,0x04,0x00,0x14,0xa0,0x23,0x08,0x00,0x2f,0x2d,0x36,0x31,0x00,0x10,
+0x0c,0x00,0x30,0x2b,0x27,0xa4,0x00,0x44,0x8f,0xa5,0x00,0x44,0x08,0x00,0x2f,0x2d,
+0x00,0x40,0xa0,0x21,0x08,0x00,0x2f,0x07,0x36,0x31,0x00,0x01,0x8c,0x86,0x00,0x00,
+0x3c,0x02,0x80,0x01,0x00,0x80,0x48,0x21,0x90,0xc3,0x00,0x00,0x24,0x44,0x02,0x1c,
+0x00,0x64,0x18,0x21,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x04,
+0x10,0x40,0x00,0x10,0x00,0x00,0x38,0x21,0x00,0x80,0x40,0x21,0x24,0xc2,0x00,0x01,
+0x80,0xc5,0x00,0x00,0xad,0x22,0x00,0x00,0x90,0x43,0x00,0x00,0x00,0x40,0x30,0x21,
+0x00,0x07,0x10,0x80,0x00,0x68,0x18,0x21,0x90,0x64,0x00,0x00,0x00,0x47,0x10,0x21,
+0x00,0x02,0x10,0x40,0x00,0x45,0x10,0x21,0x30,0x84,0x00,0x04,0x14,0x80,0xff,0xf3,
+0x24,0x47,0xff,0xd0,0x03,0xe0,0x00,0x08,0x00,0xe0,0x10,0x21,0x27,0xbd,0xff,0x98,
+0xaf,0xb2,0x00,0x50,0x8f,0xb2,0x00,0x84,0x3c,0x02,0x80,0x01,0xaf,0xb4,0x00,0x58,
+0x32,0x43,0x00,0x40,0xaf,0xb1,0x00,0x4c,0xaf,0xb0,0x00,0x48,0xaf,0xb7,0x00,0x64,
+0xaf,0xb6,0x00,0x60,0xaf,0xb5,0x00,0x5c,0xaf,0xb3,0x00,0x54,0x00,0x80,0x68,0x21,
+0x00,0xc0,0x70,0x21,0x00,0xe0,0x78,0x21,0x8f,0xb0,0x00,0x78,0x8f,0xb8,0x00,0x7c,
+0x8f,0xb1,0x00,0x80,0x10,0x60,0x00,0x03,0x24,0x54,0x08,0x0c,0x3c,0x02,0x80,0x01,
+0x24,0x54,0x08,0x34,0x32,0x42,0x00,0x10,0x10,0x40,0x00,0x04,0x26,0x02,0xff,0xfe,
+0x24,0x02,0xff,0xfe,0x02,0x42,0x90,0x24,0x26,0x02,0xff,0xfe,0x2c,0x42,0x00,0x23,
+0x10,0x40,0x00,0x5d,0x00,0x00,0x18,0x21,0x32,0x42,0x00,0x01,0x24,0x15,0x00,0x30,
+0x24,0x03,0x00,0x20,0x32,0x44,0x00,0x02,0x00,0x62,0xa8,0x0a,0x10,0x80,0x00,0x07,
+0x00,0x00,0xb8,0x21,0x05,0xc0,0x00,0x96,0x32,0x42,0x00,0x04,0x10,0x40,0x00,0x90,
+0x32,0x42,0x00,0x08,0x24,0x17,0x00,0x2b,0x27,0x18,0xff,0xff,0x32,0x56,0x00,0x20,
+0x12,0xc0,0x00,0x07,0x01,0xcf,0x10,0x25,0x24,0x02,0x00,0x10,0x12,0x02,0x00,0x86,
+0x27,0x03,0xff,0xff,0x3a,0x02,0x00,0x08,0x00,0x62,0xc0,0x0a,0x01,0xcf,0x10,0x25,
+0x14,0x40,0x00,0x55,0x00,0x00,0xc8,0x21,0x24,0x02,0x00,0x30,0x24,0x19,0x00,0x01,
+0xa3,0xa2,0x00,0x00,0x02,0x39,0x10,0x2a,0x03,0x22,0x88,0x0b,0x32,0x43,0x00,0x11,
+0x14,0x60,0x00,0x0a,0x03,0x11,0xc0,0x23,0x03,0x00,0x10,0x21,0x18,0x40,0x00,0x07,
+0x27,0x18,0xff,0xff,0x24,0x03,0x00,0x20,0x03,0x00,0x10,0x21,0xa1,0xa3,0x00,0x00,
+0x27,0x18,0xff,0xff,0x1c,0x40,0xff,0xfc,0x25,0xad,0x00,0x01,0x12,0xe0,0x00,0x03,
+0x00,0x00,0x00,0x00,0xa1,0xb7,0x00,0x00,0x25,0xad,0x00,0x01,0x12,0xc0,0x00,0x07,
+0x32,0x42,0x00,0x10,0x24,0x02,0x00,0x08,0x12,0x02,0x00,0x38,0x24,0x02,0x00,0x10,
+0x12,0x02,0x00,0x30,0x24,0x02,0x00,0x30,0x32,0x42,0x00,0x10,0x14,0x40,0x00,0x0a,
+0x03,0x31,0x10,0x2a,0x03,0x00,0x10,0x21,0x18,0x40,0x00,0x06,0x27,0x18,0xff,0xff,
+0x03,0x00,0x10,0x21,0xa1,0xb5,0x00,0x00,0x27,0x18,0xff,0xff,0x1c,0x40,0xff,0xfc,
+0x25,0xad,0x00,0x01,0x03,0x31,0x10,0x2a,0x10,0x40,0x00,0x07,0x26,0x31,0xff,0xff,
+0x24,0x03,0x00,0x30,0x03,0x31,0x10,0x2a,0xa1,0xa3,0x00,0x00,0x26,0x31,0xff,0xff,
+0x14,0x40,0xff,0xfc,0x25,0xad,0x00,0x01,0x03,0x20,0x10,0x21,0x18,0x40,0x00,0x08,
+0x27,0x39,0xff,0xff,0x03,0xb9,0x10,0x21,0x90,0x43,0x00,0x00,0x03,0x20,0x20,0x21,
+0x27,0x39,0xff,0xff,0xa1,0xa3,0x00,0x00,0x1c,0x80,0xff,0xfa,0x25,0xad,0x00,0x01,
+0x03,0x00,0x10,0x21,0x18,0x40,0x00,0x07,0x27,0x18,0xff,0xff,0x24,0x03,0x00,0x20,
+0x03,0x00,0x10,0x21,0xa1,0xa3,0x00,0x00,0x27,0x18,0xff,0xff,0x1c,0x40,0xff,0xfc,
+0x25,0xad,0x00,0x01,0x01,0xa0,0x18,0x21,0x7b,0xb6,0x03,0x3c,0x7b,0xb4,0x02,0xfc,
+0x7b,0xb2,0x02,0xbc,0x7b,0xb0,0x02,0x7c,0x00,0x60,0x10,0x21,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x68,0xa1,0xa2,0x00,0x00,0x92,0x83,0x00,0x21,0x25,0xad,0x00,0x01,
+0xa1,0xa3,0x00,0x00,0x08,0x00,0x30,0x9a,0x25,0xad,0x00,0x01,0x24,0x02,0x00,0x30,
+0x08,0x00,0x30,0xcd,0xa1,0xa2,0x00,0x00,0x01,0xcf,0x10,0x25,0x10,0x40,0xff,0xad,
+0x00,0x00,0x60,0x21,0x00,0x0e,0x18,0x02,0x03,0x3d,0x98,0x21,0x00,0x60,0x20,0x21,
+0x01,0xe0,0x38,0x21,0x10,0x60,0x00,0x04,0x27,0x39,0x00,0x01,0x00,0x70,0x00,0x1b,
+0x00,0x00,0x20,0x12,0x00,0x00,0x18,0x10,0x00,0x80,0x48,0x21,0x00,0xe0,0x30,0x21,
+0x01,0x80,0x70,0x21,0x01,0x80,0x28,0x21,0x10,0x00,0x00,0x06,0x24,0x04,0x00,0x21,
+0x00,0x03,0x08,0x40,0x00,0x03,0x2f,0xc2,0x00,0x22,0x18,0x25,0x00,0x06,0x30,0x40,
+0x00,0x0e,0x70,0x40,0x14,0xa0,0x00,0x02,0x00,0x70,0x10,0x2b,0x14,0x40,0x00,0x03,
+0x24,0x84,0xff,0xff,0x00,0x70,0x18,0x23,0x25,0xce,0x00,0x01,0x14,0x80,0xff,0xf4,
+0x00,0x06,0x17,0xc2,0x02,0x83,0x18,0x21,0x01,0xc0,0x38,0x21,0x00,0x00,0x50,0x21,
+0x00,0x09,0x20,0x00,0x00,0x00,0x28,0x21,0x90,0x66,0x00,0x00,0x00,0x8a,0x70,0x25,
+0x00,0xa7,0x78,0x25,0x01,0xcf,0x10,0x25,0x14,0x40,0xff,0xda,0xa2,0x66,0x00,0x00,
+0x08,0x00,0x30,0x82,0x02,0x39,0x10,0x2a,0x08,0x00,0x30,0x7b,0x27,0x18,0xff,0xfe,
+0x10,0x40,0xff,0x73,0x32,0x56,0x00,0x20,0x08,0x00,0x30,0x72,0x24,0x17,0x00,0x20,
+0x00,0x0f,0x78,0x23,0x00,0x0e,0x70,0x23,0x00,0x0f,0x10,0x2b,0x01,0xc2,0x70,0x23,
+0x08,0x00,0x30,0x72,0x24,0x17,0x00,0x2d,0x80,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x06,0x00,0x80,0x18,0x21,0x24,0x63,0x00,0x01,0x80,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xfc,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x64,0x10,0x23,0x24,0xa5,0xff,0xff,0x24,0x02,0xff,0xff,0x10,0xa2,0x00,0x0d,
+0x00,0x80,0x18,0x21,0x80,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x09,
+0x00,0x00,0x00,0x00,0x24,0x06,0xff,0xff,0x24,0xa5,0xff,0xff,0x10,0xa6,0x00,0x05,
+0x24,0x63,0x00,0x01,0x80,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xfa,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x64,0x10,0x23,0x80,0x82,0x00,0x00,
+0x90,0x88,0x00,0x00,0x10,0x40,0x00,0x17,0x00,0x00,0x48,0x21,0x90,0xa3,0x00,0x00,
+0x00,0xa0,0x30,0x21,0x10,0x60,0x00,0x0b,0x00,0x60,0x38,0x21,0x00,0x08,0x16,0x00,
+0x00,0x02,0x46,0x03,0x00,0x07,0x16,0x00,0x00,0x02,0x16,0x03,0x11,0x02,0x00,0x05,
+0x24,0xc6,0x00,0x01,0x90,0xc3,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x60,0xff,0xf9,
+0x00,0x60,0x38,0x21,0x00,0x03,0x16,0x00,0x10,0x40,0x00,0x06,0x00,0x00,0x00,0x00,
+0x24,0x84,0x00,0x01,0x90,0x82,0x00,0x00,0x25,0x29,0x00,0x01,0x14,0x40,0xff,0xeb,
+0x00,0x40,0x40,0x21,0x03,0xe0,0x00,0x08,0x01,0x20,0x10,0x21,0x80,0x82,0x00,0x00,
+0x90,0x87,0x00,0x00,0x10,0x40,0x00,0x17,0x00,0x00,0x18,0x21,0x90,0xa2,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x02,0x1e,0x00,0x10,0x60,0x00,0x0c,0x00,0xa0,0x30,0x21,
+0x00,0x07,0x16,0x00,0x00,0x02,0x3e,0x03,0x00,0x03,0x16,0x03,0x10,0xe2,0x00,0x0d,
+0x00,0x80,0x18,0x21,0x24,0xc6,0x00,0x01,0x90,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0x1e,0x00,0x14,0x60,0xff,0xf9,0x00,0x03,0x16,0x03,0x24,0x84,0x00,0x01,
+0x90,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xec,0x00,0x40,0x38,0x21,
+0x00,0x00,0x18,0x21,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,0x27,0xbd,0xff,0xe0,
+0xaf,0xb0,0x00,0x10,0x8f,0x90,0xc5,0x5c,0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x18,
+0x00,0x84,0x80,0x0b,0x00,0x00,0x30,0x21,0x12,0x00,0x00,0x0a,0x00,0xa0,0x88,0x21,
+0x0c,0x00,0x31,0x27,0x02,0x00,0x20,0x21,0x02,0x02,0x80,0x21,0x82,0x02,0x00,0x00,
+0x02,0x20,0x28,0x21,0x02,0x00,0x20,0x21,0x14,0x40,0x00,0x07,0x00,0x00,0x30,0x21,
+0xaf,0x80,0xc5,0x5c,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x00,0xc0,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x0c,0x00,0x31,0x43,0x00,0x00,0x00,0x00,
+0x00,0x40,0x18,0x21,0x10,0x40,0x00,0x07,0x02,0x00,0x30,0x21,0x80,0x42,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0xa0,0x60,0x00,0x00,
+0x24,0x63,0x00,0x01,0xaf,0x83,0xc5,0x5c,0x08,0x00,0x31,0x71,0x00,0x00,0x00,0x00,
+0x24,0xc6,0xff,0xff,0x24,0x02,0xff,0xff,0x10,0xc2,0x00,0x05,0x00,0x80,0x18,0x21,
+0x24,0xc6,0xff,0xff,0xa0,0x65,0x00,0x00,0x14,0xc2,0xff,0xfd,0x24,0x63,0x00,0x01,
+0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x24,0xc6,0xff,0xff,0x24,0x02,0xff,0xff,
+0x10,0xc2,0x00,0x08,0x00,0x80,0x18,0x21,0x24,0x07,0xff,0xff,0x90,0xa2,0x00,0x00,
+0x24,0xc6,0xff,0xff,0x24,0xa5,0x00,0x01,0xa0,0x62,0x00,0x00,0x14,0xc7,0xff,0xfb,
+0x24,0x63,0x00,0x01,0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x00,0x80,0x18,0x21,
+0x90,0xa2,0x00,0x00,0x24,0xa5,0x00,0x01,0xa0,0x82,0x00,0x00,0x14,0x40,0xff,0xfc,
+0x24,0x84,0x00,0x01,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,0x90,0x83,0x00,0x00,
+0x90,0xa2,0x00,0x00,0x24,0x84,0x00,0x01,0x00,0x62,0x10,0x23,0x00,0x02,0x16,0x00,
+0x00,0x02,0x16,0x03,0x14,0x40,0x00,0x03,0x24,0xa5,0x00,0x01,0x14,0x60,0xff,0xf7,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x10,0x21,0x93,0x85,0x88,0x6d,0x24,0x02,0x00,0x01,0x14,0xa2,0x00,0x53,
+0x00,0x80,0x40,0x21,0x8c,0x89,0x00,0x04,0x3c,0x02,0xb0,0x01,0x01,0x22,0x30,0x21,
+0x8c,0xc3,0x00,0x04,0x3c,0x02,0x01,0x00,0x00,0x62,0x10,0x24,0x10,0x40,0x00,0x4b,
+0x30,0x62,0x00,0x08,0x10,0x45,0x00,0x59,0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x38,
+0x24,0x03,0x00,0xb4,0x30,0x44,0x00,0xff,0x10,0x83,0x00,0x61,0x24,0x02,0x00,0xc4,
+0x10,0x82,0x00,0x54,0x24,0x02,0x00,0x94,0x10,0x82,0x00,0x45,0x00,0x00,0x00,0x00,
+0x94,0xc2,0x00,0x38,0x00,0x00,0x00,0x00,0x30,0x47,0xff,0xff,0x30,0xe3,0x40,0xff,
+0x24,0x02,0x40,0x88,0x14,0x62,0x00,0x39,0x30,0xe3,0x03,0x00,0x24,0x02,0x03,0x00,
+0x10,0x62,0x00,0x38,0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x56,0x00,0x00,0x00,0x00,
+0x30,0x47,0xff,0xff,0x30,0xe2,0x00,0x80,0x14,0x40,0x00,0x30,0x3c,0x02,0xb0,0x01,
+0x01,0x22,0x30,0x21,0x94,0xc3,0x00,0x60,0x24,0x02,0x00,0x08,0x14,0x43,0x00,0x3b,
+0x00,0x00,0x00,0x00,0x90,0xc2,0x00,0x62,0x24,0x03,0x00,0x04,0x00,0x02,0x39,0x02,
+0x10,0xe3,0x00,0x15,0x24,0x02,0x00,0x06,0x14,0xe2,0x00,0x34,0x00,0x00,0x00,0x00,
+0x8d,0x05,0x01,0xac,0x94,0xc4,0x00,0x66,0x27,0x82,0x92,0x48,0x00,0x05,0x28,0x80,
+0x30,0x87,0xff,0xff,0x00,0xa2,0x28,0x21,0x00,0x07,0x1a,0x00,0x8c,0xa4,0x00,0x00,
+0x00,0x07,0x12,0x02,0x00,0x43,0x10,0x25,0x24,0x42,0x00,0x5e,0x24,0x03,0xc0,0x00,
+0x30,0x47,0xff,0xff,0x00,0x83,0x20,0x24,0x00,0x87,0x20,0x25,0xac,0xa4,0x00,0x00,
+0x08,0x00,0x32,0x17,0xad,0x07,0x00,0x10,0x8d,0x05,0x01,0xac,0x94,0xc4,0x00,0x64,
+0x27,0x82,0x92,0x48,0x00,0x05,0x28,0x80,0x30,0x87,0xff,0xff,0x00,0xa2,0x28,0x21,
+0x00,0x07,0x1a,0x00,0x8c,0xa4,0x00,0x00,0x00,0x07,0x12,0x02,0x00,0x43,0x10,0x25,
+0x24,0x42,0x00,0x36,0x3c,0x03,0xff,0xff,0x30,0x47,0xff,0xff,0x00,0x83,0x20,0x24,
+0x00,0x87,0x20,0x25,0xac,0xa4,0x00,0x00,0xad,0x07,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x50,0x08,0x00,0x31,0xd5,0x30,0x47,0xff,0xff,
+0x8d,0x04,0x01,0xac,0x27,0x83,0x92,0x48,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,
+0x8c,0x82,0x00,0x00,0x3c,0x03,0xff,0xff,0x00,0x43,0x10,0x24,0x34,0x42,0x00,0x2e,
+0xac,0x82,0x00,0x00,0x24,0x03,0x00,0x2e,0xad,0x03,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x8d,0x04,0x01,0xac,0x27,0x83,0x92,0x48,0x00,0x04,0x20,0x80,
+0x00,0x83,0x20,0x21,0x8c,0x82,0x00,0x00,0x3c,0x03,0xff,0xff,0x00,0x43,0x10,0x24,
+0x34,0x42,0x00,0x0e,0x24,0x03,0x00,0x0e,0x08,0x00,0x32,0x16,0xac,0x82,0x00,0x00,
+0x8d,0x04,0x01,0xac,0x27,0x83,0x92,0x48,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,
+0x8c,0x82,0x00,0x00,0x3c,0x03,0xff,0xff,0x00,0x43,0x10,0x24,0x34,0x42,0x00,0x14,
+0x24,0x03,0x00,0x14,0x08,0x00,0x32,0x16,0xac,0x82,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0xc6,0x00,0xff,0x00,0x06,0x48,0x40,0x01,0x26,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x8b,0xc5,0x70,0x27,0x83,0xc5,0x76,0x00,0x4b,0x40,0x21,
+0x00,0x43,0x10,0x21,0x94,0x47,0x00,0x00,0x30,0xa2,0x3f,0xff,0x10,0xe2,0x00,0x29,
+0x30,0x8a,0xff,0xff,0x95,0x02,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0x02,0x11,0x82,
+0x30,0x42,0x00,0x01,0x10,0x43,0x00,0x18,0x00,0x00,0x00,0x00,0x01,0x26,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x4b,0x30,0x21,0x94,0xc4,0x00,0x02,0x27,0x83,0xc5,0x76,
+0x27,0x85,0xc5,0x74,0x00,0x45,0x28,0x21,0x30,0x84,0xff,0xdf,0x00,0x43,0x10,0x21,
+0xa4,0xc4,0x00,0x02,0xa4,0x40,0x00,0x00,0xa4,0xa0,0x00,0x00,0x94,0xc3,0x00,0x02,
+0x3c,0x04,0xb0,0x01,0x01,0x44,0x20,0x21,0x30,0x63,0xff,0xbf,0xa4,0xc3,0x00,0x02,
+0xa0,0xc0,0x00,0x00,0x8c,0x82,0x00,0x04,0x24,0x03,0xf0,0xff,0x00,0x43,0x10,0x24,
+0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x04,0x24,0x02,0xc0,0x00,0x91,0x04,0x00,0x01,
+0x00,0xa2,0x10,0x24,0x00,0x47,0x28,0x25,0x3c,0x03,0xb0,0x01,0x24,0x02,0x00,0x02,
+0x14,0x82,0xff,0xe2,0x01,0x43,0x18,0x21,0xac,0x65,0x00,0x00,0x08,0x00,0x32,0x44,
+0x01,0x26,0x10,0x21,0x08,0x00,0x32,0x44,0x01,0x26,0x10,0x21,0x93,0x83,0x88,0x6d,
+0x24,0x02,0x00,0x01,0x14,0x62,0x00,0x0d,0x3c,0x02,0xb0,0x01,0x8c,0x84,0x00,0x04,
+0x3c,0x06,0xb0,0x09,0x00,0x82,0x20,0x21,0x8c,0x85,0x00,0x08,0x8c,0x83,0x00,0x04,
+0x3c,0x02,0x01,0x00,0x34,0xc6,0x01,0x00,0x00,0x62,0x18,0x24,0x14,0x60,0x00,0x05,
+0x30,0xa5,0x20,0x00,0x24,0x02,0x00,0x06,0xa0,0xc2,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x09,0x10,0xa0,0xff,0xfc,0x34,0x63,0x01,0x00,
+0x24,0x02,0x00,0x0e,0x08,0x00,0x32,0x77,0xa0,0x62,0x00,0x00,0x3c,0x02,0xb0,0x01,
+0x30,0xa5,0xff,0xff,0x00,0xa2,0x28,0x21,0x8c,0xa3,0x00,0x00,0x3c,0x02,0x10,0x00,
+0x00,0x80,0x30,0x21,0x00,0x62,0x18,0x24,0x8c,0xa2,0x00,0x04,0x10,0x60,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x42,0x80,0x00,0x10,0x40,0x00,0x13,0x00,0x00,0x00,0x00,
+0x8c,0xc2,0x01,0xa8,0x00,0x00,0x00,0x00,0x24,0x44,0x00,0x01,0x28,0x83,0x00,0x00,
+0x24,0x42,0x00,0x40,0x00,0x83,0x10,0x0a,0x93,0x83,0x88,0x6c,0x00,0x02,0x11,0x83,
+0x00,0x02,0x11,0x80,0x00,0x82,0x20,0x23,0x24,0x63,0xff,0xff,0xac,0xc4,0x01,0xa8,
+0xa3,0x83,0x88,0x6c,0x8c,0xc4,0x01,0xac,0x8c,0xc2,0x01,0xa8,0x00,0x00,0x00,0x00,
+0x00,0x44,0x10,0x26,0x00,0x02,0x10,0x2b,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x73,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0xa3,0x80,0x88,0x6d,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0xa3,0x82,0x88,0x6d,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x04,0x3c,0x05,0xb0,0x01,
+0x00,0x80,0x50,0x21,0x00,0x45,0x10,0x21,0x8c,0x43,0x00,0x04,0x24,0x02,0x00,0x05,
+0x00,0x03,0x1a,0x02,0x30,0x69,0x00,0x0f,0x11,0x22,0x00,0x0b,0x24,0x02,0x00,0x07,
+0x11,0x22,0x00,0x09,0x24,0x02,0x00,0x0a,0x11,0x22,0x00,0x07,0x24,0x02,0x00,0x0b,
+0x11,0x22,0x00,0x05,0x24,0x02,0x00,0x01,0x93,0x83,0x88,0x6c,0x3c,0x04,0xb0,0x06,
+0x10,0x62,0x00,0x03,0x34,0x84,0x80,0x18,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x17,0x02,0x14,0x40,0xff,0xfa,
+0x00,0x00,0x00,0x00,0x8d,0x43,0x01,0xa8,0x27,0x82,0x92,0x48,0x00,0x03,0x18,0x80,
+0x00,0x6a,0x20,0x21,0x8c,0x87,0x00,0xa8,0x00,0x62,0x18,0x21,0x8c,0x68,0x00,0x00,
+0x00,0xe5,0x28,0x21,0x8c,0xa9,0x00,0x00,0x3c,0x02,0xff,0xff,0x27,0x83,0x93,0x48,
+0x01,0x22,0x10,0x24,0x00,0x48,0x10,0x25,0xac,0xa2,0x00,0x00,0x8d,0x44,0x01,0xa8,
+0x00,0x07,0x30,0xc2,0x3c,0x02,0x00,0x80,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,
+0x00,0x06,0x32,0x00,0x8c,0xa9,0x00,0x04,0x00,0xc2,0x30,0x25,0x8c,0x82,0x00,0x00,
+0x3c,0x03,0x80,0x00,0x01,0x22,0x10,0x25,0x00,0x43,0x10,0x25,0xac,0xa2,0x00,0x04,
+0xaf,0x87,0xc5,0x60,0x8c,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x82,0xc5,0x68,
+0x8c,0xa3,0x00,0x04,0x3c,0x01,0xb0,0x07,0xac,0x26,0x80,0x18,0x8d,0x42,0x01,0xa8,
+0xaf,0x83,0xc5,0x64,0x93,0x85,0x88,0x6c,0x24,0x44,0x00,0x01,0x28,0x83,0x00,0x00,
+0x24,0x42,0x00,0x40,0x00,0x83,0x10,0x0a,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,
+0x24,0xa5,0xff,0xff,0x00,0x82,0x20,0x23,0xad,0x44,0x01,0xa8,0xa3,0x85,0x88,0x6c,
+0x08,0x00,0x32,0xc2,0x00,0x00,0x00,0x00,0x3c,0x05,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0xa5,0x00,0x20,0x24,0x42,0xcb,0xe8,0xac,0xa2,0x00,0x00,0x24,0x02,0x00,0x02,
+0x24,0x03,0x00,0x20,0xac,0x82,0x00,0x64,0x3c,0x02,0x80,0x01,0xac,0x83,0x00,0x60,
+0xac,0x80,0x00,0x00,0xac,0x80,0x00,0x04,0xac,0x80,0x00,0x08,0xac,0x80,0x00,0x4c,
+0xac,0x80,0x00,0x50,0xac,0x80,0x00,0x54,0xac,0x80,0x00,0x0c,0xac,0x80,0x00,0x58,
+0xa0,0x80,0x00,0x5c,0x24,0x42,0xcc,0xac,0x24,0x83,0x00,0x68,0x24,0x05,0x00,0x0f,
+0x24,0xa5,0xff,0xff,0xac,0x62,0x00,0x00,0x04,0xa1,0xff,0xfd,0x24,0x63,0x00,0x04,
+0x3c,0x02,0x80,0x01,0x24,0x42,0xcd,0xdc,0xac,0x82,0x00,0x78,0x3c,0x03,0x80,0x01,
+0x3c,0x02,0x80,0x01,0x24,0x63,0xcf,0x68,0x24,0x42,0xce,0xd4,0xac,0x83,0x00,0x88,
+0xac,0x82,0x00,0x98,0x3c,0x03,0x80,0x01,0x3c,0x02,0x80,0x01,0x24,0x63,0xd0,0x10,
+0x24,0x42,0xd1,0x28,0xac,0x83,0x00,0xa0,0xac,0x82,0x00,0xa4,0xa0,0x80,0x01,0xba,
+0xac,0x80,0x01,0xa8,0xac,0x80,0x01,0xac,0xac,0x80,0x01,0xb0,0xac,0x80,0x01,0xb4,
+0xa0,0x80,0x01,0xb8,0x03,0xe0,0x00,0x08,0xa0,0x80,0x01,0xb9,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x01,0x34,0x63,0x00,0x20,0x24,0x42,0xcc,0xac,0x03,0xe0,0x00,0x08,
+0xac,0x62,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,0x27,0xbd,0xff,0xe8,
+0x34,0x63,0x00,0x20,0x24,0x42,0xcc,0xc4,0xaf,0xb0,0x00,0x10,0xac,0x62,0x00,0x00,
+0xaf,0xbf,0x00,0x14,0x8c,0x83,0x00,0x10,0x8f,0x82,0x94,0xe8,0x00,0x80,0x80,0x21,
+0x3c,0x04,0x80,0x01,0x30,0x46,0x00,0x01,0x10,0x60,0x00,0x11,0x24,0x84,0x08,0x64,
+0x8e,0x02,0x00,0x14,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0d,0x00,0x00,0x00,0x00,
+0x8e,0x05,0x00,0x10,0x8e,0x03,0x00,0x14,0x8e,0x02,0x00,0x04,0x00,0xa3,0x28,0x21,
+0x00,0x45,0x10,0x21,0x30,0x43,0x00,0xff,0x00,0x03,0x18,0x2b,0x00,0x02,0x12,0x02,
+0x00,0x43,0x10,0x21,0x00,0x02,0x12,0x00,0x30,0x42,0x3f,0xff,0xae,0x02,0x00,0x04,
+0x14,0xc0,0x00,0x0a,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x4c,
+0xae,0x00,0x00,0x50,0xae,0x00,0x00,0x54,0xae,0x00,0x00,0x0c,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x8e,0x05,0x00,0x10,
+0x8e,0x07,0x00,0x04,0x8e,0x06,0x00,0x14,0x0c,0x00,0x1a,0x82,0x00,0x00,0x00,0x00,
+0x08,0x00,0x33,0x53,0xae,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x63,0x00,0x20,0x24,0x42,0xcd,0x88,0xac,0x62,0x00,0x00,0x8c,0x86,0x00,0x04,
+0x3c,0x02,0xb0,0x01,0x24,0x03,0x00,0x01,0x00,0xc2,0x10,0x21,0x8c,0x45,0x00,0x00,
+0xac,0x83,0x00,0x4c,0x00,0x05,0x14,0x02,0x30,0xa3,0x3f,0xff,0x30,0x42,0x00,0xff,
+0xac,0x83,0x00,0x10,0xac,0x82,0x00,0x14,0x8c,0x83,0x00,0x14,0xac,0x85,0x00,0x40,
+0x00,0xc3,0x30,0x21,0x03,0xe0,0x00,0x08,0xac,0x86,0x00,0x08,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,0x24,0x63,0xcd,0xdc,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x4c,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0a,0x00,0x80,0x80,0x21,0xae,0x00,0x00,0x00,
+0xae,0x00,0x00,0x4c,0xae,0x00,0x00,0x50,0xae,0x00,0x00,0x54,0xae,0x00,0x00,0x0c,
+0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x0c,0x00,0x33,0x62,0x00,0x00,0x00,0x00,0x08,0x00,0x33,0x84,0xae,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,
+0x24,0x63,0xce,0x40,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,
+0x8c,0x82,0x00,0x4c,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x16,0x00,0x80,0x80,0x21,
+0x8e,0x03,0x00,0x08,0x3c,0x02,0xb0,0x01,0x8e,0x04,0x00,0x44,0x00,0x62,0x18,0x21,
+0x90,0x65,0x00,0x00,0x24,0x02,0x00,0x01,0xae,0x02,0x00,0x50,0x30,0xa3,0x00,0xff,
+0x00,0x03,0x10,0x82,0x00,0x04,0x23,0x02,0x30,0x84,0x00,0x0f,0x30,0x42,0x00,0x03,
+0x00,0x03,0x19,0x02,0xae,0x04,0x00,0x34,0xae,0x02,0x00,0x2c,0xae,0x03,0x00,0x30,
+0xa2,0x05,0x00,0x48,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x0c,0x00,0x33,0x62,0x00,0x00,0x00,0x00,0x08,0x00,0x33,0x9c,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,
+0x34,0x42,0x00,0x20,0x24,0x63,0xce,0xd4,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,
+0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x50,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x16,
+0x00,0x80,0x80,0x21,0x92,0x03,0x00,0x44,0x8e,0x02,0x00,0x40,0x83,0x85,0x95,0x14,
+0x92,0x04,0x00,0x41,0x30,0x63,0x00,0x01,0x00,0x02,0x16,0x02,0xae,0x04,0x00,0x14,
+0x00,0x00,0x30,0x21,0xae,0x02,0x00,0x18,0x10,0xa0,0x00,0x04,0xae,0x03,0x00,0x3c,
+0x10,0x60,0x00,0x03,0x24,0x02,0x00,0x01,0x24,0x06,0x00,0x01,0x24,0x02,0x00,0x01,
+0xa3,0x86,0x95,0x14,0x8f,0xbf,0x00,0x14,0xae,0x02,0x00,0x54,0x8f,0xb0,0x00,0x10,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x33,0x90,0x00,0x00,0x00,0x00,
+0x08,0x00,0x33,0xc1,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,
+0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,0x24,0x63,0xcf,0x68,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x50,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x1b,0x00,0x80,0x80,0x21,0x3c,0x02,0xb0,0x03,0x8c,0x42,0x00,0x00,
+0x92,0x04,0x00,0x44,0x8e,0x03,0x00,0x40,0x83,0x86,0x95,0x14,0x92,0x05,0x00,0x41,
+0x30,0x42,0x08,0x00,0x30,0x84,0x00,0x01,0x00,0x02,0x12,0xc2,0x00,0x03,0x1e,0x02,
+0x00,0x82,0x20,0x25,0xae,0x05,0x00,0x14,0x00,0x00,0x38,0x21,0xae,0x03,0x00,0x18,
+0x10,0xc0,0x00,0x04,0xae,0x04,0x00,0x3c,0x10,0x80,0x00,0x03,0x24,0x02,0x00,0x01,
+0x24,0x07,0x00,0x01,0x24,0x02,0x00,0x01,0xa3,0x87,0x95,0x14,0x8f,0xbf,0x00,0x14,
+0xae,0x02,0x00,0x54,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x0c,0x00,0x33,0x90,0x00,0x00,0x00,0x00,0x08,0x00,0x33,0xe6,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,
+0x24,0x63,0xd0,0x10,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,
+0x8c,0x82,0x00,0x54,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x37,0x00,0x80,0x80,0x21,
+0x8e,0x04,0x00,0x04,0x8e,0x03,0x00,0x44,0x3c,0x02,0x80,0x00,0x3c,0x05,0xb0,0x01,
+0x34,0x42,0x00,0x10,0x00,0x85,0x20,0x21,0x00,0x62,0x18,0x25,0xac,0x83,0x00,0x04,
+0x8e,0x02,0x00,0x04,0x8e,0x03,0x01,0xac,0x02,0x00,0x20,0x21,0x00,0x45,0x10,0x21,
+0x8c,0x46,0x00,0x00,0x00,0x03,0x18,0x80,0x27,0x82,0x92,0x48,0x00,0x62,0x18,0x21,
+0xac,0x66,0x00,0x00,0x8e,0x02,0x00,0x04,0x8e,0x03,0x01,0xac,0x00,0x45,0x10,0x21,
+0x8c,0x46,0x00,0x04,0x00,0x03,0x18,0x80,0x27,0x82,0x93,0x48,0x00,0x62,0x18,0x21,
+0x0c,0x00,0x31,0xb1,0xac,0x66,0x00,0x00,0x8e,0x03,0x01,0xac,0x8e,0x07,0x00,0x04,
+0x3c,0x06,0xb0,0x03,0x24,0x65,0x00,0x01,0x28,0xa4,0x00,0x00,0x24,0x62,0x00,0x40,
+0x00,0xa4,0x10,0x0a,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,0x00,0x03,0x18,0x80,
+0x00,0xa2,0x28,0x23,0x00,0x70,0x18,0x21,0xae,0x05,0x01,0xac,0xac,0x67,0x00,0xa8,
+0x34,0xc6,0x00,0x30,0x8c,0xc3,0x00,0x00,0x93,0x82,0x88,0x6c,0x02,0x00,0x20,0x21,
+0x24,0x63,0x00,0x01,0x24,0x42,0x00,0x01,0xac,0xc3,0x00,0x00,0xa3,0x82,0x88,0x6c,
+0x0c,0x00,0x33,0x31,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x33,0xda,0x00,0x00,0x00,0x00,
+0x08,0x00,0x34,0x10,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,
+0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,0x24,0x63,0xd1,0x28,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x54,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x37,0x00,0x80,0x80,0x21,0x8e,0x04,0x00,0x04,0x8e,0x03,0x00,0x44,
+0x3c,0x02,0x80,0x00,0x3c,0x05,0xb0,0x01,0x34,0x42,0x00,0x10,0x00,0x85,0x20,0x21,
+0x00,0x62,0x18,0x25,0xac,0x83,0x00,0x04,0x8e,0x02,0x00,0x04,0x8e,0x03,0x01,0xac,
+0x02,0x00,0x20,0x21,0x00,0x45,0x10,0x21,0x8c,0x46,0x00,0x00,0x00,0x03,0x18,0x80,
+0x27,0x82,0x92,0x48,0x00,0x62,0x18,0x21,0xac,0x66,0x00,0x00,0x8e,0x02,0x00,0x04,
+0x8e,0x03,0x01,0xac,0x00,0x45,0x10,0x21,0x8c,0x46,0x00,0x04,0x00,0x03,0x18,0x80,
+0x27,0x82,0x93,0x48,0x00,0x62,0x18,0x21,0x0c,0x00,0x31,0xb1,0xac,0x66,0x00,0x00,
+0x8e,0x03,0x01,0xac,0x8e,0x07,0x00,0x04,0x3c,0x06,0xb0,0x03,0x24,0x65,0x00,0x01,
+0x28,0xa4,0x00,0x00,0x24,0x62,0x00,0x40,0x00,0xa4,0x10,0x0a,0x00,0x02,0x11,0x83,
+0x00,0x02,0x11,0x80,0x00,0x03,0x18,0x80,0x00,0xa2,0x28,0x23,0x00,0x70,0x18,0x21,
+0xae,0x05,0x01,0xac,0xac,0x67,0x00,0xa8,0x34,0xc6,0x00,0x30,0x8c,0xc3,0x00,0x00,
+0x93,0x82,0x88,0x6c,0x02,0x00,0x20,0x21,0x24,0x63,0x00,0x01,0x24,0x42,0x00,0x01,
+0xac,0xc3,0x00,0x00,0xa3,0x82,0x88,0x6c,0x0c,0x00,0x33,0x31,0x00,0x00,0x00,0x00,
+0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x0c,0x00,0x33,0xda,0x00,0x00,0x00,0x00,0x08,0x00,0x34,0x56,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x34,0x42,0x00,0x20,0x24,0x63,0xd2,0x40,
+0x27,0xbd,0xff,0xe0,0xac,0x43,0x00,0x00,0x3c,0x02,0x80,0x01,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x1c,0x00,0x80,0x80,0x21,
+0x24,0x52,0xcc,0xac,0x00,0x00,0x88,0x21,0x3c,0x03,0xb0,0x09,0x34,0x63,0x00,0x06,
+0x8e,0x06,0x00,0x04,0x90,0x62,0x00,0x00,0x00,0x06,0x22,0x02,0x00,0x44,0x10,0x23,
+0x24,0x44,0x00,0x40,0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x7f,0x00,0x83,0x10,0x0a,
+0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,0x24,0x84,0xff,0xff,0x10,0x44,0x00,0x68,
+0x00,0x00,0x28,0x21,0x3c,0x02,0xb0,0x01,0x00,0xc2,0x10,0x21,0x8c,0x44,0x00,0x04,
+0x3c,0x03,0x7c,0x00,0x34,0x63,0x00,0xf0,0x00,0x83,0x18,0x24,0xae,0x04,0x00,0x44,
+0x8c,0x44,0x00,0x00,0x10,0x60,0x00,0x69,0x00,0x00,0x38,0x21,0x3c,0x09,0xb0,0x03,
+0x3c,0x06,0x7c,0x00,0x35,0x29,0x00,0x99,0x3c,0x0a,0xb0,0x01,0x24,0x08,0x00,0x40,
+0x34,0xc6,0x00,0xf0,0x3c,0x0b,0xff,0xff,0x3c,0x0c,0x28,0x38,0x16,0x20,0x00,0x06,
+0x24,0xa5,0x00,0x01,0x93,0x82,0x88,0xa0,0x24,0x11,0x00,0x01,0x24,0x42,0x00,0x01,
+0xa1,0x22,0x00,0x00,0xa3,0x82,0x88,0xa0,0x8e,0x02,0x00,0x04,0x24,0x07,0x00,0x01,
+0x24,0x42,0x01,0x00,0x30,0x42,0x3f,0xff,0xae,0x02,0x00,0x04,0x00,0x4a,0x10,0x21,
+0x8c,0x43,0x00,0x04,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x44,0x8c,0x44,0x00,0x00,
+0x10,0xa8,0x00,0x2d,0x00,0x66,0x18,0x24,0x14,0x60,0xff,0xec,0x00,0x8b,0x10,0x24,
+0x14,0x4c,0xff,0xea,0x24,0x02,0x00,0x01,0x10,0xe2,0x00,0x2f,0x3c,0x03,0xb0,0x09,
+0x8e,0x02,0x00,0x44,0x8e,0x04,0x00,0x60,0x00,0x02,0x1e,0x42,0x00,0x02,0x12,0x02,
+0x30,0x42,0x00,0x0f,0x30,0x63,0x00,0x01,0xae,0x02,0x00,0x00,0x10,0x44,0x00,0x1a,
+0xae,0x03,0x00,0x58,0x8e,0x02,0x00,0x64,0x8e,0x04,0x00,0x58,0x00,0x00,0x00,0x00,
+0x10,0x82,0x00,0x05,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x4c,0xae,0x00,0x00,0x50,
+0xae,0x00,0x00,0x54,0xae,0x00,0x00,0x0c,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x03,0x10,0x80,0x00,0x50,0x10,0x21,0x8c,0x42,0x00,0x68,0x00,0x00,0x00,0x00,
+0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x40,0xf8,0x09,0x02,0x00,0x20,0x21,
+0x8e,0x04,0x00,0x58,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x60,
+0x08,0x00,0x34,0x9e,0xae,0x04,0x00,0x64,0x8e,0x02,0x00,0x64,0x00,0x00,0x00,0x00,
+0x14,0x62,0xff,0xe5,0x00,0x00,0x00,0x00,0x7a,0x02,0x0d,0x7c,0x8f,0xbf,0x00,0x1c,
+0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x00,0x43,0x10,0x26,0x00,0x02,0x10,0x2b,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x34,0x63,0x00,0x06,0x8e,0x04,0x00,0x04,
+0x90,0x62,0x00,0x00,0x00,0x04,0x22,0x02,0x00,0x44,0x10,0x23,0x24,0x44,0x00,0x40,
+0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x7f,0x00,0x83,0x10,0x0a,0x00,0x02,0x11,0x83,
+0x00,0x02,0x11,0x80,0x00,0x82,0x20,0x23,0x14,0x87,0xff,0xc5,0x00,0x00,0x00,0x00,
+0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x62,0x00,0x03,0x14,0x40,0x00,0x05,
+0x24,0x02,0x00,0x0d,0x10,0x62,0x00,0x03,0x24,0x02,0x00,0x01,0x08,0x00,0x34,0xfe,
+0xa2,0x02,0x00,0x5c,0x08,0x00,0x34,0xfe,0xa2,0x00,0x00,0x5c,0x3c,0x02,0xff,0xff,
+0x00,0x82,0x10,0x24,0x3c,0x03,0x28,0x38,0x14,0x43,0xff,0x94,0x24,0x02,0x00,0x01,
+0x08,0x00,0x34,0xd6,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,
+0x34,0x42,0x00,0x20,0x24,0x63,0xd4,0x98,0xac,0x43,0x00,0x00,0x8c,0x83,0x01,0xa8,
+0x8c,0x82,0x01,0xac,0x00,0x80,0x40,0x21,0x10,0x62,0x00,0x20,0x00,0x00,0x20,0x21,
+0x93,0x82,0x88,0x6d,0x00,0x03,0x28,0x80,0x3c,0x07,0xb0,0x06,0x00,0xa8,0x18,0x21,
+0x24,0x04,0x00,0x01,0x8c,0x66,0x00,0xa8,0x10,0x44,0x00,0x1c,0x34,0xe7,0x80,0x18,
+0x3c,0x05,0xb0,0x01,0xaf,0x86,0xc5,0x60,0x00,0xc5,0x28,0x21,0x8c,0xa3,0x00,0x00,
+0x00,0x06,0x20,0xc2,0x3c,0x02,0x00,0x80,0x00,0x04,0x22,0x00,0x00,0x82,0x20,0x25,
+0xaf,0x83,0xc5,0x68,0x8c,0xa2,0x00,0x04,0xac,0xe4,0x00,0x00,0x8d,0x03,0x01,0xa8,
+0xaf,0x82,0xc5,0x64,0x24,0x64,0x00,0x01,0x04,0x80,0x00,0x0a,0x00,0x80,0x10,0x21,
+0x00,0x02,0x11,0x83,0x8d,0x03,0x01,0xac,0x00,0x02,0x11,0x80,0x00,0x82,0x10,0x23,
+0x00,0x43,0x18,0x26,0xad,0x02,0x01,0xa8,0x00,0x03,0x20,0x2b,0x03,0xe0,0x00,0x08,
+0x00,0x80,0x10,0x21,0x08,0x00,0x35,0x48,0x24,0x62,0x00,0x40,0x27,0x82,0x92,0x48,
+0x00,0x06,0x20,0xc2,0x00,0x04,0x22,0x00,0x00,0xa2,0x48,0x21,0x3c,0x02,0x00,0x80,
+0x00,0x82,0x58,0x25,0x93,0x82,0x88,0x6c,0x3c,0x0a,0xb0,0x06,0x3c,0x03,0xb0,0x01,
+0x2c,0x42,0x00,0x02,0x00,0xc3,0x38,0x21,0x35,0x4a,0x80,0x18,0x14,0x40,0xff,0xef,
+0x00,0x00,0x20,0x21,0x8c,0xe5,0x00,0x00,0x8d,0x23,0x00,0x00,0x24,0x02,0xc0,0x00,
+0x00,0xa2,0x10,0x24,0x00,0x43,0x10,0x25,0xac,0xe2,0x00,0x00,0x8d,0x04,0x01,0xa8,
+0x27,0x83,0x93,0x48,0x8c,0xe5,0x00,0x04,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,
+0x8c,0x82,0x00,0x00,0x3c,0x03,0x80,0x00,0x00,0xa2,0x10,0x25,0x00,0x43,0x10,0x25,
+0xac,0xe2,0x00,0x04,0xaf,0x86,0xc5,0x60,0x8c,0xe2,0x00,0x00,0x93,0x85,0x88,0x6c,
+0xaf,0x82,0xc5,0x68,0x8c,0xe3,0x00,0x04,0xad,0x4b,0x00,0x00,0x8d,0x02,0x01,0xa8,
+0xaf,0x83,0xc5,0x64,0x24,0xa5,0xff,0xff,0x24,0x44,0x00,0x01,0x28,0x83,0x00,0x00,
+0x24,0x42,0x00,0x40,0x00,0x83,0x10,0x0a,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,
+0x00,0x82,0x20,0x23,0xad,0x04,0x01,0xa8,0xa3,0x85,0x88,0x6c,0x79,0x02,0x0d,0x7c,
+0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x26,0x08,0x00,0x35,0x4f,0x00,0x02,0x20,0x2b,
+0x90,0x87,0x00,0x00,0x3c,0x02,0x80,0x01,0x27,0xbd,0xff,0xe8,0x24,0x48,0x02,0x1c,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0x01,0x07,0x18,0x21,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x20,0x10,0x40,0x00,0x0a,0x00,0x00,0x80,0x21,
+0x24,0x84,0x00,0x01,0x90,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x18,0x21,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x20,0x14,0x40,0xff,0xf8,
+0x00,0x00,0x00,0x00,0x00,0x07,0x16,0x00,0x00,0x02,0x16,0x03,0x24,0x03,0x00,0x2d,
+0x10,0x43,0x00,0x0f,0x00,0x00,0x00,0x00,0x0c,0x00,0x35,0xb3,0x00,0x00,0x00,0x00,
+0x00,0x40,0x18,0x21,0x00,0x02,0x10,0x23,0x04,0x61,0x00,0x05,0x00,0x70,0x10,0x0a,
+0x16,0x00,0x00,0x03,0x3c,0x02,0x80,0x00,0x3c,0x02,0x7f,0xff,0x34,0x42,0xff,0xff,
+0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x24,0x10,0xff,0xff,0x08,0x00,0x35,0xa2,0x24,0x84,0x00,0x01,0x00,0x80,0x38,0x21,
+0x90,0x84,0x00,0x00,0x3c,0x02,0x80,0x01,0x24,0x48,0x02,0x1c,0x01,0x04,0x18,0x21,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x20,0x10,0x40,0x00,0x0a,
+0x00,0x00,0x50,0x21,0x24,0xe7,0x00,0x01,0x90,0xe4,0x00,0x00,0x00,0x00,0x00,0x00,
+0x01,0x04,0x18,0x21,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x20,
+0x14,0x40,0xff,0xf8,0x00,0x00,0x00,0x00,0x00,0x04,0x16,0x00,0x00,0x02,0x16,0x03,
+0x38,0x42,0x00,0x2b,0x24,0xe3,0x00,0x01,0x24,0x04,0x00,0x10,0x10,0xc4,0x00,0x38,
+0x00,0x62,0x38,0x0a,0x90,0xe4,0x00,0x00,0x14,0xc0,0x00,0x07,0x00,0x80,0x18,0x21,
+0x00,0x04,0x16,0x00,0x00,0x02,0x16,0x03,0x24,0x03,0x00,0x30,0x10,0x43,0x00,0x25,
+0x24,0x06,0x00,0x0a,0x00,0x80,0x18,0x21,0x00,0x03,0x16,0x00,0x10,0x40,0x00,0x1a,
+0x30,0x64,0x00,0xff,0x24,0x82,0xff,0xa9,0x2c,0x83,0x00,0x61,0x30,0x48,0x00,0xff,
+0x10,0x60,0x00,0x09,0x2c,0x89,0x00,0x41,0x24,0x82,0xff,0xc9,0x30,0x48,0x00,0xff,
+0x11,0x20,0x00,0x05,0x2c,0x83,0x00,0x3a,0x24,0x82,0xff,0xd0,0x14,0x60,0x00,0x02,
+0x30,0x48,0x00,0xff,0x24,0x08,0x00,0xff,0x01,0x06,0x10,0x2a,0x10,0x40,0x00,0x0a,
+0x01,0x46,0x00,0x18,0x24,0xe7,0x00,0x01,0x00,0x00,0x18,0x12,0x00,0x6a,0x10,0x2b,
+0x14,0x40,0x00,0x0a,0x00,0x68,0x50,0x21,0x80,0xe2,0x00,0x00,0x90,0xe3,0x00,0x00,
+0x14,0x40,0xff,0xe8,0x30,0x64,0x00,0xff,0x10,0xa0,0x00,0x02,0x00,0x00,0x00,0x00,
+0xac,0xa7,0x00,0x00,0x03,0xe0,0x00,0x08,0x01,0x40,0x10,0x21,0x03,0xe0,0x00,0x08,
+0x24,0x02,0xff,0xff,0x24,0x06,0x00,0x08,0x80,0xe3,0x00,0x01,0x24,0x02,0x00,0x78,
+0x10,0x62,0x00,0x03,0x24,0x02,0x00,0x58,0x14,0x62,0xff,0xd7,0x00,0x80,0x18,0x21,
+0x24,0xe7,0x00,0x02,0x90,0xe4,0x00,0x00,0x08,0x00,0x35,0xd5,0x24,0x06,0x00,0x10,
+0x80,0xe3,0x00,0x00,0x24,0x02,0x00,0x30,0x90,0xe4,0x00,0x00,0x10,0x62,0xff,0xf2,
+0x00,0x00,0x00,0x00,0x08,0x00,0x35,0xce,0x00,0x00,0x00,0x00,0x3c,0x04,0xb0,0x03,
+0x3c,0x06,0xb0,0x07,0x3c,0x02,0x80,0x01,0x34,0xc6,0x00,0x18,0x34,0x84,0x00,0x20,
+0x24,0x42,0xd8,0x2c,0x24,0x03,0xff,0x83,0xac,0x82,0x00,0x00,0xa0,0xc3,0x00,0x00,
+0x90,0xc4,0x00,0x00,0x27,0xbd,0xff,0xf8,0x3c,0x03,0xb0,0x07,0x24,0x02,0xff,0x82,
+0xa3,0xa4,0x00,0x00,0xa0,0x62,0x00,0x00,0x90,0x64,0x00,0x00,0x3c,0x02,0xb0,0x07,
+0x34,0x42,0x00,0x08,0xa3,0xa4,0x00,0x01,0xa0,0x40,0x00,0x00,0x90,0x43,0x00,0x00,
+0x24,0x02,0x00,0x03,0x3c,0x05,0xb0,0x07,0xa3,0xa3,0x00,0x00,0xa0,0xc2,0x00,0x00,
+0x90,0xc4,0x00,0x00,0x34,0xa5,0x00,0x10,0x24,0x02,0x00,0x06,0x3c,0x03,0xb0,0x07,
+0xa3,0xa4,0x00,0x00,0x34,0x63,0x00,0x38,0xa0,0xa2,0x00,0x00,0x90,0x64,0x00,0x00,
+0x3c,0x02,0xb0,0x07,0x34,0x42,0x00,0x20,0xa3,0xa4,0x00,0x00,0xa0,0xa0,0x00,0x00,
+0x90,0xa3,0x00,0x00,0xaf,0x82,0xc8,0x70,0xa3,0xa3,0x00,0x00,0xa0,0x40,0x00,0x00,
+0x90,0x43,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x08,};
+
+u8 Rtl8190PciFwDataArray[DataArrayLengthPci] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x0a,0x0d,0x5b,0x43,0x4d,0x50,0x4b,0x5d,0x00,0x00,0x00,0x00,
+0x80,0x01,0x00,0x14,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,
+0x08,0x08,0x08,0x08,0x08,0x28,0x28,0x28,0x28,0x28,0x08,0x08,0x08,0x08,0x08,0x08,
+0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xa0,0x10,0x10,0x10,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x04,0x04,0x04,0x04,
+0x04,0x04,0x04,0x04,0x04,0x04,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x41,0x41,0x41,
+0x41,0x41,0x41,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x10,0x10,0x10,0x10,0x10,0x10,0x42,0x42,0x42,
+0x42,0x42,0x42,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x10,0x10,0x10,0x10,0x08,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa0,0x10,0x10,0x10,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
+0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
+0x01,0x01,0x01,0x10,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02,0x02,0x02,0x02,0x02,
+0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
+0x02,0x02,0x02,0x10,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x20,0x09,0x0d,0x0a,
+0x00,0x00,0x00,0x00,0x80,0x01,0x03,0x1c,0x00,0x00,0x00,0x00,0x43,0x6e,0x73,0x64,
+0x31,0x00,0x00,0x00,0x68,0x65,0x6c,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x72,0x34,0x00,0x00,0x77,0x34,0x00,0x00,0x64,0x62,0x67,0x00,0x72,0x61,0x63,0x74,
+0x72,0x6c,0x00,0x00,0x73,0x79,0x73,0x64,0x00,0x00,0x00,0x00,0x73,0x79,0x73,0x63,
+0x74,0x72,0x6c,0x00,0x74,0x78,0x74,0x62,0x6c,0x00,0x00,0x00,0x70,0x72,0x61,0x6e,
+0x67,0x65,0x00,0x00,0x64,0x6d,0x00,0x00,0x75,0x6e,0x6b,0x6e,0x6f,0x77,0x00,0x00,
+0x80,0x01,0x03,0x34,0x80,0x01,0x03,0x3c,0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x80,0x00,0x24,0x5c,0x80,0x01,0x03,0x40,0x80,0x01,0x03,0x3c,
+0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x25,0xbc,
+0x80,0x01,0x03,0x44,0x80,0x01,0x03,0x3c,0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x80,0x00,0x27,0x38,0x80,0x01,0x03,0x48,0x80,0x01,0x03,0x3c,
+0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x29,0x04,
+0x80,0x01,0x03,0x4c,0x80,0x01,0x03,0x3c,0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x80,0x00,0x29,0xdc,0x80,0x01,0x03,0x54,0x80,0x01,0x03,0x3c,
+0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x29,0xe4,
+0x80,0x01,0x03,0x5c,0x80,0x01,0x03,0x3c,0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x80,0x00,0x29,0xec,0x80,0x01,0x03,0x64,0x80,0x01,0x03,0x3c,
+0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x29,0xf4,
+0x80,0x01,0x03,0x6c,0x80,0x01,0x03,0x3c,0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,
+0x00,0x00,0x00,0x00,0x80,0x00,0x2b,0x80,0x80,0x01,0x03,0x74,0x80,0x01,0x03,0x3c,
+0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x80,0x00,0x2b,0xf4,
+0x80,0x01,0x03,0x78,0x80,0x01,0x03,0x3c,0x80,0x01,0x03,0x3c,0x00,0x00,0x00,0x0f,
+0x00,0x00,0x00,0x01,0x80,0x00,0x2c,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x0a,0x0d,0x52,0x54,0x4c,0x38,0x31,0x39,0x58,0x2d,0x25,0x64,0x3e,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x52,0x54,0x4c,0x38,0x31,0x39,0x58,0x2d,0x25,0x64,0x3e,0x0a,
+0x0d,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2a,0x00,0x00,0x00,0x0a,0x0d,0x45,0x72,
+0x72,0x20,0x44,0x49,0x52,0x00,0x00,0x00,0x0a,0x0d,0x44,0x42,0x47,0x20,0x43,0x4d,
+0x44,0x73,0x3a,0x00,0x0a,0x0d,0x5b,0x00,0x5d,0x2d,0x00,0x00,0x0a,0x0d,0x3c,0x31,
+0x2e,0x43,0x4d,0x4e,0x3e,0x20,0x3c,0x32,0x2e,0x3f,0x3e,0x00,0x0a,0x0d,0x20,0x79,
+0x65,0x61,0x72,0x2d,0x64,0x61,0x79,0x2d,0x68,0x6f,0x75,0x72,0x2d,0x6d,0x69,0x6e,
+0x2d,0x73,0x65,0x63,0x2d,0x31,0x30,0x6d,0x73,0x3d,0x00,0x00,0x25,0x64,0x2d,0x00,
+0x0a,0x0d,0x09,0x20,0x20,0x20,0x20,0x20,0x30,0x30,0x20,0x20,0x20,0x20,0x20,0x20,
+0x20,0x30,0x34,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x30,0x38,0x20,0x20,0x20,0x20,
+0x20,0x20,0x20,0x30,0x43,0x00,0x00,0x00,0x0a,0x0d,0x09,0x20,0x20,0x20,0x20,0x20,
+0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,
+0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,0x3d,
+0x3d,0x3d,0x3d,0x00,0x0d,0x0a,0x20,0x30,0x78,0x25,0x30,0x38,0x58,0x20,0x20,0x00,
+0x09,0x00,0x00,0x00,0x25,0x30,0x38,0x58,0x20,0x00,0x00,0x00,0x0a,0x0d,0x44,0x62,
+0x67,0x5f,0x46,0x6c,0x61,0x67,0x25,0x64,0x3d,0x30,0x78,0x25,0x30,0x38,0x78,0x00,
+0x0a,0x0d,0x54,0x58,0x4c,0x4c,0x54,0x09,0x09,0x4e,0x45,0x58,0x54,0x20,0x20,0x20,
+0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x4e,0x45,0x58,0x54,0x0a,0x0d,0x00,
+0x0a,0x0d,0x20,0x50,0x61,0x67,0x65,0x25,0x33,0x64,0x09,0x00,0x25,0x34,0x64,0x20,
+0x20,0x20,0x20,0x00,0x25,0x34,0x64,0x20,0x20,0x20,0x20,0x09,0x00,0x00,0x00,0x00,
+0x0a,0x0d,0x54,0x58,0x4f,0x51,0x54,0x09,0x09,0x48,0x65,0x61,0x64,0x20,0x20,0x20,
+0x20,0x54,0x61,0x69,0x6c,0x20,0x20,0x20,0x20,0x48,0x65,0x61,0x64,0x20,0x20,0x20,
+0x20,0x54,0x61,0x69,0x6c,0x0a,0x0d,0x00,0x0a,0x0d,0x55,0x6e,0x6b,0x6e,0x6f,0x77,
+0x20,0x63,0x6f,0x6d,0x6d,0x61,0x6e,0x64,0x00,0x00,0x00,0x00,0x0a,0x0d,0x45,0x72,
+0x72,0x20,0x41,0x72,0x67,0x0a,0x0d,0x55,0x53,0x41,0x47,0x45,0x3a,0x00,0x00,0x00,
+0x10,0x00,0x08,0x00,0x02,0xe9,0x01,0x74,0x02,0xab,0x01,0xc7,0x01,0x55,0x00,0xe4,
+0x00,0xab,0x00,0x72,0x00,0x55,0x00,0x4c,0x00,0x4c,0x00,0x4c,0x00,0x4c,0x00,0x4c,
+0x02,0x76,0x01,0x3b,0x00,0xd2,0x00,0x9e,0x00,0x69,0x00,0x4f,0x00,0x46,0x00,0x3f,
+0x01,0x3b,0x00,0x9e,0x00,0x69,0x00,0x4f,0x00,0x35,0x00,0x27,0x00,0x23,0x00,0x20,
+0x01,0x2f,0x00,0x98,0x00,0x65,0x00,0x4c,0x00,0x33,0x00,0x26,0x00,0x22,0x00,0x1e,
+0x00,0x98,0x00,0x4c,0x00,0x33,0x00,0x26,0x00,0x19,0x00,0x13,0x00,0x11,0x00,0x0f,
+0x02,0x39,0x01,0x1c,0x00,0xbd,0x00,0x8e,0x00,0x5f,0x00,0x47,0x00,0x3f,0x00,0x39,
+0x01,0x1c,0x00,0x8e,0x00,0x5f,0x00,0x47,0x00,0x2f,0x00,0x23,0x00,0x20,0x00,0x1c,
+0x01,0x11,0x00,0x89,0x00,0x5b,0x00,0x44,0x00,0x2e,0x00,0x22,0x00,0x1e,0x00,0x1b,
+0x00,0x89,0x00,0x44,0x00,0x2e,0x00,0x22,0x00,0x17,0x00,0x11,0x00,0x0f,0x00,0x0e,
+0x02,0xab,0x02,0xab,0x02,0x66,0x02,0x66,0x07,0x06,0x06,0x06,0x05,0x06,0x07,0x08,
+0x04,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0b,0x49,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x54,0x4c,0x42,0x4d,0x4f,0x44,0x00,0x00,0x00,0x00,0x54,0x4c,0x42,0x4c,
+0x5f,0x64,0x61,0x74,0x61,0x00,0x54,0x4c,0x42,0x53,0x00,0x00,0x00,0x00,0x00,0x00,
+0x41,0x64,0x45,0x4c,0x5f,0x64,0x61,0x74,0x61,0x00,0x41,0x64,0x45,0x53,0x00,0x00,
+0x00,0x00,0x00,0x00,0x45,0x78,0x63,0x43,0x6f,0x64,0x65,0x36,0x00,0x00,0x45,0x78,
+0x63,0x43,0x6f,0x64,0x65,0x37,0x00,0x00,0x53,0x79,0x73,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x42,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x49,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x70,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x4f,0x76,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x80,0x01,0x14,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,
+0x00,0x00,0x00,0x2c,0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x48,
+0x00,0x00,0x00,0x60,0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xc0,0x00,0x00,0x01,0x20,
+0x00,0x00,0x01,0x80,0x00,0x00,0x01,0xb0,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x68,
+0x00,0x00,0x00,0x9c,0x00,0x00,0x00,0xd0,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0xa0,
+0x00,0x00,0x01,0xd4,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xd0,
+0x00,0x00,0x01,0x38,0x00,0x00,0x01,0xa0,0x00,0x00,0x02,0x6f,0x00,0x00,0x03,0x40,
+0x00,0x00,0x03,0xa8,0x00,0x00,0x04,0x10,0x01,0x01,0x01,0x02,0x01,0x01,0x02,0x02,
+0x03,0x03,0x04,0x04,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x02,0x03,0x03,0x04,
+0x05,0x06,0x07,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3c,0x4e,0x55,0x4c,0x4c,0x3e,0x00,0x00,0x30,0x31,0x32,0x33,
+0x34,0x35,0x36,0x37,0x38,0x39,0x61,0x62,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6a,
+0x6b,0x6c,0x6d,0x6e,0x6f,0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77,0x78,0x79,0x7a,
+0x00,0x00,0x00,0x00,0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x41,0x42,
+0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4a,0x4b,0x4c,0x4d,0x4e,0x4f,0x50,0x51,0x52,
+0x53,0x54,0x55,0x56,0x57,0x58,0x59,0x5a,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x5b,0x52,0x58,0x5d,0x20,0x70,0x6b,0x74,0x5f,0x6c,0x65,0x6e,
+0x3d,0x25,0x64,0x20,0x6f,0x66,0x66,0x73,0x65,0x74,0x3d,0x25,0x64,0x20,0x73,0x74,
+0x61,0x72,0x74,0x5f,0x61,0x64,0x64,0x72,0x3d,0x25,0x30,0x38,0x78,0x0a,0x0d,0x00,
+0x00,0x00,0x00,0x00,0x80,0x00,0x07,0x6c,0x80,0x00,0x07,0x80,0x80,0x00,0x07,0x80,
+0x80,0x00,0x07,0x70,0x80,0x00,0x07,0x70,0x80,0x00,0x07,0x94,0x80,0x00,0x76,0x50,
+0x80,0x00,0x76,0xa4,0x80,0x00,0x76,0xc0,0x80,0x00,0x77,0xac,0x80,0x00,0x78,0x64,
+0x80,0x00,0x79,0x10,0x80,0x00,0x79,0x7c,0x80,0x00,0x7a,0x88,0x80,0x00,0x7a,0xbc,
+0x80,0x00,0x7a,0xd0,0x80,0x00,0x7a,0xe4,0x80,0x00,0x7b,0x90,0x80,0x00,0x7b,0xcc,
+0x80,0x00,0x7c,0x7c,0x80,0x00,0x7c,0xa4,0x80,0x00,0x76,0x0c,0x80,0x00,0x7c,0xe8,
+0x80,0x00,0x83,0x74,0x80,0x00,0x83,0xec,0x80,0x00,0x83,0xf8,0x80,0x00,0x84,0x04,
+0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,
+0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,
+0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,0x80,0x00,0x83,0x8c,
+0x80,0x00,0x84,0x10,0x80,0x00,0x84,0x1c,0x80,0x00,0x84,0x28,0x80,0x00,0xa6,0xb4,
+0x80,0x00,0xa6,0xb4,0x80,0x00,0xa6,0xb4,0x80,0x00,0xa6,0xe8,0x80,0x00,0xa7,0x28,
+0x80,0x00,0xa7,0x60,0x80,0x00,0xa7,0x90,0x80,0x00,0xa7,0xc0,0x80,0x00,0xa7,0xd4,
+0x80,0x00,0xa8,0x3c,0x80,0x00,0xa8,0x50,0x80,0x00,0xa8,0x8c,0x80,0x00,0xa8,0x94,
+0x80,0x00,0xa8,0xd0,0x80,0x00,0xa8,0xe4,0x80,0x00,0xa8,0xec,0x80,0x00,0xa8,0xf4,
+0x80,0x00,0xa8,0xf4,0x80,0x00,0xa8,0xf4,0x80,0x00,0xa8,0xf4,0x80,0x00,0xa9,0x24,
+0x80,0x00,0xa9,0x38,0x80,0x00,0xa9,0x4c,0x80,0x00,0xa5,0xf8,0x80,0x00,0xac,0x78,
+0x80,0x00,0xac,0x78,0x80,0x00,0xac,0x78,0x80,0x00,0xac,0xac,0x80,0x00,0xac,0xec,
+0x80,0x00,0xad,0x24,0x80,0x00,0xad,0x54,0x80,0x00,0xad,0x84,0x80,0x00,0xad,0x98,
+0x80,0x00,0xae,0x00,0x80,0x00,0xae,0x14,0x80,0x00,0xae,0x50,0x80,0x00,0xae,0x58,
+0x80,0x00,0xae,0x94,0x80,0x00,0xae,0xa8,0x80,0x00,0xae,0xb0,0x80,0x00,0xae,0xb8,
+0x80,0x00,0xae,0xb8,0x80,0x00,0xae,0xb8,0x80,0x00,0xae,0xb8,0x80,0x00,0xae,0xe8,
+0x80,0x00,0xae,0xfc,0x80,0x00,0xaf,0x10,0x80,0x00,0xaa,0x98,0x80,0x00,0xbc,0x64,
+0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x6c,0x80,0x00,0xbc,0x7c,
+0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x7c,
+0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x74,0x80,0x00,0xbc,0x7c,
+0x80,0x00,0xbc,0x5c,0x80,0x00,0xbc,0x7c,0x80,0x00,0xbc,0x7c,0x80,0x00,0xc0,0xa4,
+0x80,0x00,0xbd,0x94,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbd,0xa0,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbd,0x28,0x80,0x00,0xbe,0x74,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbe,0x74,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbe,0x7c,0x80,0x00,0xbe,0x9c,0x80,0x00,0xbe,0xa4,
+0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbe,0xfc,0x80,0x00,0xbf,0xac,
+0x80,0x00,0xbd,0xa8,0x80,0x00,0xbf,0xac,0x80,0x00,0xbf,0xac,0x80,0x00,0xbd,0xa4,
+};
+
+
+u32 Rtl8190PciPHY_REGArray[PHY_REGArrayLengthPci] = {
+0x800,0x00050060,
+0x804,0x00000005,
+0x808,0x0000fc00,
+0x80c,0x0000001c,
+0x810,0x801010aa,
+0x814,0x000908c0,
+0x818,0x00000000,
+0x81c,0x00000000,
+0x820,0x00000004,
+0x824,0x00690000,
+0x828,0x00000004,
+0x82c,0x00e90000,
+0x830,0x00000004,
+0x834,0x00690000,
+0x838,0x00000004,
+0x83c,0x00e90000,
+0x840,0x00000000,
+0x844,0x00000000,
+0x848,0x00000000,
+0x84c,0x00000000,
+0x850,0x00000000,
+0x854,0x00000000,
+0x858,0x65a965a9,
+0x85c,0x65a965a9,
+0x860,0x001f0010,
+0x864,0x007f0010,
+0x868,0x001f0010,
+0x86c,0x007f0010,
+0x870,0x0f100f70,
+0x874,0x0f100f70,
+0x878,0x00000000,
+0x87c,0x00000000,
+0x880,0x5c385eb8,
+0x884,0x6357060d,
+0x888,0x0460c341,
+0x88c,0x0000ff00,
+0x890,0x00000000,
+0x894,0xfffffffe,
+0x898,0x4c42382f,
+0x89c,0x00656056,
+0x8b0,0x00000000,
+0x8e0,0x00000000,
+0x8e4,0x00000000,
+0x900,0x00000000,
+0x904,0x00000023,
+0x908,0x00000000,
+0x90c,0x35541545,
+0xa00,0x00d0c7d8,
+0xa04,0xab1f0008,
+0xa08,0x80cd8300,
+0xa0c,0x2e62740f,
+0xa10,0x95009b78,
+0xa14,0x11145008,
+0xa18,0x00881117,
+0xa1c,0x89140fa0,
+0xa20,0x1a1b0000,
+0xa24,0x090e1317,
+0xa28,0x00000204,
+0xa2c,0x00000000,
+0xc00,0x00000040,
+0xc04,0x0000500f,
+0xc08,0x000000e4,
+0xc0c,0x6c6c6c6c,
+0xc10,0x08000000,
+0xc14,0x40000100,
+0xc18,0x08000000,
+0xc1c,0x40000100,
+0xc20,0x08000000,
+0xc24,0x40000100,
+0xc28,0x08000000,
+0xc2c,0x40000100,
+0xc30,0x6de9ac44,
+0xc34,0x164052cd,
+0xc38,0x00070a14,
+0xc3c,0x0a969764,
+0xc40,0x1f7c403f,
+0xc44,0x000100b7,
+0xc48,0xec020000,
+0xc4c,0x00000300,
+0xc50,0x69543420,
+0xc54,0x433c0094,
+0xc58,0x69543420,
+0xc5c,0x433c0094,
+0xc60,0x69543420,
+0xc64,0x433c0094,
+0xc68,0x69543420,
+0xc6c,0x433c0094,
+0xc70,0x2c7f000d,
+0xc74,0x0186175b,
+0xc78,0x0000001f,
+0xc7c,0x00b91612,
+0xc80,0x40000100,
+0xc84,0x00000000,
+0xc88,0x40000100,
+0xc8c,0x08000000,
+0xc90,0x40000100,
+0xc94,0x00000000,
+0xc98,0x40000100,
+0xc9c,0x00000000,
+0xca0,0x00492492,
+0xca4,0x00000000,
+0xca8,0x00000000,
+0xcac,0x00000000,
+0xcb0,0x00000000,
+0xcb4,0x00000000,
+0xcb8,0x00000000,
+0xcbc,0x00492492,
+0xcc0,0x00000000,
+0xcc4,0x00000000,
+0xcc8,0x00000000,
+0xccc,0x00000000,
+0xcd0,0x00000000,
+0xcd4,0x00000000,
+0xcd8,0x64b22427,
+0xcdc,0x00766932,
+0xce0,0x00222222,
+0xd00,0x00000740,
+0xd04,0x0000040f,
+0xd08,0x0000803f,
+0xd0c,0x00000001,
+0xd10,0xa0633333,
+0xd14,0x33333c63,
+0xd18,0x6a8f5b6b,
+0xd1c,0x00000000,
+0xd20,0x00000000,
+0xd24,0x00000000,
+0xd28,0x00000000,
+0xd2c,0xcc979975,
+0xd30,0x00000000,
+0xd34,0x00000000,
+0xd38,0x00000000,
+0xd3c,0x00027293,
+0xd40,0x00000000,
+0xd44,0x00000000,
+0xd48,0x00000000,
+0xd4c,0x00000000,
+0xd50,0x6437140a,
+0xd54,0x024dbd02,
+0xd58,0x00000000,
+0xd5c,0x14032064,
+};
+
+u32 Rtl8190PciPHY_REG_1T2RArray[PHY_REG_1T2RArrayLengthPci] = {
+0x800,0x00050060,
+0x804,0x00000004,
+0x808,0x0000fc00,
+0x80c,0x0000001c,
+0x810,0x801010aa,
+0x814,0x000908c0,
+0x818,0x00000000,
+0x81c,0x00000000,
+0x820,0x00000004,
+0x824,0x00690000,
+0x828,0x00000004,
+0x82c,0x00e90000,
+0x830,0x00000004,
+0x834,0x00690000,
+0x838,0x00000004,
+0x83c,0x00e90000,
+0x840,0x00000000,
+0x844,0x00000000,
+0x848,0x00000000,
+0x84c,0x00000000,
+0x850,0x00000000,
+0x854,0x00000000,
+0x858,0x65a965a9,
+0x85c,0x65a965a9,
+0x860,0x001f0000,
+0x864,0x007f0000,
+0x868,0x001f0010,
+0x86c,0x007f0010,
+0x870,0x0f100f70,
+0x874,0x0f100f70,
+0x878,0x00000000,
+0x87c,0x00000000,
+0x880,0x5c385898,
+0x884,0x6357060d,
+0x888,0x0460c341,
+0x88c,0x0000fc00,
+0x890,0x00000000,
+0x894,0xfffffffe,
+0x898,0x4c42382f,
+0x89c,0x00656056,
+0x8b0,0x00000000,
+0x8e0,0x00000000,
+0x8e4,0x00000000,
+0x900,0x00000000,
+0x904,0x00000023,
+0x908,0x00000000,
+0x90c,0x34441444,
+0xa00,0x00d0c7d8,
+0xa04,0x2b1f0008,
+0xa08,0x80cd8300,
+0xa0c,0x2e62740f,
+0xa10,0x95009b78,
+0xa14,0x11145008,
+0xa18,0x00881117,
+0xa1c,0x89140fa0,
+0xa20,0x1a1b0000,
+0xa24,0x090e1317,
+0xa28,0x00000204,
+0xa2c,0x00000000,
+0xc00,0x00000040,
+0xc04,0x0000500c,
+0xc08,0x000000e4,
+0xc0c,0x6c6c6c6c,
+0xc10,0x08000000,
+0xc14,0x40000100,
+0xc18,0x08000000,
+0xc1c,0x40000100,
+0xc20,0x08000000,
+0xc24,0x40000100,
+0xc28,0x08000000,
+0xc2c,0x40000100,
+0xc30,0x6de9ac44,
+0xc34,0x164052cd,
+0xc38,0x00070a14,
+0xc3c,0x0a969764,
+0xc40,0x1f7c403f,
+0xc44,0x000100b7,
+0xc48,0xec020000,
+0xc4c,0x00000300,
+0xc50,0x69543420,
+0xc54,0x433c0094,
+0xc58,0x69543420,
+0xc5c,0x433c0094,
+0xc60,0x69543420,
+0xc64,0x433c0094,
+0xc68,0x69543420,
+0xc6c,0x433c0094,
+0xc70,0x2c7f000d,
+0xc74,0x0186175b,
+0xc78,0x0000001f,
+0xc7c,0x00b91612,
+0xc80,0x40000100,
+0xc84,0x00000000,
+0xc88,0x40000100,
+0xc8c,0x08000000,
+0xc90,0x40000100,
+0xc94,0x00000000,
+0xc98,0x40000100,
+0xc9c,0x00000000,
+0xca0,0x00492492,
+0xca4,0x00000000,
+0xca8,0x00000000,
+0xcac,0x00000000,
+0xcb0,0x00000000,
+0xcb4,0x00000000,
+0xcb8,0x00000000,
+0xcbc,0x00492492,
+0xcc0,0x00000000,
+0xcc4,0x00000000,
+0xcc8,0x00000000,
+0xccc,0x00000000,
+0xcd0,0x00000000,
+0xcd4,0x00000000,
+0xcd8,0x64b22427,
+0xcdc,0x00766932,
+0xce0,0x00222222,
+0xd00,0x00000740,
+0xd04,0x0000040c,
+0xd08,0x0000803f,
+0xd0c,0x00000001,
+0xd10,0xa0633333,
+0xd14,0x33333c63,
+0xd18,0x6a8f5b6b,
+0xd1c,0x00000000,
+0xd20,0x00000000,
+0xd24,0x00000000,
+0xd28,0x00000000,
+0xd2c,0xcc979975,
+0xd30,0x00000000,
+0xd34,0x00000000,
+0xd38,0x00000000,
+0xd3c,0x00027293,
+0xd40,0x00000000,
+0xd44,0x00000000,
+0xd48,0x00000000,
+0xd4c,0x00000000,
+0xd50,0x6437140a,
+0xd54,0x024dbd02,
+0xd58,0x00000000,
+0xd5c,0x14032064,
+};
+
+u32 Rtl8190PciRadioA_Array[RadioA_ArrayLengthPci] = {
+0x019,0x00000003,
+0x000,0x000000bf,
+0x001,0x00000ee0,
+0x002,0x0000004c,
+0x003,0x000007f1,
+0x004,0x00000975,
+0x005,0x00000c58,
+0x006,0x00000ae6,
+0x007,0x000000ca,
+0x008,0x00000e1c,
+0x009,0x000007f0,
+0x00a,0x000009d0,
+0x00b,0x000001ba,
+0x00c,0x00000240,
+0x00e,0x00000020,
+0x00f,0x00000990,
+0x012,0x00000806,
+0x014,0x000005ab,
+0x015,0x00000f80,
+0x016,0x00000020,
+0x017,0x00000597,
+0x018,0x0000050a,
+0x01a,0x00000f80,
+0x01b,0x00000f5e,
+0x01c,0x00000008,
+0x01d,0x00000607,
+0x01e,0x000006cc,
+0x01f,0x00000000,
+0x020,0x000001a5,
+0x01f,0x00000001,
+0x020,0x00000165,
+0x01f,0x00000002,
+0x020,0x000000c6,
+0x01f,0x00000003,
+0x020,0x00000086,
+0x01f,0x00000004,
+0x020,0x00000046,
+0x01f,0x00000005,
+0x020,0x000001e6,
+0x01f,0x00000006,
+0x020,0x000001a6,
+0x01f,0x00000007,
+0x020,0x00000166,
+0x01f,0x00000008,
+0x020,0x000000c7,
+0x01f,0x00000009,
+0x020,0x00000087,
+0x01f,0x0000000a,
+0x020,0x000000f7,
+0x01f,0x0000000b,
+0x020,0x000000d7,
+0x01f,0x0000000c,
+0x020,0x000000b7,
+0x01f,0x0000000d,
+0x020,0x00000097,
+0x01f,0x0000000e,
+0x020,0x00000077,
+0x01f,0x0000000f,
+0x020,0x00000057,
+0x01f,0x00000010,
+0x020,0x00000037,
+0x01f,0x00000011,
+0x020,0x000000fb,
+0x01f,0x00000012,
+0x020,0x000000db,
+0x01f,0x00000013,
+0x020,0x000000bb,
+0x01f,0x00000014,
+0x020,0x000000ff,
+0x01f,0x00000015,
+0x020,0x000000e3,
+0x01f,0x00000016,
+0x020,0x000000c3,
+0x01f,0x00000017,
+0x020,0x000000a3,
+0x01f,0x00000018,
+0x020,0x00000083,
+0x01f,0x00000019,
+0x020,0x00000063,
+0x01f,0x0000001a,
+0x020,0x00000043,
+0x01f,0x0000001b,
+0x020,0x00000023,
+0x01f,0x0000001c,
+0x020,0x00000003,
+0x01f,0x0000001d,
+0x020,0x000001e3,
+0x01f,0x0000001e,
+0x020,0x000001c3,
+0x01f,0x0000001f,
+0x020,0x000001a3,
+0x01f,0x00000020,
+0x020,0x00000183,
+0x01f,0x00000021,
+0x020,0x00000163,
+0x01f,0x00000022,
+0x020,0x00000143,
+0x01f,0x00000023,
+0x020,0x00000123,
+0x01f,0x00000024,
+0x020,0x00000103,
+0x023,0x00000203,
+0x024,0x00000200,
+0x00b,0x000001ba,
+0x02c,0x000003d7,
+0x02d,0x00000ff0,
+0x000,0x00000037,
+0x004,0x00000160,
+0x007,0x00000080,
+0x002,0x0000088d,
+0x0fe,0x00000000,
+0x0fe,0x00000000,
+0x016,0x00000200,
+0x016,0x00000380,
+0x016,0x00000020,
+0x016,0x000001a0,
+0x000,0x000000bf,
+0x00d,0x0000001f,
+0x00d,0x00000c9f,
+0x002,0x0000004d,
+0x000,0x00000cbf,
+0x004,0x00000975,
+0x007,0x00000700,
+};
+
+u32 Rtl8190PciRadioB_Array[RadioB_ArrayLengthPci] = {
+0x019,0x00000003,
+0x000,0x000000bf,
+0x001,0x000006e0,
+0x002,0x0000004c,
+0x003,0x000007f1,
+0x004,0x00000975,
+0x005,0x00000c58,
+0x006,0x00000ae6,
+0x007,0x000000ca,
+0x008,0x00000e1c,
+0x000,0x000000b7,
+0x00a,0x00000850,
+0x000,0x000000bf,
+0x00b,0x000001ba,
+0x00c,0x00000240,
+0x00e,0x00000020,
+0x015,0x00000f80,
+0x016,0x00000020,
+0x017,0x00000597,
+0x018,0x0000050a,
+0x01a,0x00000e00,
+0x01b,0x00000f5e,
+0x01d,0x00000607,
+0x01e,0x000006cc,
+0x00b,0x000001ba,
+0x023,0x00000203,
+0x024,0x00000200,
+0x000,0x00000037,
+0x004,0x00000160,
+0x016,0x00000200,
+0x016,0x00000380,
+0x016,0x00000020,
+0x016,0x000001a0,
+0x00d,0x00000ccc,
+0x000,0x000000bf,
+0x002,0x0000004d,
+0x000,0x00000cbf,
+0x004,0x00000975,
+0x007,0x00000700,
+};
+
+u32 Rtl8190PciRadioC_Array[RadioC_ArrayLengthPci] = {
+0x019,0x00000003,
+0x000,0x000000bf,
+0x001,0x00000ee0,
+0x002,0x0000004c,
+0x003,0x000007f1,
+0x004,0x00000975,
+0x005,0x00000c58,
+0x006,0x00000ae6,
+0x007,0x000000ca,
+0x008,0x00000e1c,
+0x009,0x000007f0,
+0x00a,0x000009d0,
+0x00b,0x000001ba,
+0x00c,0x00000240,
+0x00e,0x00000020,
+0x00f,0x00000990,
+0x012,0x00000806,
+0x014,0x000005ab,
+0x015,0x00000f80,
+0x016,0x00000020,
+0x017,0x00000597,
+0x018,0x0000050a,
+0x01a,0x00000f80,
+0x01b,0x00000f5e,
+0x01c,0x00000008,
+0x01d,0x00000607,
+0x01e,0x000006cc,
+0x01f,0x00000000,
+0x020,0x000001a5,
+0x01f,0x00000001,
+0x020,0x00000165,
+0x01f,0x00000002,
+0x020,0x000000c6,
+0x01f,0x00000003,
+0x020,0x00000086,
+0x01f,0x00000004,
+0x020,0x00000046,
+0x01f,0x00000005,
+0x020,0x000001e6,
+0x01f,0x00000006,
+0x020,0x000001a6,
+0x01f,0x00000007,
+0x020,0x00000166,
+0x01f,0x00000008,
+0x020,0x000000c7,
+0x01f,0x00000009,
+0x020,0x00000087,
+0x01f,0x0000000a,
+0x020,0x000000f7,
+0x01f,0x0000000b,
+0x020,0x000000d7,
+0x01f,0x0000000c,
+0x020,0x000000b7,
+0x01f,0x0000000d,
+0x020,0x00000097,
+0x01f,0x0000000e,
+0x020,0x00000077,
+0x01f,0x0000000f,
+0x020,0x00000057,
+0x01f,0x00000010,
+0x020,0x00000037,
+0x01f,0x00000011,
+0x020,0x000000fb,
+0x01f,0x00000012,
+0x020,0x000000db,
+0x01f,0x00000013,
+0x020,0x000000bb,
+0x01f,0x00000014,
+0x020,0x000000ff,
+0x01f,0x00000015,
+0x020,0x000000e3,
+0x01f,0x00000016,
+0x020,0x000000c3,
+0x01f,0x00000017,
+0x020,0x000000a3,
+0x01f,0x00000018,
+0x020,0x00000083,
+0x01f,0x00000019,
+0x020,0x00000063,
+0x01f,0x0000001a,
+0x020,0x00000043,
+0x01f,0x0000001b,
+0x020,0x00000023,
+0x01f,0x0000001c,
+0x020,0x00000003,
+0x01f,0x0000001d,
+0x020,0x000001e3,
+0x01f,0x0000001e,
+0x020,0x000001c3,
+0x01f,0x0000001f,
+0x020,0x000001a3,
+0x01f,0x00000020,
+0x020,0x00000183,
+0x01f,0x00000021,
+0x020,0x00000163,
+0x01f,0x00000022,
+0x020,0x00000143,
+0x01f,0x00000023,
+0x020,0x00000123,
+0x01f,0x00000024,
+0x020,0x00000103,
+0x023,0x00000203,
+0x024,0x00000200,
+0x00b,0x000001ba,
+0x02c,0x000003d7,
+0x02d,0x00000ff0,
+0x000,0x00000037,
+0x004,0x00000160,
+0x007,0x00000080,
+0x002,0x0000088d,
+0x0fe,0x00000000,
+0x0fe,0x00000000,
+0x016,0x00000200,
+0x016,0x00000380,
+0x016,0x00000020,
+0x016,0x000001a0,
+0x000,0x000000bf,
+0x00d,0x0000001f,
+0x00d,0x00000c9f,
+0x002,0x0000004d,
+0x000,0x00000cbf,
+0x004,0x00000975,
+0x007,0x00000700,
+};
+
+u32 Rtl8190PciRadioD_Array[RadioD_ArrayLengthPci] = {
+0x019,0x00000003,
+0x000,0x000000bf,
+0x001,0x000006e0,
+0x002,0x0000004c,
+0x003,0x000007f1,
+0x004,0x00000975,
+0x005,0x00000c58,
+0x006,0x00000ae6,
+0x007,0x000000ca,
+0x008,0x00000e1c,
+0x000,0x000000b7,
+0x00a,0x00000850,
+0x000,0x000000bf,
+0x00b,0x000001ba,
+0x00c,0x00000240,
+0x00e,0x00000020,
+0x015,0x00000f80,
+0x016,0x00000020,
+0x017,0x00000597,
+0x018,0x0000050a,
+0x01a,0x00000e00,
+0x01b,0x00000f5e,
+0x01d,0x00000607,
+0x01e,0x000006cc,
+0x00b,0x000001ba,
+0x023,0x00000203,
+0x024,0x00000200,
+0x000,0x00000037,
+0x004,0x00000160,
+0x016,0x00000200,
+0x016,0x00000380,
+0x016,0x00000020,
+0x016,0x000001a0,
+0x00d,0x00000ccc,
+0x000,0x000000bf,
+0x002,0x0000004d,
+0x000,0x00000cbf,
+0x004,0x00000975,
+0x007,0x00000700,
+};
+
+u32 Rtl8190PciMACPHY_Array[] = {
+0x03c,0xffff0000,0x00000f0f,
+0x340,0xffffffff,0x161a1a1a,
+0x344,0xffffffff,0x12121416,
+0x348,0x0000ffff,0x00001818,
+0x12c,0xffffffff,0x04000802,
+0x318,0x00000fff,0x00000800,
+};
+
+u32 Rtl8190PciMACPHY_Array_PG[] = {
+0x03c,0xffff0000,0x00000f0f,
+0x340,0xffffffff,0x0a0c0d0f,
+0x344,0xffffffff,0x06070809,
+0x344,0xffffffff,0x06070809,
+0x348,0x0000ffff,0x00000000,
+0x12c,0xffffffff,0x04000802,
+0x318,0x00000fff,0x00000800,
+};
+
+u32 Rtl8190PciAGCTAB_Array[AGCTAB_ArrayLengthPci] = {
+0xc78,0x7d000001,
+0xc78,0x7d010001,
+0xc78,0x7d020001,
+0xc78,0x7d030001,
+0xc78,0x7c040001,
+0xc78,0x7b050001,
+0xc78,0x7a060001,
+0xc78,0x79070001,
+0xc78,0x78080001,
+0xc78,0x77090001,
+0xc78,0x760a0001,
+0xc78,0x750b0001,
+0xc78,0x740c0001,
+0xc78,0x730d0001,
+0xc78,0x720e0001,
+0xc78,0x710f0001,
+0xc78,0x70100001,
+0xc78,0x6f110001,
+0xc78,0x6e120001,
+0xc78,0x6d130001,
+0xc78,0x6c140001,
+0xc78,0x6b150001,
+0xc78,0x6a160001,
+0xc78,0x69170001,
+0xc78,0x68180001,
+0xc78,0x67190001,
+0xc78,0x661a0001,
+0xc78,0x651b0001,
+0xc78,0x641c0001,
+0xc78,0x491d0001,
+0xc78,0x481e0001,
+0xc78,0x471f0001,
+0xc78,0x46200001,
+0xc78,0x45210001,
+0xc78,0x44220001,
+0xc78,0x43230001,
+0xc78,0x28240001,
+0xc78,0x27250001,
+0xc78,0x26260001,
+0xc78,0x25270001,
+0xc78,0x24280001,
+0xc78,0x23290001,
+0xc78,0x222a0001,
+0xc78,0x212b0001,
+0xc78,0x202c0001,
+0xc78,0x0a2d0001,
+0xc78,0x082e0001,
+0xc78,0x062f0001,
+0xc78,0x05300001,
+0xc78,0x04310001,
+0xc78,0x03320001,
+0xc78,0x02330001,
+0xc78,0x01340001,
+0xc78,0x00350001,
+0xc78,0x00360001,
+0xc78,0x00370001,
+0xc78,0x00380001,
+0xc78,0x00390001,
+0xc78,0x003a0001,
+0xc78,0x003b0001,
+0xc78,0x003c0001,
+0xc78,0x003d0001,
+0xc78,0x003e0001,
+0xc78,0x003f0001,
+0xc78,0x7d400001,
+0xc78,0x7d410001,
+0xc78,0x7d420001,
+0xc78,0x7d430001,
+0xc78,0x7c440001,
+0xc78,0x7b450001,
+0xc78,0x7a460001,
+0xc78,0x79470001,
+0xc78,0x78480001,
+0xc78,0x77490001,
+0xc78,0x764a0001,
+0xc78,0x754b0001,
+0xc78,0x744c0001,
+0xc78,0x734d0001,
+0xc78,0x724e0001,
+0xc78,0x714f0001,
+0xc78,0x70500001,
+0xc78,0x6f510001,
+0xc78,0x6e520001,
+0xc78,0x6d530001,
+0xc78,0x6c540001,
+0xc78,0x6b550001,
+0xc78,0x6a560001,
+0xc78,0x69570001,
+0xc78,0x68580001,
+0xc78,0x67590001,
+0xc78,0x665a0001,
+0xc78,0x655b0001,
+0xc78,0x645c0001,
+0xc78,0x495d0001,
+0xc78,0x485e0001,
+0xc78,0x475f0001,
+0xc78,0x46600001,
+0xc78,0x45610001,
+0xc78,0x44620001,
+0xc78,0x43630001,
+0xc78,0x28640001,
+0xc78,0x27650001,
+0xc78,0x26660001,
+0xc78,0x25670001,
+0xc78,0x24680001,
+0xc78,0x23690001,
+0xc78,0x226a0001,
+0xc78,0x216b0001,
+0xc78,0x206c0001,
+0xc78,0x0a6d0001,
+0xc78,0x086e0001,
+0xc78,0x066f0001,
+0xc78,0x05700001,
+0xc78,0x04710001,
+0xc78,0x03720001,
+0xc78,0x02730001,
+0xc78,0x01740001,
+0xc78,0x00750001,
+0xc78,0x00760001,
+0xc78,0x00770001,
+0xc78,0x00780001,
+0xc78,0x00790001,
+0xc78,0x007a0001,
+0xc78,0x007b0001,
+0xc78,0x007c0001,
+0xc78,0x007d0001,
+0xc78,0x007e0001,
+0xc78,0x007f0001,
+0xc78,0x3600001e,
+0xc78,0x3601001e,
+0xc78,0x3602001e,
+0xc78,0x3603001e,
+0xc78,0x3604001e,
+0xc78,0x3605001e,
+0xc78,0x3a06001e,
+0xc78,0x3c07001e,
+0xc78,0x3e08001e,
+0xc78,0x4209001e,
+0xc78,0x430a001e,
+0xc78,0x450b001e,
+0xc78,0x470c001e,
+0xc78,0x480d001e,
+0xc78,0x490e001e,
+0xc78,0x4b0f001e,
+0xc78,0x4c10001e,
+0xc78,0x4d11001e,
+0xc78,0x4d12001e,
+0xc78,0x4e13001e,
+0xc78,0x4f14001e,
+0xc78,0x5015001e,
+0xc78,0x5116001e,
+0xc78,0x5117001e,
+0xc78,0x5218001e,
+0xc78,0x5219001e,
+0xc78,0x531a001e,
+0xc78,0x541b001e,
+0xc78,0x541c001e,
+0xc78,0x551d001e,
+0xc78,0x561e001e,
+0xc78,0x561f001e,
+0xc78,0x5720001e,
+0xc78,0x5821001e,
+0xc78,0x5822001e,
+0xc78,0x5923001e,
+0xc78,0x5924001e,
+0xc78,0x5a25001e,
+0xc78,0x5b26001e,
+0xc78,0x5b27001e,
+0xc78,0x5c28001e,
+0xc78,0x5c29001e,
+0xc78,0x5d2a001e,
+0xc78,0x5d2b001e,
+0xc78,0x5e2c001e,
+0xc78,0x5e2d001e,
+0xc78,0x5f2e001e,
+0xc78,0x602f001e,
+0xc78,0x6030001e,
+0xc78,0x6131001e,
+0xc78,0x6132001e,
+0xc78,0x6233001e,
+0xc78,0x6234001e,
+0xc78,0x6335001e,
+0xc78,0x6336001e,
+0xc78,0x6437001e,
+0xc78,0x6538001e,
+0xc78,0x6639001e,
+0xc78,0x663a001e,
+0xc78,0x673b001e,
+0xc78,0x683c001e,
+0xc78,0x693d001e,
+0xc78,0x6a3e001e,
+0xc78,0x6b3f001e,
+};
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8190P_hwimg.h b/drivers/staging/rtl8192e/r8190P_hwimg.h
new file mode 100644 (file)
index 0000000..18aef43
--- /dev/null
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef __INC_HAL8190Pci_FW_IMG_H
+#define __INC_HAL8190Pci_FW_IMG_H
+
+/*Created on  2008/12/ 3,  3:26*/
+
+#include <linux/types.h>
+
+#define BootArrayLengthPci 344
+extern u8 Rtl8190PciFwBootArray[BootArrayLengthPci];
+#define MainArrayLengthPci 55388
+extern u8 Rtl8190PciFwMainArray[MainArrayLengthPci];
+#define DataArrayLengthPci 2960
+extern u8 Rtl8190PciFwDataArray[DataArrayLengthPci];
+#define PHY_REGArrayLengthPci 280
+extern u32 Rtl8190PciPHY_REGArray[PHY_REGArrayLengthPci];
+#define PHY_REG_1T2RArrayLengthPci 280
+extern u32 Rtl8190PciPHY_REG_1T2RArray[PHY_REG_1T2RArrayLengthPci];
+#define RadioA_ArrayLengthPci 246
+extern u32 Rtl8190PciRadioA_Array[RadioA_ArrayLengthPci] ;
+#define RadioB_ArrayLengthPci 78
+extern u32 Rtl8190PciRadioB_Array[RadioB_ArrayLengthPci] ;
+#define RadioC_ArrayLengthPci 246
+extern u32 Rtl8190PciRadioC_Array[RadioC_ArrayLengthPci] ;
+#define RadioD_ArrayLengthPci 78
+extern u32 Rtl8190PciRadioD_Array[RadioD_ArrayLengthPci] ;
+#define MACPHY_ArrayLengthPci 18
+extern u32 Rtl8190PciMACPHY_Array[MACPHY_ArrayLengthPci] ;
+#define MACPHY_Array_PGLengthPci 21
+extern u32 Rtl8190PciMACPHY_Array_PG[MACPHY_Array_PGLengthPci] ;
+#define AGCTAB_ArrayLengthPci 384
+extern u32 Rtl8190PciAGCTAB_Array[AGCTAB_ArrayLengthPci] ;
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8190P_rtl8256.c b/drivers/staging/rtl8192e/r8190P_rtl8256.c
new file mode 100644 (file)
index 0000000..26709e5
--- /dev/null
@@ -0,0 +1,366 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#include "rtl_core.h"
+#ifdef RTL8192SE
+#include "rtl8192s/r8192S_phyreg.h"
+#include "rtl8192s/r8192S_phy.h"
+#else
+#include "r8192E_phyreg.h"
+#include "r8192E_phy.h"
+#endif
+#include "r8190P_rtl8256.h"
+
+void PHY_SetRF8256Bandwidth(struct net_device* dev , HT_CHANNEL_WIDTH Bandwidth)
+{
+       u8      eRFPath;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       for (eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++) {
+               if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
+                               continue;
+
+               switch (Bandwidth) {
+               case HT_CHANNEL_WIDTH_20:
+                       if (priv->card_8192_version == VERSION_8190_BD || priv->card_8192_version == VERSION_8190_BE) {
+                               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0b, bMask12Bits, 0x100);
+                               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x2c, bMask12Bits, 0x3d7);
+                               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0e, bMask12Bits, 0x021);
+
+                       } else {
+                               RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown hardware version\n");
+                       }
+
+                       break;
+               case HT_CHANNEL_WIDTH_20_40:
+                       if (priv->card_8192_version == VERSION_8190_BD ||priv->card_8192_version == VERSION_8190_BE) {
+                               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0b, bMask12Bits, 0x300);
+                               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x2c, bMask12Bits, 0x3ff);
+                               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, 0x0e, bMask12Bits, 0x0e1);
+
+                       } else {
+                               RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown hardware version\n");
+                       }
+
+
+                       break;
+               default:
+                       RT_TRACE(COMP_ERR, "PHY_SetRF8256Bandwidth(): unknown Bandwidth: %#X\n",Bandwidth );
+                       break;
+
+               }
+       }
+       return;
+}
+
+bool PHY_RF8256_Config(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       bool rtStatus = true;
+       priv->NumTotalRFPath = RTL819X_TOTAL_RF_PATH;
+       rtStatus = phy_RF8256_Config_ParaFile(dev);
+
+       return rtStatus;
+}
+
+bool phy_RF8256_Config_ParaFile(struct net_device* dev)
+{
+       u32     u4RegValue = 0;
+       u8      eRFPath;
+       bool rtStatus = true;
+       BB_REGISTER_DEFINITION_T        *pPhyReg;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32     RegOffSetToBeCheck = 0x3;
+       u32     RegValueToBeCheck = 0x7f1;
+       u32     RF3_Final_Value = 0;
+       u8      ConstRetryTimes = 5, RetryTimes = 5;
+       u8 ret = 0;
+
+       for (eRFPath = (RF90_RADIO_PATH_E)RF90_PATH_A; eRFPath <priv->NumTotalRFPath; eRFPath++) {
+               if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
+                               continue;
+
+               pPhyReg = &priv->PHYRegDef[eRFPath];
+
+
+               switch (eRFPath) {
+               case RF90_PATH_A:
+               case RF90_PATH_C:
+                       u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV);
+                       break;
+               case RF90_PATH_B :
+               case RF90_PATH_D:
+                       u4RegValue = rtl8192_QueryBBReg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16);
+                       break;
+               }
+
+               rtl8192_setBBreg(dev, pPhyReg->rfintfe, bRFSI_RFENV<<16, 0x1);
+
+               rtl8192_setBBreg(dev, pPhyReg->rfintfo, bRFSI_RFENV, 0x1);
+
+               rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireAddressLength, 0x0);
+               rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, b3WireDataLength, 0x0);
+
+               rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E) eRFPath, 0x0, bMask12Bits, 0xbf);
+
+               rtStatus = rtl8192_phy_checkBBAndRF(dev, HW90_BLOCK_RF, (RF90_RADIO_PATH_E)eRFPath);
+               if (rtStatus!= true) {
+                       RT_TRACE(COMP_ERR, "PHY_RF8256_Config():Check Radio[%d] Fail!!\n", eRFPath);
+                       goto phy_RF8256_Config_ParaFile_Fail;
+               }
+
+               RetryTimes = ConstRetryTimes;
+               RF3_Final_Value = 0;
+               switch (eRFPath) {
+               case RF90_PATH_A:
+                       while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
+                               ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
+                               RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
+                               RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
+                               RetryTimes--;
+                       }
+                       break;
+               case RF90_PATH_B:
+                       while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
+                               ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
+                               RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
+                               RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
+                               RetryTimes--;
+                       }
+                       break;
+               case RF90_PATH_C:
+                       while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
+                               ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
+                               RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
+                               RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
+                               RetryTimes--;
+                       }
+                       break;
+               case RF90_PATH_D:
+                       while (RF3_Final_Value!=RegValueToBeCheck && RetryTimes != 0) {
+                               ret = rtl8192_phy_ConfigRFWithHeaderFile(dev,(RF90_RADIO_PATH_E)eRFPath);
+                               RF3_Final_Value = rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, RegOffSetToBeCheck, bMask12Bits);
+                               RT_TRACE(COMP_RF, "RF %d %d register final value: %x\n", eRFPath, RegOffSetToBeCheck, RF3_Final_Value);
+                               RetryTimes--;
+                       }
+                       break;
+               }
+
+               switch (eRFPath) {
+               case RF90_PATH_A:
+               case RF90_PATH_C:
+                       rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV, u4RegValue);
+                       break;
+               case RF90_PATH_B :
+               case RF90_PATH_D:
+                       rtl8192_setBBreg(dev, pPhyReg->rfintfs, bRFSI_RFENV<<16, u4RegValue);
+                       break;
+               }
+
+               if (ret) {
+                       RT_TRACE(COMP_ERR, "phy_RF8256_Config_ParaFile():Radio[%d] Fail!!", eRFPath);
+                       goto phy_RF8256_Config_ParaFile_Fail;
+               }
+
+       }
+
+       RT_TRACE(COMP_PHY, "PHY Initialization Success\n") ;
+       return true;
+
+phy_RF8256_Config_ParaFile_Fail:
+       RT_TRACE(COMP_ERR, "PHY Initialization failed\n") ;
+       return false;
+}
+
+#ifndef RTL8192SE
+void PHY_SetRF8256CCKTxPower(struct net_device*        dev, u8 powerlevel)
+{
+       u32     TxAGC=0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef RTL8190P
+       u8                              byte0, byte1;
+
+       TxAGC |= ((powerlevel<<8)|powerlevel);
+       TxAGC += priv->CCKTxPowerLevelOriginalOffset;
+
+       if (priv->bDynamicTxLowPower == true
+               /*pMgntInfo->bScanInProgress == true*/ )
+       {
+               if (priv->CustomerID == RT_CID_819x_Netcore)
+                       TxAGC = 0x2222;
+               else
+               TxAGC += ((priv->CckPwEnl<<8)|priv->CckPwEnl);
+       }
+
+       byte0 = (u8)(TxAGC & 0xff);
+       byte1 = (u8)((TxAGC & 0xff00)>>8);
+       if (byte0 > 0x24)
+               byte0 = 0x24;
+       if (byte1 > 0x24)
+               byte1 = 0x24;
+       if (priv->rf_type == RF_2T4R)
+       {
+                       if (priv->RF_C_TxPwDiff > 0)
+                       {
+                               if ( (byte0 + (u8)priv->RF_C_TxPwDiff) > 0x24)
+                                       byte0 = 0x24 - priv->RF_C_TxPwDiff;
+                               if ( (byte1 + (u8)priv->RF_C_TxPwDiff) > 0x24)
+                                       byte1 = 0x24 - priv->RF_C_TxPwDiff;
+                       }
+               }
+       TxAGC = (byte1<<8) |byte0;
+       write_nic_dword(dev, CCK_TXAGC, TxAGC);
+#else
+       #ifdef RTL8192E
+
+       TxAGC = powerlevel;
+       if (priv->bDynamicTxLowPower == true)
+       {
+               if (priv->CustomerID == RT_CID_819x_Netcore)
+               TxAGC = 0x22;
+       else
+               TxAGC += priv->CckPwEnl;
+       }
+       if (TxAGC > 0x24)
+               TxAGC = 0x24;
+       rtl8192_setBBreg(dev, rTxAGC_CCK_Mcs32, bTxAGCRateCCK, TxAGC);
+       #endif
+#endif
+}
+
+
+void PHY_SetRF8256OFDMTxPower(struct net_device* dev, u8 powerlevel)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef RTL8190P
+       u32                             TxAGC1=0, TxAGC2=0, TxAGC2_tmp = 0;
+       u8                              i, byteVal1[4], byteVal2[4], byteVal3[4];
+
+       if (priv->bDynamicTxHighPower == true)
+       {
+               TxAGC1 |= ((powerlevel<<24)|(powerlevel<<16)|(powerlevel<<8)|powerlevel);
+               TxAGC2_tmp = TxAGC1;
+
+               TxAGC1 += priv->MCSTxPowerLevelOriginalOffset[0];
+               TxAGC2 =0x03030303;
+
+               TxAGC2_tmp += priv->MCSTxPowerLevelOriginalOffset[1];
+       }
+       else
+       {
+               TxAGC1 |= ((powerlevel<<24)|(powerlevel<<16)|(powerlevel<<8)|powerlevel);
+               TxAGC2 = TxAGC1;
+
+               TxAGC1 += priv->MCSTxPowerLevelOriginalOffset[0];
+               TxAGC2 += priv->MCSTxPowerLevelOriginalOffset[1];
+
+               TxAGC2_tmp = TxAGC2;
+
+       }
+       for (i=0; i<4; i++)
+       {
+               byteVal1[i] = (u8)(  (TxAGC1 & (0xff<<(i*8))) >>(i*8) );
+               if (byteVal1[i] > 0x24)
+                       byteVal1[i] = 0x24;
+               byteVal2[i] = (u8)(  (TxAGC2 & (0xff<<(i*8))) >>(i*8) );
+               if (byteVal2[i] > 0x24)
+                       byteVal2[i] = 0x24;
+
+               byteVal3[i] = (u8)(  (TxAGC2_tmp & (0xff<<(i*8))) >>(i*8) );
+               if (byteVal3[i] > 0x24)
+                       byteVal3[i] = 0x24;
+       }
+
+       if (priv->rf_type == RF_2T4R)
+       {
+               if (priv->RF_C_TxPwDiff > 0)
+               {
+                       for (i=0; i<4; i++)
+                       {
+                               if ( (byteVal1[i] + (u8)priv->RF_C_TxPwDiff) > 0x24)
+                                       byteVal1[i] = 0x24 - priv->RF_C_TxPwDiff;
+                               if ( (byteVal2[i] + (u8)priv->RF_C_TxPwDiff) > 0x24)
+                                       byteVal2[i] = 0x24 - priv->RF_C_TxPwDiff;
+                               if ( (byteVal3[i] + (u8)priv->RF_C_TxPwDiff) > 0x24)
+                                       byteVal3[i] = 0x24 - priv->RF_C_TxPwDiff;
+                       }
+               }
+       }
+
+       TxAGC1 = (byteVal1[3]<<24) | (byteVal1[2]<<16) |(byteVal1[1]<<8) |byteVal1[0];
+       TxAGC2 = (byteVal2[3]<<24) | (byteVal2[2]<<16) |(byteVal2[1]<<8) |byteVal2[0];
+
+       TxAGC2_tmp = (byteVal3[3]<<24) | (byteVal3[2]<<16) |(byteVal3[1]<<8) |byteVal3[0];
+       priv->Pwr_Track = TxAGC2_tmp;
+
+       write_nic_dword(dev, MCS_TXAGC, TxAGC1);
+       write_nic_dword(dev, MCS_TXAGC+4, TxAGC2);
+#else
+#ifdef RTL8192E
+       u32 writeVal, powerBase0, powerBase1, writeVal_tmp;
+       u8 index = 0;
+       u16 RegOffset[6] = {0xe00, 0xe04, 0xe10, 0xe14, 0xe18, 0xe1c};
+       u8 byte0, byte1, byte2, byte3;
+
+       powerBase0 = powerlevel + priv->LegacyHTTxPowerDiff;
+       powerBase0 = (powerBase0<<24) | (powerBase0<<16) |(powerBase0<<8) |powerBase0;
+       powerBase1 = powerlevel;
+       powerBase1 = (powerBase1<<24) | (powerBase1<<16) |(powerBase1<<8) |powerBase1;
+
+       for (index=0; index<6; index++)
+       {
+               writeVal = (u32)(priv->MCSTxPowerLevelOriginalOffset[index] + ((index<2)?powerBase0:powerBase1));
+               byte0 = (u8)(writeVal & 0x7f);
+               byte1 = (u8)((writeVal & 0x7f00)>>8);
+               byte2 = (u8)((writeVal & 0x7f0000)>>16);
+               byte3 = (u8)((writeVal & 0x7f000000)>>24);
+               if (byte0 > 0x24)
+                       byte0 = 0x24;
+               if (byte1 > 0x24)
+                       byte1 = 0x24;
+               if (byte2 > 0x24)
+                       byte2 = 0x24;
+               if (byte3 > 0x24)
+                       byte3 = 0x24;
+
+               if (index == 3)
+               {
+                       writeVal_tmp = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
+                       priv->Pwr_Track = writeVal_tmp;
+               }
+
+               if (priv->bDynamicTxHighPower == true)
+               {
+                       writeVal = 0x03030303;
+               }
+               else
+               {
+                       writeVal = (byte3<<24) | (byte2<<16) |(byte1<<8) |byte0;
+               }
+               rtl8192_setBBreg(dev, RegOffset[index], 0x7f7f7f7f, writeVal);
+       }
+
+#endif
+#endif
+       return;
+}
+
+
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8190P_rtl8256.h b/drivers/staging/rtl8192e/r8190P_rtl8256.h
new file mode 100644 (file)
index 0000000..08bcb62
--- /dev/null
@@ -0,0 +1,34 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#ifndef RTL8225H
+#define RTL8225H
+
+#ifdef RTL8190P
+#define RTL819X_TOTAL_RF_PATH  4
+#else
+#define RTL819X_TOTAL_RF_PATH 2
+#endif
+extern void PHY_SetRF8256Bandwidth(struct net_device* dev , HT_CHANNEL_WIDTH Bandwidth);
+extern bool PHY_RF8256_Config(struct net_device* dev);
+extern bool phy_RF8256_Config_ParaFile(struct net_device* dev);
+extern void PHY_SetRF8256CCKTxPower(struct net_device* dev, u8 powerlevel);
+extern void PHY_SetRF8256OFDMTxPower(struct net_device* dev, u8 powerlevel);
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_cmdpkt.c b/drivers/staging/rtl8192e/r8192E_cmdpkt.c
new file mode 100644 (file)
index 0000000..11506db
--- /dev/null
@@ -0,0 +1,478 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#if (defined(RTL8192E) || defined(RTL8190P))
+
+#include "rtl_core.h"
+#include "r8192E_hw.h"
+#include "r8192E_cmdpkt.h"
+/*---------------------------Define Local Constant---------------------------*/
+/* Debug constant*/
+#define                CMPK_DEBOUNCE_CNT                       1
+#define                CMPK_PRINT(Address)\
+{\
+       unsigned char   i;\
+       u32     temp[10];\
+       \
+       memcpy(temp, Address, 40);\
+       for (i = 0; i <40; i+=4)\
+               printk("\r\n %08x", temp[i]);\
+}\
+
+/*---------------------------Define functions---------------------------------*/
+ extern        bool cmpk_message_handle_tx(
+       struct net_device *dev,
+       u8*     code_virtual_address,
+       u32     packettype,
+       u32     buffer_len)
+{
+
+       bool                            rt_status = true;
+       struct r8192_priv       *priv = rtllib_priv(dev);
+       u16                             frag_threshold;
+       u16                             frag_length = 0, frag_offset = 0;
+       rt_firmware             *pfirmware = priv->pFirmware;
+       struct sk_buff          *skb;
+       unsigned char           *seg_ptr;
+       cb_desc                 *tcb_desc;
+       u8                              bLastIniPkt;
+
+       PTX_FWINFO_8190PCI      pTxFwInfo = NULL;
+
+       RT_TRACE(COMP_CMDPKT,"%s(),buffer_len is %d\n",__func__,buffer_len);
+       firmware_init_param(dev);
+       frag_threshold = pfirmware->cmdpacket_frag_thresold;
+
+       do {
+               if ((buffer_len - frag_offset) > frag_threshold) {
+                       frag_length = frag_threshold ;
+                       bLastIniPkt = 0;
+
+               } else {
+                       frag_length =(u16)(buffer_len - frag_offset);
+                       bLastIniPkt = 1;
+               }
+
+               skb  = dev_alloc_skb(frag_length + priv->rtllib->tx_headroom + 4);
+
+               if (skb == NULL) {
+                       rt_status = false;
+                       goto Failed;
+               }
+
+               memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
+               tcb_desc = (cb_desc*)(skb->cb + MAX_DEV_ADDR_SIZE);
+               tcb_desc->queue_index = TXCMD_QUEUE;
+               tcb_desc->bCmdOrInit = DESC_PACKET_TYPE_NORMAL;
+               tcb_desc->bLastIniPkt = bLastIniPkt;
+               tcb_desc->pkt_size = frag_length;
+
+               seg_ptr = skb_put(skb, priv->rtllib->tx_headroom);
+               pTxFwInfo = (PTX_FWINFO_8190PCI)seg_ptr;
+               memset(pTxFwInfo,0,sizeof(TX_FWINFO_8190PCI));
+               memset(pTxFwInfo,0x12,8);
+
+               seg_ptr = skb_put(skb, frag_length);
+               memcpy(seg_ptr, code_virtual_address, (u32)frag_length);
+
+               priv->rtllib->softmac_hard_start_xmit(skb,dev);
+
+               code_virtual_address += frag_length;
+               frag_offset += frag_length;
+
+       }while(frag_offset < buffer_len);
+
+       write_nic_byte(dev, TPPoll, TPPoll_CQ);
+Failed:
+       return rt_status;
+}      /* CMPK_Message_Handle_Tx */
+
+static void
+cmpk_count_txstatistic(
+       struct net_device *dev,
+       cmpk_txfb_t     *pstx_fb)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef ENABLE_PS
+       RT_RF_POWER_STATE       rtState;
+
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));
+
+       if (rtState == eRfOff)
+       {
+               return;
+       }
+#endif
+
+#ifdef TODO
+       if (pAdapter->bInHctTest)
+               return;
+#endif
+       if (pstx_fb->tok)
+       {
+               priv->stats.txfeedbackok++;
+               priv->stats.txoktotal++;
+               priv->stats.txokbytestotal += pstx_fb->pkt_length;
+               priv->stats.txokinperiod++;
+
+               if (pstx_fb->pkt_type == PACKET_MULTICAST)
+               {
+                       priv->stats.txmulticast++;
+                       priv->stats.txbytesmulticast += pstx_fb->pkt_length;
+               }
+               else if (pstx_fb->pkt_type == PACKET_BROADCAST)
+               {
+                       priv->stats.txbroadcast++;
+                       priv->stats.txbytesbroadcast += pstx_fb->pkt_length;
+               }
+               else
+               {
+                       priv->stats.txunicast++;
+                       priv->stats.txbytesunicast += pstx_fb->pkt_length;
+               }
+       }
+       else
+       {
+               priv->stats.txfeedbackfail++;
+               priv->stats.txerrtotal++;
+               priv->stats.txerrbytestotal += pstx_fb->pkt_length;
+
+               if (pstx_fb->pkt_type == PACKET_MULTICAST)
+               {
+                       priv->stats.txerrmulticast++;
+               }
+               else if (pstx_fb->pkt_type == PACKET_BROADCAST)
+               {
+                       priv->stats.txerrbroadcast++;
+               }
+               else
+               {
+                       priv->stats.txerrunicast++;
+               }
+       }
+
+       priv->stats.txretrycount += pstx_fb->retry_cnt;
+       priv->stats.txfeedbackretry += pstx_fb->retry_cnt;
+
+}      /* cmpk_CountTxStatistic */
+
+
+
+static void
+cmpk_handle_tx_feedback(
+       struct net_device *dev,
+       u8      *       pmsg)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       cmpk_txfb_t             rx_tx_fb;       /* */
+
+       priv->stats.txfeedback++;
+
+
+       memcpy((u8*)&rx_tx_fb, pmsg, sizeof(cmpk_txfb_t));
+       cmpk_count_txstatistic(dev, &rx_tx_fb);
+
+}      /* cmpk_Handle_Tx_Feedback */
+
+void
+cmdpkt_beacontimerinterrupt_819xusb(
+       struct net_device *dev
+)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u16 tx_rate;
+       {
+               if ((priv->rtllib->current_network.mode == IEEE_A)  ||
+                       (priv->rtllib->current_network.mode == IEEE_N_5G) ||
+                       ((priv->rtllib->current_network.mode == IEEE_N_24G)  && (!priv->rtllib->pHTInfo->bCurSuppCCK)))
+               {
+                       tx_rate = 60;
+                       DMESG("send beacon frame  tx rate is 6Mbpm\n");
+               }
+               else
+               {
+                       tx_rate =10;
+                       DMESG("send beacon frame  tx rate is 1Mbpm\n");
+               }
+
+
+       }
+
+}
+
+static void
+cmpk_handle_interrupt_status(
+       struct net_device *dev,
+       u8*     pmsg)
+{
+       cmpk_intr_sta_t         rx_intr_status; /* */
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       DMESG("---> cmpk_Handle_Interrupt_Status()\n");
+
+
+       rx_intr_status.length = pmsg[1];
+       if (rx_intr_status.length != (sizeof(cmpk_intr_sta_t) - 2))
+       {
+               DMESG("cmpk_Handle_Interrupt_Status: wrong length!\n");
+               return;
+       }
+
+
+       if (    priv->rtllib->iw_mode == IW_MODE_ADHOC)
+       {
+               rx_intr_status.interrupt_status = *((u32 *)(pmsg + 4));
+
+               DMESG("interrupt status = 0x%x\n", rx_intr_status.interrupt_status);
+
+               if (rx_intr_status.interrupt_status & ISR_TxBcnOk)
+               {
+                       priv->rtllib->bibsscoordinator = true;
+                       priv->stats.txbeaconokint++;
+               }
+               else if (rx_intr_status.interrupt_status & ISR_TxBcnErr)
+               {
+                       priv->rtllib->bibsscoordinator = false;
+                       priv->stats.txbeaconerr++;
+               }
+
+               if (rx_intr_status.interrupt_status & ISR_BcnTimerIntr)
+               {
+                       cmdpkt_beacontimerinterrupt_819xusb(dev);
+               }
+
+       }
+
+
+
+       DMESG("<---- cmpk_handle_interrupt_status()\n");
+
+}      /* cmpk_handle_interrupt_status */
+
+
+static void
+cmpk_handle_query_config_rx(
+       struct net_device *dev,
+       u8*        pmsg)
+{
+       cmpk_query_cfg_t        rx_query_cfg;   /* */
+
+
+       rx_query_cfg.cfg_action         = (pmsg[4] & 0x80000000)>>31;
+       rx_query_cfg.cfg_type           = (pmsg[4] & 0x60) >> 5;
+       rx_query_cfg.cfg_size           = (pmsg[4] & 0x18) >> 3;
+       rx_query_cfg.cfg_page           = (pmsg[6] & 0x0F) >> 0;
+       rx_query_cfg.cfg_offset                 = pmsg[7];
+       rx_query_cfg.value                      = (pmsg[8] << 24) | (pmsg[9] << 16) |
+                                                                 (pmsg[10] << 8) | (pmsg[11] << 0);
+       rx_query_cfg.mask                       = (pmsg[12] << 24) | (pmsg[13] << 16) |
+                                                                 (pmsg[14] << 8) | (pmsg[15] << 0);
+
+}      /* cmpk_Handle_Query_Config_Rx */
+
+
+static void    cmpk_count_tx_status(   struct net_device *dev,
+                                                                       cmpk_tx_status_t        *pstx_status)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+#ifdef ENABLE_PS
+
+       RT_RF_POWER_STATE       rtstate;
+
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));
+
+       if (rtState == eRfOff)
+       {
+               return;
+       }
+#endif
+
+       priv->stats.txfeedbackok        += pstx_status->txok;
+       priv->stats.txoktotal           += pstx_status->txok;
+
+       priv->stats.txfeedbackfail      += pstx_status->txfail;
+       priv->stats.txerrtotal          += pstx_status->txfail;
+
+       priv->stats.txretrycount                += pstx_status->txretry;
+       priv->stats.txfeedbackretry     += pstx_status->txretry;
+
+
+       priv->stats.txmulticast += pstx_status->txmcok;
+       priv->stats.txbroadcast += pstx_status->txbcok;
+       priv->stats.txunicast           += pstx_status->txucok;
+
+       priv->stats.txerrmulticast      += pstx_status->txmcfail;
+       priv->stats.txerrbroadcast      += pstx_status->txbcfail;
+       priv->stats.txerrunicast        += pstx_status->txucfail;
+
+       priv->stats.txbytesmulticast    += pstx_status->txmclength;
+       priv->stats.txbytesbroadcast    += pstx_status->txbclength;
+       priv->stats.txbytesunicast              += pstx_status->txuclength;
+
+       priv->stats.last_packet_rate            = pstx_status->rate;
+}      /* cmpk_CountTxStatus */
+
+
+
+static void
+cmpk_handle_tx_status(
+       struct net_device *dev,
+       u8*        pmsg)
+{
+       cmpk_tx_status_t        rx_tx_sts;      /* */
+
+       memcpy((void*)&rx_tx_sts, (void*)pmsg, sizeof(cmpk_tx_status_t));
+       cmpk_count_tx_status(dev, &rx_tx_sts);
+
+}
+
+
+static void
+cmpk_handle_tx_rate_history(
+       struct net_device *dev,
+       u8*        pmsg)
+{
+       cmpk_tx_rahis_t *ptxrate;
+       u8                              i, j;
+       u16                             length = sizeof(cmpk_tx_rahis_t);
+       u32                             *ptemp;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+
+#ifdef ENABLE_PS
+       pAdapter->HalFunc.GetHwRegHandler(pAdapter, HW_VAR_RF_STATE, (pu1Byte)(&rtState));
+
+       if (rtState == eRfOff)
+       {
+               return;
+       }
+#endif
+
+       ptemp = (u32 *)pmsg;
+
+       for (i = 0; i < (length/4); i++)
+       {
+               u16      temp1, temp2;
+
+               temp1 = ptemp[i]&0x0000FFFF;
+               temp2 = ptemp[i]>>16;
+               ptemp[i] = (temp1<<16)|temp2;
+       }
+
+       ptxrate = (cmpk_tx_rahis_t *)pmsg;
+
+       if (ptxrate == NULL )
+       {
+               return;
+       }
+
+       for (i = 0; i < 16; i++)
+       {
+               if (i < 4)
+                       priv->stats.txrate.cck[i] += ptxrate->cck[i];
+
+               if (i< 8)
+                       priv->stats.txrate.ofdm[i] += ptxrate->ofdm[i];
+
+               for (j = 0; j < 4; j++)
+                       priv->stats.txrate.ht_mcs[j][i] += ptxrate->ht_mcs[j][i];
+       }
+
+}
+
+
+extern u32
+cmpk_message_handle_rx(
+       struct net_device *dev,
+       struct rtllib_rx_stats *pstats)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int                     total_length;
+       u8                      cmd_length, exe_cnt = 0;
+       u8                      element_id;
+       u8                      *pcmd_buff;
+
+       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx()\n");
+
+       if (/*(prfd->queue_id != CMPK_RX_QUEUE_ID) || */(pstats== NULL))
+       {
+               /* Print error message. */
+               /*RT_TRACE(COMP_SEND, DebugLevel,
+                               ("\n\r[CMPK]-->Err queue id or pointer"));*/
+               return 0;
+       }
+
+       total_length = pstats->Length;
+
+       pcmd_buff = pstats->virtual_address;
+
+       element_id = pcmd_buff[0];
+
+       while (total_length > 0 || exe_cnt++ >100)
+       {
+               element_id = pcmd_buff[0];
+
+               switch (element_id) {
+               case RX_TX_FEEDBACK:
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():RX_TX_FEEDBACK\n");
+                       cmpk_handle_tx_feedback (dev, pcmd_buff);
+                       cmd_length = CMPK_RX_TX_FB_SIZE;
+                       break;
+               case RX_INTERRUPT_STATUS:
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():RX_INTERRUPT_STATUS\n");
+                       cmpk_handle_interrupt_status(dev, pcmd_buff);
+                       cmd_length = sizeof(cmpk_intr_sta_t);
+                       break;
+               case BOTH_QUERY_CONFIG:
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():BOTH_QUERY_CONFIG\n");
+                       cmpk_handle_query_config_rx(dev, pcmd_buff);
+                       cmd_length = CMPK_BOTH_QUERY_CONFIG_SIZE;
+                       break;
+               case RX_TX_STATUS:
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():RX_TX_STATUS\n");
+                       cmpk_handle_tx_status(dev, pcmd_buff);
+                       cmd_length = CMPK_RX_TX_STS_SIZE;
+                       break;
+               case RX_TX_PER_PKT_FEEDBACK:
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():RX_TX_PER_PKT_FEEDBACK\n");
+                       cmd_length = CMPK_RX_TX_FB_SIZE;
+                       break;
+               case RX_TX_RATE_HISTORY:
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():RX_TX_HISTORY\n");
+                       cmpk_handle_tx_rate_history(dev, pcmd_buff);
+                       cmd_length = CMPK_TX_RAHIS_SIZE;
+                       break;
+               default:
+
+                       RT_TRACE(COMP_CMDPKT, "---->cmpk_message_handle_rx():unknow CMD Element\n");
+                       return 1;
+               }
+
+               priv->stats.rxcmdpkt[element_id]++;
+
+               total_length -= cmd_length;
+               pcmd_buff    += cmd_length;
+       }
+       return  1;
+
+       RT_TRACE(COMP_CMDPKT, "<----cmpk_message_handle_rx()\n");
+}
+
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_cmdpkt.h b/drivers/staging/rtl8192e/r8192E_cmdpkt.h
new file mode 100644 (file)
index 0000000..7873370
--- /dev/null
@@ -0,0 +1,163 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef R819XUSB_CMDPKT_H
+#define R819XUSB_CMDPKT_H
+#define                CMPK_RX_TX_FB_SIZE                                      sizeof(cmpk_txfb_t)
+#define                CMPK_TX_SET_CONFIG_SIZE                         sizeof(cmpk_set_cfg_t)
+#define                CMPK_BOTH_QUERY_CONFIG_SIZE                     sizeof(cmpk_set_cfg_t)
+#define                CMPK_RX_TX_STS_SIZE                                     sizeof(cmpk_tx_status_t)
+#define                CMPK_RX_DBG_MSG_SIZE                    sizeof(cmpk_rx_dbginfo_t)
+#define                CMPK_TX_RAHIS_SIZE                      sizeof(cmpk_tx_rahis_t)
+
+#define ISR_TxBcnOk                                    BIT27
+#define ISR_TxBcnErr                           BIT26
+#define ISR_BcnTimerIntr                       BIT13
+
+
+typedef struct tag_cmd_pkt_tx_feedback
+{
+       u8      element_id;
+       u8      length;
+       u8      TID:4;                          /* */
+       u8      fail_reason:3;          /* */
+       u8      tok:1;
+       u8      reserve1:4;                     /* */
+       u8      pkt_type:2;             /* */
+       u8      bandwidth:1;            /* */
+       u8      qos_pkt:1;                      /* */
+
+       u8      reserve2;                       /* */
+       u8      retry_cnt;                      /* */
+       u16     pkt_id;                         /* */
+
+       u16     seq_num;                        /* */
+       u8      s_rate;
+       u8      f_rate;
+
+       u8      s_rts_rate;                     /* */
+       u8      f_rts_rate;                     /* */
+       u16     pkt_length;                     /* */
+
+       u16     reserve3;                       /* */
+       u16     duration;                       /* */
+}cmpk_txfb_t;
+
+typedef struct tag_cmd_pkt_interrupt_status
+{
+       u8      element_id;
+       u8      length;
+       u16     reserve;
+       u32     interrupt_status;
+}cmpk_intr_sta_t;
+
+
+typedef struct tag_cmd_pkt_set_configuration
+{
+       u8      element_id;
+       u8      length;
+       u16     reserve1;
+       u8      cfg_reserve1:3;
+       u8      cfg_size:2;
+       u8      cfg_type:2;
+       u8      cfg_action:1;
+       u8      cfg_reserve2;
+       u8      cfg_page:4;
+       u8      cfg_reserve3:4;
+       u8      cfg_offset;
+       u32     value;
+       u32     mask;
+}cmpk_set_cfg_t;
+
+#define                cmpk_query_cfg_t        cmpk_set_cfg_t
+
+typedef struct tag_tx_stats_feedback
+{
+       u16     reserve1;
+       u8      length;
+       u8      element_id;
+
+       u16     txfail;
+       u16     txok;
+
+       u16     txmcok;
+       u16     txretry;
+
+       u16  txucok;
+       u16     txbcok;
+
+       u16     txbcfail;
+       u16     txmcfail;
+
+       u16     reserve2;
+       u16     txucfail;
+
+       u32     txmclength;
+       u32     txbclength;
+       u32     txuclength;
+
+       u16     reserve3_23;
+       u8      reserve3_1;
+       u8      rate;
+}__attribute__((packed)) cmpk_tx_status_t;
+
+typedef struct tag_rx_debug_message_feedback
+{
+       u16     reserve1;
+       u8      length;
+       u8      element_id;
+
+
+}cmpk_rx_dbginfo_t;
+
+typedef struct tag_tx_rate_history
+{
+       u8      element_id;
+       u8      length;
+       u16     reserved1;
+
+       u16     cck[4];
+
+       u16     ofdm[8];
+
+
+
+
+
+       u16     ht_mcs[4][16];
+
+}__attribute__((packed)) cmpk_tx_rahis_t;
+
+typedef enum tag_command_packet_directories
+{
+    RX_TX_FEEDBACK = 0,
+    RX_INTERRUPT_STATUS                = 1,
+    TX_SET_CONFIG                              = 2,
+    BOTH_QUERY_CONFIG                  = 3,
+    RX_TX_STATUS                               = 4,
+    RX_DBGINFO_FEEDBACK                = 5,
+    RX_TX_PER_PKT_FEEDBACK             = 6,
+    RX_TX_RATE_HISTORY         = 7,
+    RX_CMD_ELE_MAX
+}cmpk_element_e;
+
+extern  u32 cmpk_message_handle_rx(struct net_device *dev, struct rtllib_rx_stats * pstats);
+extern bool cmpk_message_handle_tx(struct net_device *dev, u8* codevirtualaddress, u32 packettype, u32 buffer_len);
+
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_core.c.porig b/drivers/staging/rtl8192e/r8192E_core.c.porig
new file mode 100644 (file)
index 0000000..94d9c8d
--- /dev/null
@@ -0,0 +1,5039 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ * Linux device driver for RTL8192E
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * Jerry chuang <wlanfae@realtek.com>
+ */
+
+
+#include <linux/vmalloc.h>
+#include <linux/slab.h>
+#include <linux/interrupt.h>
+#include <linux/hardirq.h>
+#include <asm/uaccess.h>
+#include "r8192E_hw.h"
+#include "r8192E.h"
+#include "r8190_rtl8256.h" /* RTL8225 Radio frontend */
+#include "r8180_93cx6.h"   /* Card EEPROM */
+#include "r8192E_wx.h"
+#include "r819xE_phy.h" //added by WB 4.30.2008
+#include "r819xE_phyreg.h"
+#include "r819xE_cmdpkt.h"
+#include "r8192E_dm.h"
+
+#ifdef CONFIG_PM
+#include "r8192_pm.h"
+#endif
+
+#ifdef ENABLE_DOT11D
+#include "ieee80211/dot11d.h"
+#endif
+
+//set here to open your trace code. //WB
+u32 rt_global_debug_component = COMP_ERR ; //always open err flags on
+
+static DEFINE_PCI_DEVICE_TABLE(rtl8192_pci_id_tbl) = {
+       /* Realtek */
+       { PCI_DEVICE(0x10ec, 0x8192) },
+
+       /* Corega */
+       { PCI_DEVICE(0x07aa, 0x0044) },
+       { PCI_DEVICE(0x07aa, 0x0047) },
+       {}
+};
+
+static char ifname[IFNAMSIZ] = "wlan%d";
+static int hwwep = 1; //default use hw. set 0 to use software security
+static int channels = 0x3fff;
+
+MODULE_LICENSE("GPL");
+MODULE_VERSION("V 1.1");
+MODULE_DEVICE_TABLE(pci, rtl8192_pci_id_tbl);
+//MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
+MODULE_DESCRIPTION("Linux driver for Realtek RTL819x WiFi cards");
+
+
+module_param_string(ifname, ifname, sizeof(ifname), S_IRUGO|S_IWUSR);
+module_param(hwwep,int, S_IRUGO|S_IWUSR);
+module_param(channels,int, S_IRUGO|S_IWUSR);
+
+MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
+MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards");
+MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
+
+static int __devinit rtl8192_pci_probe(struct pci_dev *pdev,
+                        const struct pci_device_id *id);
+static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev);
+
+static struct pci_driver rtl8192_pci_driver = {
+       .name           = RTL819xE_MODULE_NAME,           /* Driver name   */
+       .id_table       = rtl8192_pci_id_tbl,             /* PCI_ID table  */
+       .probe          = rtl8192_pci_probe,              /* probe fn      */
+       .remove         = __devexit_p(rtl8192_pci_disconnect),    /* remove fn     */
+#ifdef CONFIG_PM
+       .suspend        = rtl8192E_suspend,               /* PM suspend fn */
+       .resume         = rtl8192E_resume,                 /* PM resume fn  */
+#else
+       .suspend        = NULL,                           /* PM suspend fn */
+       .resume         = NULL,                           /* PM resume fn  */
+#endif
+};
+
+static void rtl8192_start_beacon(struct ieee80211_device *ieee80211);
+static void rtl8192_stop_beacon(struct ieee80211_device *ieee80211);
+static void rtl819x_watchdog_wqcallback(struct work_struct *work);
+static void rtl8192_irq_rx_tasklet(unsigned long arg);
+static void rtl8192_irq_tx_tasklet(unsigned long arg);
+static void rtl8192_prepare_beacon(unsigned long arg);
+static irqreturn_t rtl8192_interrupt(int irq, void *param);
+static void rtl819xE_tx_cmd(struct r8192_priv *priv, struct sk_buff *skb);
+static void rtl8192_update_ratr_table(struct r8192_priv *priv);
+static void rtl8192_restart(struct work_struct *work);
+static void watch_dog_timer_callback(unsigned long data);
+static int _rtl8192_up(struct r8192_priv *priv);
+static void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
+static short rtl8192_tx(struct r8192_priv *priv, struct sk_buff* skb);
+
+#ifdef ENABLE_DOT11D
+
+typedef struct _CHANNEL_LIST
+{
+       u8      Channel[32];
+       u8      Len;
+}CHANNEL_LIST, *PCHANNEL_LIST;
+
+static const CHANNEL_LIST ChannelPlan[] = {
+       {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24},             //FCC
+       {{1,2,3,4,5,6,7,8,9,10,11},11},                                                 //IC
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},   //ETSI
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},    //Spain. Change to ETSI.
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //France. Change to ETSI.
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},        //MKK                                   //MKK
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //Israel.
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},                        // For 11a , TELEC
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22},    //MIC
+       {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}                                 //For Global Domain. 1-11:active scan, 12-14 passive scan. //+YJ, 080626
+};
+
+static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
+{
+       int i, max_chan=-1, min_chan=-1;
+       struct ieee80211_device* ieee = priv->ieee80211;
+       switch (channel_plan)
+       {
+               case COUNTRY_CODE_FCC:
+               case COUNTRY_CODE_IC:
+               case COUNTRY_CODE_ETSI:
+               case COUNTRY_CODE_SPAIN:
+               case COUNTRY_CODE_FRANCE:
+               case COUNTRY_CODE_MKK:
+               case COUNTRY_CODE_MKK1:
+               case COUNTRY_CODE_ISRAEL:
+               case COUNTRY_CODE_TELEC:
+               case COUNTRY_CODE_MIC:
+               {
+                       Dot11d_Init(ieee);
+                       ieee->bGlobalDomain = false;
+                        //acturally 8225 & 8256 rf chip only support B,G,24N mode
+                       min_chan = 1;
+                       max_chan = 14;
+
+                       if (ChannelPlan[channel_plan].Len != 0){
+                               // Clear old channel map
+                               memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
+                               // Set new channel map
+                               for (i=0;i<ChannelPlan[channel_plan].Len;i++)
+                               {
+                                       if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
+                                           break;
+                                       GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
+                               }
+                       }
+                       break;
+               }
+               case COUNTRY_CODE_GLOBAL_DOMAIN:
+               {
+                       GET_DOT11D_INFO(ieee)->bEnabled = 0; //this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain setting
+                       Dot11d_Reset(ieee);
+                       ieee->bGlobalDomain = true;
+                       break;
+               }
+               default:
+                       break;
+       }
+}
+#endif
+
+static inline bool rx_hal_is_cck_rate(prx_fwinfo_819x_pci pdrvinfo)
+{
+       return (pdrvinfo->RxRate == DESC90_RATE1M ||
+               pdrvinfo->RxRate == DESC90_RATE2M ||
+               pdrvinfo->RxRate == DESC90_RATE5_5M ||
+               pdrvinfo->RxRate == DESC90_RATE11M) &&
+               !pdrvinfo->RxHT;
+}
+
+void CamResetAllEntry(struct r8192_priv* priv)
+{
+       write_nic_dword(priv, RWCAM, BIT31|BIT30);
+}
+
+void write_cam(struct r8192_priv *priv, u8 addr, u32 data)
+{
+        write_nic_dword(priv, WCAMI, data);
+        write_nic_dword(priv, RWCAM, BIT31|BIT16|(addr&0xff) );
+}
+
+u32 read_cam(struct r8192_priv *priv, u8 addr)
+{
+        write_nic_dword(priv, RWCAM, 0x80000000|(addr&0xff) );
+        return read_nic_dword(priv, 0xa8);
+}
+
+u8 read_nic_byte(struct r8192_priv *priv, int x)
+{
+        return 0xff & readb(priv->mem_start + x);
+}
+
+u32 read_nic_dword(struct r8192_priv *priv, int x)
+{
+        return readl(priv->mem_start + x);
+}
+
+u16 read_nic_word(struct r8192_priv *priv, int x)
+{
+        return readw(priv->mem_start + x);
+}
+
+void write_nic_byte(struct r8192_priv *priv, int x,u8 y)
+{
+        writeb(y, priv->mem_start + x);
+       udelay(20);
+}
+
+void write_nic_dword(struct r8192_priv *priv, int x,u32 y)
+{
+        writel(y, priv->mem_start + x);
+       udelay(20);
+}
+
+void write_nic_word(struct r8192_priv *priv, int x,u16 y)
+{
+        writew(y, priv->mem_start + x);
+       udelay(20);
+}
+
+u8 rtl8192e_ap_sec_type(struct ieee80211_device *ieee)
+{
+       static const u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
+       static const u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
+       int wpa_ie_len= ieee->wpa_ie_len;
+       struct ieee80211_crypt_data* crypt;
+       int encrypt;
+
+       crypt = ieee->crypt[ieee->tx_keyidx];
+
+       encrypt = (ieee->current_network.capability & WLAN_CAPABILITY_PRIVACY) ||
+                 (ieee->host_encrypt && crypt && crypt->ops &&
+                  (0 == strcmp(crypt->ops->name,"WEP")));
+
+       /* simply judge  */
+       if(encrypt && (wpa_ie_len == 0)) {
+               // wep encryption, no N mode setting */
+               return SEC_ALG_WEP;
+       } else if((wpa_ie_len != 0)) {
+               // parse pairwise key type */
+               if (((ieee->wpa_ie[0] == 0xdd) && (!memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) ||
+                               ((ieee->wpa_ie[0] == 0x30) && (!memcmp(&ieee->wpa_ie[10],ccmp_rsn_ie, 4))))
+                       return SEC_ALG_CCMP;
+               else
+                       return SEC_ALG_TKIP;
+       } else {
+               return SEC_ALG_NONE;
+       }
+}
+
+void rtl8192e_SetHwReg(struct ieee80211_device *ieee80211, u8 variable, u8 *val)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+
+       switch(variable)
+       {
+
+               case HW_VAR_BSSID:
+                       write_nic_dword(priv, BSSIDR, ((u32*)(val))[0]);
+                       write_nic_word(priv, BSSIDR+2, ((u16*)(val+2))[0]);
+               break;
+
+               case HW_VAR_MEDIA_STATUS:
+               {
+                       RT_OP_MODE      OpMode = *((RT_OP_MODE *)(val));
+                       u8              btMsr = read_nic_byte(priv, MSR);
+
+                       btMsr &= 0xfc;
+
+                       switch(OpMode)
+                       {
+                       case RT_OP_MODE_INFRASTRUCTURE:
+                               btMsr |= MSR_INFRA;
+                               break;
+
+                       case RT_OP_MODE_IBSS:
+                               btMsr |= MSR_ADHOC;
+                               break;
+
+                       case RT_OP_MODE_AP:
+                               btMsr |= MSR_AP;
+                               break;
+
+                       default:
+                               btMsr |= MSR_NOLINK;
+                               break;
+                       }
+
+                       write_nic_byte(priv, MSR, btMsr);
+               }
+               break;
+
+               case HW_VAR_CHECK_BSSID:
+               {
+                       u32     RegRCR, Type;
+
+                       Type = ((u8*)(val))[0];
+                       RegRCR = read_nic_dword(priv, RCR);
+                       priv->ReceiveConfig = RegRCR;
+
+                       if (Type == true)
+                               RegRCR |= (RCR_CBSSID);
+                       else if (Type == false)
+                               RegRCR &= (~RCR_CBSSID);
+
+                       write_nic_dword(priv, RCR,RegRCR);
+                       priv->ReceiveConfig = RegRCR;
+
+               }
+               break;
+
+               case HW_VAR_SLOT_TIME:
+               {
+                       priv->slot_time = val[0];
+                       write_nic_byte(priv, SLOT_TIME, val[0]);
+
+               }
+               break;
+
+               case HW_VAR_ACK_PREAMBLE:
+               {
+                       u32 regTmp = 0;
+                       priv->short_preamble = (bool)(*(u8*)val );
+                       regTmp = priv->basic_rate;
+                       if (priv->short_preamble)
+                               regTmp |= BRSR_AckShortPmb;
+                       write_nic_dword(priv, RRSR, regTmp);
+               }
+               break;
+
+               case HW_VAR_CPU_RST:
+                       write_nic_dword(priv, CPU_GEN, ((u32*)(val))[0]);
+               break;
+
+               default:
+               break;
+       }
+
+}
+
+static struct proc_dir_entry *rtl8192_proc = NULL;
+
+static int proc_get_stats_ap(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct r8192_priv *priv = data;
+       struct ieee80211_device *ieee = priv->ieee80211;
+       struct ieee80211_network *target;
+       int len = 0;
+
+        list_for_each_entry(target, &ieee->network_list, list) {
+
+               len += snprintf(page + len, count - len,
+                "%s ", target->ssid);
+
+               if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
+                       len += snprintf(page + len, count - len,
+                       "WPA\n");
+               }
+               else{
+                        len += snprintf(page + len, count - len,
+                        "non_WPA\n");
+                }
+
+        }
+
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_registers(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct r8192_priv *priv = data;
+       int len = 0;
+       int i,n;
+       int max=0xff;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                        "\n####################page 0##################\n ");
+
+       for(n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len,
+                       "\nD:  %2x > ",n);
+
+               for(i=0;i<16 && n<=max;i++,n++)
+               len += snprintf(page + len, count - len,
+                       "%2x ",read_nic_byte(priv,n));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       len += snprintf(page + len, count - len,
+                        "\n####################page 1##################\n ");
+        for(n=0;n<=max;)
+        {
+                len += snprintf(page + len, count - len,
+                        "\nD:  %2x > ",n);
+
+                for(i=0;i<16 && n<=max;i++,n++)
+                len += snprintf(page + len, count - len,
+                        "%2x ",read_nic_byte(priv,0x100|n));
+        }
+
+       len += snprintf(page + len, count - len,
+                        "\n####################page 3##################\n ");
+        for(n=0;n<=max;)
+        {
+                len += snprintf(page + len, count - len,
+                        "\nD:  %2x > ",n);
+
+                for(i=0;i<16 && n<=max;i++,n++)
+                len += snprintf(page + len, count - len,
+                        "%2x ",read_nic_byte(priv,0x300|n));
+        }
+
+       *eof = 1;
+       return len;
+
+}
+
+static int proc_get_stats_tx(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct r8192_priv *priv = data;
+
+       int len = 0;
+
+       len += snprintf(page + len, count - len,
+               "TX VI priority ok int: %lu\n"
+               "TX VO priority ok int: %lu\n"
+               "TX BE priority ok int: %lu\n"
+               "TX BK priority ok int: %lu\n"
+               "TX MANAGE priority ok int: %lu\n"
+               "TX BEACON priority ok int: %lu\n"
+               "TX BEACON priority error int: %lu\n"
+               "TX CMDPKT priority ok int: %lu\n"
+               "TX queue stopped?: %d\n"
+               "TX fifo overflow: %lu\n"
+               "TX total data packets %lu\n"
+               "TX total data bytes :%lu\n",
+               priv->stats.txviokint,
+               priv->stats.txvookint,
+               priv->stats.txbeokint,
+               priv->stats.txbkokint,
+               priv->stats.txmanageokint,
+               priv->stats.txbeaconokint,
+               priv->stats.txbeaconerr,
+               priv->stats.txcmdpktokint,
+               netif_queue_stopped(priv->ieee80211->dev),
+               priv->stats.txoverflow,
+               priv->ieee80211->stats.tx_packets,
+               priv->ieee80211->stats.tx_bytes);
+
+       *eof = 1;
+       return len;
+}
+
+
+
+static int proc_get_stats_rx(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct r8192_priv *priv = data;
+       int len = 0;
+
+       len += snprintf(page + len, count - len,
+               "RX packets: %lu\n"
+               "RX desc err: %lu\n"
+               "RX rx overflow error: %lu\n",
+               priv->stats.rxint,
+               priv->stats.rxrdu,
+               priv->stats.rxoverflow);
+
+       *eof = 1;
+       return len;
+}
+
+static void rtl8192_proc_module_init(void)
+{
+       RT_TRACE(COMP_INIT, "Initializing proc filesystem\n");
+       rtl8192_proc = proc_mkdir(RTL819xE_MODULE_NAME, init_net.proc_net);
+}
+
+
+static void rtl8192_proc_module_remove(void)
+{
+       remove_proc_entry(RTL819xE_MODULE_NAME, init_net.proc_net);
+}
+
+
+static void rtl8192_proc_remove_one(struct r8192_priv *priv)
+{
+       struct net_device *dev = priv->ieee80211->dev;
+
+       printk("dev name=======> %s\n",dev->name);
+
+       if (priv->dir_dev) {
+               remove_proc_entry("stats-tx", priv->dir_dev);
+               remove_proc_entry("stats-rx", priv->dir_dev);
+               remove_proc_entry("stats-ap", priv->dir_dev);
+               remove_proc_entry("registers", priv->dir_dev);
+               remove_proc_entry("wlan0", rtl8192_proc);
+               priv->dir_dev = NULL;
+       }
+}
+
+
+static void rtl8192_proc_init_one(struct r8192_priv *priv)
+{
+       struct net_device *dev = priv->ieee80211->dev;
+       struct proc_dir_entry *e;
+
+       priv->dir_dev = proc_mkdir(dev->name, rtl8192_proc);
+       if (!priv->dir_dev) {
+               RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
+                     dev->name);
+               return;
+       }
+       e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_stats_rx, priv);
+
+       if (!e) {
+               RT_TRACE(COMP_ERR,"Unable to initialize "
+                     "/proc/net/rtl8192/%s/stats-rx\n",
+                     dev->name);
+       }
+
+
+       e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_stats_tx, priv);
+
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/stats-tx\n",
+                     dev->name);
+       }
+
+       e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_stats_ap, priv);
+
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/stats-ap\n",
+                     dev->name);
+       }
+
+       e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers, priv);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers\n",
+                     dev->name);
+       }
+}
+
+static short check_nic_enough_desc(struct ieee80211_device *ieee, int prio)
+{
+    struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+    struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+    /* for now we reserve two free descriptor as a safety boundary
+     * between the tail and the head
+     */
+    return (ring->entries - skb_queue_len(&ring->queue) >= 2);
+}
+
+static void tx_timeout(struct net_device *dev)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+
+       schedule_work(&priv->reset_wq);
+       printk("TXTIMEOUT");
+}
+
+static void rtl8192_irq_enable(struct r8192_priv *priv)
+{
+       u32 mask;
+
+       mask = IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK |
+              IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK |
+              IMR_BDOK | IMR_RXCMDOK | IMR_TIMEOUT0 | IMR_RDU | IMR_RXFOVW |
+              IMR_TXFOVW | IMR_BcnInt | IMR_TBDOK | IMR_TBDER;
+
+       write_nic_dword(priv, INTA_MASK, mask);
+}
+
+static void rtl8192_irq_disable(struct r8192_priv *priv)
+{
+       write_nic_dword(priv, INTA_MASK, 0);
+       synchronize_irq(priv->irq);
+}
+
+static void rtl8192_update_msr(struct r8192_priv *priv)
+{
+       u8 msr;
+
+       msr  = read_nic_byte(priv, MSR);
+       msr &= ~ MSR_LINK_MASK;
+
+       /* do not change in link_state != WLAN_LINK_ASSOCIATED.
+        * msr must be updated if the state is ASSOCIATING.
+        * this is intentional and make sense for ad-hoc and
+        * master (see the create BSS/IBSS func)
+        */
+       if (priv->ieee80211->state == IEEE80211_LINKED){
+
+               if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
+                       msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
+               else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
+                       msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
+               else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
+                       msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
+
+       }else
+               msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
+
+       write_nic_byte(priv, MSR, msr);
+}
+
+static void rtl8192_set_chan(struct ieee80211_device *ieee80211, short ch)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+
+       priv->chan = ch;
+
+       /* need to implement rf set channel here WB */
+
+       if (priv->rf_set_chan)
+               priv->rf_set_chan(ieee80211, priv->chan);
+}
+
+static void rtl8192_rx_enable(struct r8192_priv *priv)
+{
+       write_nic_dword(priv, RDQDA, priv->rx_ring_dma);
+}
+
+/* the TX_DESC_BASE setting is according to the following queue index
+ *  BK_QUEUE       ===>                        0
+ *  BE_QUEUE       ===>                        1
+ *  VI_QUEUE       ===>                        2
+ *  VO_QUEUE       ===>                        3
+ *  HCCA_QUEUE     ===>                        4
+ *  TXCMD_QUEUE    ===>                        5
+ *  MGNT_QUEUE     ===>                        6
+ *  HIGH_QUEUE     ===>                        7
+ *  BEACON_QUEUE   ===>                        8
+ *  */
+static const u32 TX_DESC_BASE[] = {BKQDA, BEQDA, VIQDA, VOQDA, HCCAQDA, CQDA, MQDA, HQDA, BQDA};
+static void rtl8192_tx_enable(struct r8192_priv *priv)
+{
+       u32 i;
+
+       for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+               write_nic_dword(priv, TX_DESC_BASE[i], priv->tx_ring[i].dma);
+
+       ieee80211_reset_queue(priv->ieee80211);
+}
+
+
+static void rtl8192_free_rx_ring(struct r8192_priv *priv)
+{
+       int i;
+
+       for (i = 0; i < priv->rxringcount; i++) {
+               struct sk_buff *skb = priv->rx_buf[i];
+               if (!skb)
+                       continue;
+
+               pci_unmap_single(priv->pdev,
+                                *((dma_addr_t *)skb->cb),
+                                priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+               kfree_skb(skb);
+       }
+
+       pci_free_consistent(priv->pdev, sizeof(*priv->rx_ring) * priv->rxringcount,
+                           priv->rx_ring, priv->rx_ring_dma);
+       priv->rx_ring = NULL;
+}
+
+static void rtl8192_free_tx_ring(struct r8192_priv *priv, unsigned int prio)
+{
+       struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+       while (skb_queue_len(&ring->queue)) {
+               tx_desc_819x_pci *entry = &ring->desc[ring->idx];
+               struct sk_buff *skb = __skb_dequeue(&ring->queue);
+
+               pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+                                skb->len, PCI_DMA_TODEVICE);
+               kfree_skb(skb);
+               ring->idx = (ring->idx + 1) % ring->entries;
+       }
+
+       pci_free_consistent(priv->pdev, sizeof(*ring->desc)*ring->entries,
+                           ring->desc, ring->dma);
+       ring->desc = NULL;
+}
+
+void PHY_SetRtl8192eRfOff(struct r8192_priv *priv)
+{
+       //disable RF-Chip A/B
+       rtl8192_setBBreg(priv, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
+       //analog to digital off, for power save
+       rtl8192_setBBreg(priv, rFPGA0_AnalogParameter4, 0x300, 0x0);
+       //digital to analog off, for power save
+       rtl8192_setBBreg(priv, rFPGA0_AnalogParameter1, 0x18, 0x0);
+       //rx antenna off
+       rtl8192_setBBreg(priv, rOFDM0_TRxPathEnable, 0xf, 0x0);
+       //rx antenna off
+       rtl8192_setBBreg(priv, rOFDM1_TRxPathEnable, 0xf, 0x0);
+       //analog to digital part2 off, for power save
+       rtl8192_setBBreg(priv, rFPGA0_AnalogParameter1, 0x60, 0x0);
+       rtl8192_setBBreg(priv, rFPGA0_AnalogParameter1, 0x4, 0x0);
+       // Analog parameter!!Change bias and Lbus control.
+       write_nic_byte(priv, ANAPAR_FOR_8192PciE, 0x07);
+}
+
+static void rtl8192_halt_adapter(struct r8192_priv *priv, bool reset)
+{
+       int i;
+       u8 OpMode;
+       u32 ulRegRead;
+
+       OpMode = RT_OP_MODE_NO_LINK;
+       priv->ieee80211->SetHwRegHandler(priv->ieee80211, HW_VAR_MEDIA_STATUS, &OpMode);
+
+       if (!priv->ieee80211->bSupportRemoteWakeUp) {
+               /*
+                * disable tx/rx. In 8185 we write 0x10 (Reset bit),
+                * but here we make reference to WMAC and wirte 0x0
+                */
+               write_nic_byte(priv, CMDR, 0);
+       }
+
+       mdelay(20);
+
+       if (!reset) {
+               mdelay(150);
+
+               priv->bHwRfOffAction = 2;
+
+               /*
+                * Call MgntActSet_RF_State instead to
+                * prevent RF config race condition.
+                */
+               if (!priv->ieee80211->bSupportRemoteWakeUp) {
+                       PHY_SetRtl8192eRfOff(priv);
+                       ulRegRead = read_nic_dword(priv, CPU_GEN);
+                       ulRegRead |= CPU_GEN_SYSTEM_RESET;
+                       write_nic_dword(priv,CPU_GEN, ulRegRead);
+               } else {
+                       /* for WOL */
+                       write_nic_dword(priv, WFCRC0, 0xffffffff);
+                       write_nic_dword(priv, WFCRC1, 0xffffffff);
+                       write_nic_dword(priv, WFCRC2, 0xffffffff);
+
+                       /* Write PMR register */
+                       write_nic_byte(priv, PMR, 0x5);
+                       /* Disable tx, enanble rx */
+                       write_nic_byte(priv, MacBlkCtrl, 0xa);
+               }
+       }
+
+       for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
+       }
+       for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
+       }
+
+       skb_queue_purge(&priv->skb_queue);
+}
+
+static void rtl8192_data_hard_stop(struct ieee80211_device *ieee80211)
+{
+}
+
+static void rtl8192_data_hard_resume(struct ieee80211_device *ieee80211)
+{
+}
+
+/*
+ * this function TX data frames when the ieee80211 stack requires this.
+ * It checks also if we need to stop the ieee tx queue, eventually do it
+ */
+static void rtl8192_hard_data_xmit(struct sk_buff *skb,
+                                  struct ieee80211_device *ieee80211, int rate)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       int ret;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       u8 queue_index = tcb_desc->queue_index;
+
+       /* shall not be referred by command packet */
+       BUG_ON(queue_index == TXCMD_QUEUE);
+
+       if (priv->bHwRadioOff || (!priv->up))
+       {
+               kfree_skb(skb);
+               return;
+       }
+
+       skb_push(skb, priv->ieee80211->tx_headroom);
+       ret = rtl8192_tx(priv, skb);
+       if (ret != 0) {
+               kfree_skb(skb);
+       }
+
+       if (queue_index != MGNT_QUEUE) {
+               priv->ieee80211->stats.tx_bytes += (skb->len - priv->ieee80211->tx_headroom);
+               priv->ieee80211->stats.tx_packets++;
+       }
+}
+
+/*
+ * This is a rough attempt to TX a frame
+ * This is called by the ieee 80211 stack to TX management frames.
+ * If the ring is full packet are dropped (for data frame the queue
+ * is stopped before this can happen).
+ */
+static int rtl8192_hard_start_xmit(struct sk_buff *skb, struct ieee80211_device *ieee80211)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       int ret;
+        cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+        u8 queue_index = tcb_desc->queue_index;
+
+        if (queue_index != TXCMD_QUEUE) {
+               if (priv->bHwRadioOff || (!priv->up))
+               {
+                       kfree_skb(skb);
+                       return 0;
+               }
+        }
+
+       if (queue_index == TXCMD_QUEUE) {
+               rtl819xE_tx_cmd(priv, skb);
+               ret = 0;
+               return ret;
+       } else {
+               tcb_desc->RATRIndex = 7;
+               tcb_desc->bTxDisableRateFallBack = 1;
+               tcb_desc->bTxUseDriverAssingedRate = 1;
+               tcb_desc->bTxEnableFwCalcDur = 1;
+               skb_push(skb, ieee80211->tx_headroom);
+               ret = rtl8192_tx(priv, skb);
+               if (ret != 0) {
+                       kfree_skb(skb);
+               }
+       }
+
+       return ret;
+}
+
+
+static void rtl8192_tx_isr(struct r8192_priv *priv, int prio)
+{
+       struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+       while (skb_queue_len(&ring->queue)) {
+               tx_desc_819x_pci *entry = &ring->desc[ring->idx];
+               struct sk_buff *skb;
+
+               /*
+                * beacon packet will only use the first descriptor defaultly,
+                * and the OWN may not be cleared by the hardware
+                */
+               if (prio != BEACON_QUEUE) {
+                       if (entry->OWN)
+                               return;
+                       ring->idx = (ring->idx + 1) % ring->entries;
+               }
+
+               skb = __skb_dequeue(&ring->queue);
+               pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+                                skb->len, PCI_DMA_TODEVICE);
+
+               kfree_skb(skb);
+       }
+
+       if (prio != BEACON_QUEUE) {
+               /* try to deal with the pending packets  */
+               tasklet_schedule(&priv->irq_tx_tasklet);
+       }
+}
+
+static void rtl8192_stop_beacon(struct ieee80211_device *ieee80211)
+{
+}
+
+static void rtl8192_config_rate(struct r8192_priv *priv, u16* rate_config)
+{
+        struct ieee80211_network *net;
+        u8 i=0, basic_rate = 0;
+        net = & priv->ieee80211->current_network;
+
+        for (i=0; i<net->rates_len; i++)
+        {
+                basic_rate = net->rates[i]&0x7f;
+                switch(basic_rate)
+                {
+                        case MGN_1M:   *rate_config |= RRSR_1M;        break;
+                        case MGN_2M:   *rate_config |= RRSR_2M;        break;
+                        case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
+                        case MGN_11M:  *rate_config |= RRSR_11M;       break;
+                        case MGN_6M:   *rate_config |= RRSR_6M;        break;
+                        case MGN_9M:   *rate_config |= RRSR_9M;        break;
+                        case MGN_12M:  *rate_config |= RRSR_12M;       break;
+                        case MGN_18M:  *rate_config |= RRSR_18M;       break;
+                        case MGN_24M:  *rate_config |= RRSR_24M;       break;
+                        case MGN_36M:  *rate_config |= RRSR_36M;       break;
+                        case MGN_48M:  *rate_config |= RRSR_48M;       break;
+                        case MGN_54M:  *rate_config |= RRSR_54M;       break;
+                }
+        }
+        for (i=0; i<net->rates_ex_len; i++)
+        {
+                basic_rate = net->rates_ex[i]&0x7f;
+                switch(basic_rate)
+                {
+                        case MGN_1M:   *rate_config |= RRSR_1M;        break;
+                        case MGN_2M:   *rate_config |= RRSR_2M;        break;
+                        case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
+                        case MGN_11M:  *rate_config |= RRSR_11M;       break;
+                        case MGN_6M:   *rate_config |= RRSR_6M;        break;
+                        case MGN_9M:   *rate_config |= RRSR_9M;        break;
+                        case MGN_12M:  *rate_config |= RRSR_12M;       break;
+                        case MGN_18M:  *rate_config |= RRSR_18M;       break;
+                        case MGN_24M:  *rate_config |= RRSR_24M;       break;
+                        case MGN_36M:  *rate_config |= RRSR_36M;       break;
+                        case MGN_48M:  *rate_config |= RRSR_48M;       break;
+                        case MGN_54M:  *rate_config |= RRSR_54M;       break;
+                }
+        }
+}
+
+
+#define SHORT_SLOT_TIME 9
+#define NON_SHORT_SLOT_TIME 20
+
+static void rtl8192_update_cap(struct r8192_priv *priv, u16 cap)
+{
+       u32 tmp = 0;
+       struct ieee80211_network *net = &priv->ieee80211->current_network;
+
+       priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
+       tmp = priv->basic_rate;
+       if (priv->short_preamble)
+               tmp |= BRSR_AckShortPmb;
+       write_nic_dword(priv, RRSR, tmp);
+
+       if (net->mode & (IEEE_G|IEEE_N_24G))
+       {
+               u8 slot_time = 0;
+               if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
+               {//short slot time
+                       slot_time = SHORT_SLOT_TIME;
+               }
+               else //long slot time
+                       slot_time = NON_SHORT_SLOT_TIME;
+               priv->slot_time = slot_time;
+               write_nic_byte(priv, SLOT_TIME, slot_time);
+       }
+
+}
+
+static void rtl8192_net_update(struct r8192_priv *priv)
+{
+       struct ieee80211_network *net;
+       u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
+       u16 rate_config = 0;
+       net = &priv->ieee80211->current_network;
+
+       /* update Basic rate: RR, BRSR */
+       rtl8192_config_rate(priv, &rate_config);
+
+       /*
+        * Select RRSR (in Legacy-OFDM and CCK)
+        * For 8190, we select only 24M, 12M, 6M, 11M, 5.5M,
+        * 2M, and 1M from the Basic rate.
+        * We do not use other rates.
+        */
+       priv->basic_rate = rate_config &= 0x15f;
+
+       /* BSSID */
+       write_nic_dword(priv, BSSIDR, ((u32 *)net->bssid)[0]);
+       write_nic_word(priv, BSSIDR+4, ((u16 *)net->bssid)[2]);
+
+       if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
+       {
+               write_nic_word(priv, ATIMWND, 2);
+               write_nic_word(priv, BCN_DMATIME, 256);
+               write_nic_word(priv, BCN_INTERVAL, net->beacon_interval);
+               /*
+                * BIT15 of BCN_DRV_EARLY_INT will indicate
+                * whether software beacon or hw beacon is applied.
+                */
+               write_nic_word(priv, BCN_DRV_EARLY_INT, 10);
+               write_nic_byte(priv, BCN_ERR_THRESH, 100);
+
+               BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
+               /* TODO: BcnIFS may required to be changed on ASIC */
+               BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
+               write_nic_word(priv, BCN_TCFG, BcnTimeCfg);
+       }
+}
+
+static void rtl819xE_tx_cmd(struct r8192_priv *priv, struct sk_buff *skb)
+{
+    struct rtl8192_tx_ring *ring;
+    tx_desc_819x_pci *entry;
+    unsigned int idx;
+    dma_addr_t mapping;
+    cb_desc *tcb_desc;
+    unsigned long flags;
+
+    ring = &priv->tx_ring[TXCMD_QUEUE];
+    mapping = pci_map_single(priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+
+    spin_lock_irqsave(&priv->irq_th_lock,flags);
+    idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+    entry = &ring->desc[idx];
+
+    tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+    memset(entry,0,12);
+    entry->LINIP = tcb_desc->bLastIniPkt;
+    entry->FirstSeg = 1;//first segment
+    entry->LastSeg = 1; //last segment
+    if(tcb_desc->bCmdOrInit == DESC_PACKET_TYPE_INIT) {
+        entry->CmdInit = DESC_PACKET_TYPE_INIT;
+    } else {
+        entry->CmdInit = DESC_PACKET_TYPE_NORMAL;
+        entry->Offset = sizeof(TX_FWINFO_8190PCI) + 8;
+        entry->PktSize = (u16)(tcb_desc->pkt_size + entry->Offset);
+        entry->QueueSelect = QSLT_CMD;
+        entry->TxFWInfoSize = 0x08;
+        entry->RATid = (u8)DESC_PACKET_TYPE_INIT;
+    }
+    entry->TxBufferSize = skb->len;
+    entry->TxBuffAddr = cpu_to_le32(mapping);
+    entry->OWN = 1;
+
+    __skb_queue_tail(&ring->queue, skb);
+    spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+
+    write_nic_byte(priv, TPPoll, TPPoll_CQ);
+
+    return;
+}
+
+/*
+ * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
+ * in TxFwInfo data structure
+ */
+static u8 MapHwQueueToFirmwareQueue(u8 QueueID)
+{
+       u8 QueueSelect = 0;
+
+       switch (QueueID) {
+       case BE_QUEUE:
+               QueueSelect = QSLT_BE;
+               break;
+
+       case BK_QUEUE:
+               QueueSelect = QSLT_BK;
+               break;
+
+       case VO_QUEUE:
+               QueueSelect = QSLT_VO;
+               break;
+
+       case VI_QUEUE:
+               QueueSelect = QSLT_VI;
+               break;
+
+       case MGNT_QUEUE:
+               QueueSelect = QSLT_MGNT;
+               break;
+
+       case BEACON_QUEUE:
+               QueueSelect = QSLT_BEACON;
+               break;
+
+       case TXCMD_QUEUE:
+               QueueSelect = QSLT_CMD;
+               break;
+
+       case HIGH_QUEUE:
+       default:
+               RT_TRACE(COMP_ERR, "Impossible Queue Selection: %d\n", QueueID);
+               break;
+       }
+       return QueueSelect;
+}
+
+static u8 MRateToHwRate8190Pci(u8 rate)
+{
+       u8  ret = DESC90_RATE1M;
+
+       switch(rate) {
+               case MGN_1M:    ret = DESC90_RATE1M;            break;
+               case MGN_2M:    ret = DESC90_RATE2M;            break;
+               case MGN_5_5M:  ret = DESC90_RATE5_5M;  break;
+               case MGN_11M:   ret = DESC90_RATE11M;   break;
+               case MGN_6M:    ret = DESC90_RATE6M;            break;
+               case MGN_9M:    ret = DESC90_RATE9M;            break;
+               case MGN_12M:   ret = DESC90_RATE12M;   break;
+               case MGN_18M:   ret = DESC90_RATE18M;   break;
+               case MGN_24M:   ret = DESC90_RATE24M;   break;
+               case MGN_36M:   ret = DESC90_RATE36M;   break;
+               case MGN_48M:   ret = DESC90_RATE48M;   break;
+               case MGN_54M:   ret = DESC90_RATE54M;   break;
+
+               // HT rate since here
+               case MGN_MCS0:  ret = DESC90_RATEMCS0;  break;
+               case MGN_MCS1:  ret = DESC90_RATEMCS1;  break;
+               case MGN_MCS2:  ret = DESC90_RATEMCS2;  break;
+               case MGN_MCS3:  ret = DESC90_RATEMCS3;  break;
+               case MGN_MCS4:  ret = DESC90_RATEMCS4;  break;
+               case MGN_MCS5:  ret = DESC90_RATEMCS5;  break;
+               case MGN_MCS6:  ret = DESC90_RATEMCS6;  break;
+               case MGN_MCS7:  ret = DESC90_RATEMCS7;  break;
+               case MGN_MCS8:  ret = DESC90_RATEMCS8;  break;
+               case MGN_MCS9:  ret = DESC90_RATEMCS9;  break;
+               case MGN_MCS10: ret = DESC90_RATEMCS10; break;
+               case MGN_MCS11: ret = DESC90_RATEMCS11; break;
+               case MGN_MCS12: ret = DESC90_RATEMCS12; break;
+               case MGN_MCS13: ret = DESC90_RATEMCS13; break;
+               case MGN_MCS14: ret = DESC90_RATEMCS14; break;
+               case MGN_MCS15: ret = DESC90_RATEMCS15; break;
+               case (0x80|0x20): ret = DESC90_RATEMCS32; break;
+
+               default:       break;
+       }
+       return ret;
+}
+
+
+static u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
+{
+       u8   tmp_Short;
+
+       tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
+
+       if(TxHT==1 && TxRate != DESC90_RATEMCS15)
+               tmp_Short = 0;
+
+       return tmp_Short;
+}
+
+/*
+ * The tx procedure is just as following,
+ * skb->cb will contain all the following information,
+ * priority, morefrag, rate, &dev.
+ */
+static short rtl8192_tx(struct r8192_priv *priv, struct sk_buff* skb)
+{
+       struct rtl8192_tx_ring *ring;
+       unsigned long flags;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       tx_desc_819x_pci *pdesc = NULL;
+       TX_FWINFO_8190PCI *pTxFwInfo = NULL;
+       dma_addr_t mapping;
+       bool multi_addr = false, broad_addr = false, uni_addr = false;
+       u8 *pda_addr = NULL;
+       int idx;
+
+       if (priv->bdisable_nic) {
+               RT_TRACE(COMP_ERR, "Nic is disabled! Can't tx packet len=%d qidx=%d!!!\n",
+                        skb->len, tcb_desc->queue_index);
+               return skb->len;
+       }
+
+#ifdef ENABLE_LPS
+       priv->ieee80211->bAwakePktSent = true;
+#endif
+
+       mapping = pci_map_single(priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+
+       /* collect the tx packets statitcs */
+       pda_addr = ((u8 *)skb->data) + sizeof(TX_FWINFO_8190PCI);
+       if (is_multicast_ether_addr(pda_addr))
+               multi_addr = true;
+       else if (is_broadcast_ether_addr(pda_addr))
+               broad_addr = true;
+       else
+               uni_addr = true;
+
+       if (uni_addr)
+               priv->stats.txbytesunicast += (u8)(skb->len) - sizeof(TX_FWINFO_8190PCI);
+
+       /* fill tx firmware */
+       pTxFwInfo = (PTX_FWINFO_8190PCI)skb->data;
+       memset(pTxFwInfo, 0, sizeof(TX_FWINFO_8190PCI));
+       pTxFwInfo->TxHT = (tcb_desc->data_rate&0x80) ? 1 : 0;
+       pTxFwInfo->TxRate = MRateToHwRate8190Pci((u8)tcb_desc->data_rate);
+       pTxFwInfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
+       pTxFwInfo->Short = QueryIsShort(pTxFwInfo->TxHT, pTxFwInfo->TxRate, tcb_desc);
+
+       /* Aggregation related */
+       if (tcb_desc->bAMPDUEnable) {
+               pTxFwInfo->AllowAggregation = 1;
+               pTxFwInfo->RxMF = tcb_desc->ampdu_factor;
+               pTxFwInfo->RxAMD = tcb_desc->ampdu_density;
+       } else {
+               pTxFwInfo->AllowAggregation = 0;
+               pTxFwInfo->RxMF = 0;
+               pTxFwInfo->RxAMD = 0;
+       }
+
+       /* Protection mode related */
+       pTxFwInfo->RtsEnable = (tcb_desc->bRTSEnable) ? 1 : 0;
+       pTxFwInfo->CtsEnable = (tcb_desc->bCTSEnable) ? 1 : 0;
+       pTxFwInfo->RtsSTBC = (tcb_desc->bRTSSTBC) ? 1 : 0;
+       pTxFwInfo->RtsHT = (tcb_desc->rts_rate&0x80) ? 1 : 0;
+       pTxFwInfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
+       pTxFwInfo->RtsBandwidth = 0;
+       pTxFwInfo->RtsSubcarrier = tcb_desc->RTSSC;
+       pTxFwInfo->RtsShort = (pTxFwInfo->RtsHT == 0) ? (tcb_desc->bRTSUseShortPreamble ? 1 : 0) : (tcb_desc->bRTSUseShortGI? 1 : 0);
+
+       /* Set Bandwidth and sub-channel settings. */
+       if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
+               if (tcb_desc->bPacketBW) {
+                       pTxFwInfo->TxBandwidth = 1;
+                       /* use duplicated mode */
+                       pTxFwInfo->TxSubCarrier = 0;
+               } else {
+                       pTxFwInfo->TxBandwidth = 0;
+                       pTxFwInfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
+               }
+       } else {
+               pTxFwInfo->TxBandwidth = 0;
+               pTxFwInfo->TxSubCarrier = 0;
+       }
+
+       spin_lock_irqsave(&priv->irq_th_lock, flags);
+       ring = &priv->tx_ring[tcb_desc->queue_index];
+       if (tcb_desc->queue_index != BEACON_QUEUE)
+               idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+       else
+               idx = 0;
+
+       pdesc = &ring->desc[idx];
+       if ((pdesc->OWN == 1) && (tcb_desc->queue_index != BEACON_QUEUE)) {
+               RT_TRACE(COMP_ERR, "No more TX desc@%d, ring->idx = %d,idx = %d,%x\n",
+                        tcb_desc->queue_index, ring->idx, idx, skb->len);
+               spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+               return skb->len;
+       }
+
+       /* fill tx descriptor */
+       memset(pdesc, 0, 12);
+
+       /*DWORD 0*/
+       pdesc->LINIP = 0;
+       pdesc->CmdInit = 1;
+       pdesc->Offset = sizeof(TX_FWINFO_8190PCI) + 8; /* We must add 8!! */
+       pdesc->PktSize = (u16)skb->len-sizeof(TX_FWINFO_8190PCI);
+
+       /*DWORD 1*/
+       pdesc->SecCAMID = 0;
+       pdesc->RATid = tcb_desc->RATRIndex;
+
+       pdesc->NoEnc = 1;
+       pdesc->SecType = 0x0;
+       if (tcb_desc->bHwSec) {
+               switch (priv->ieee80211->pairwise_key_type) {
+               case KEY_TYPE_WEP40:
+               case KEY_TYPE_WEP104:
+                       pdesc->SecType = 0x1;
+                       pdesc->NoEnc = 0;
+                       break;
+               case KEY_TYPE_TKIP:
+                       pdesc->SecType = 0x2;
+                       pdesc->NoEnc = 0;
+                       break;
+               case KEY_TYPE_CCMP:
+                       pdesc->SecType = 0x3;
+                       pdesc->NoEnc = 0;
+                       break;
+               case KEY_TYPE_NA:
+                       pdesc->SecType = 0x0;
+                       pdesc->NoEnc = 1;
+                       break;
+               }
+       }
+
+       /* Set Packet ID */
+       pdesc->PktId = 0x0;
+
+       pdesc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
+       pdesc->TxFWInfoSize = sizeof(TX_FWINFO_8190PCI);
+
+       pdesc->DISFB = tcb_desc->bTxDisableRateFallBack;
+       pdesc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
+
+       pdesc->FirstSeg = 1;
+       pdesc->LastSeg = 1;
+       pdesc->TxBufferSize = skb->len;
+
+       pdesc->TxBuffAddr = cpu_to_le32(mapping);
+       __skb_queue_tail(&ring->queue, skb);
+       pdesc->OWN = 1;
+       spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+       priv->ieee80211->dev->trans_start = jiffies;
+       write_nic_word(priv, TPPoll, 0x01<<tcb_desc->queue_index);
+       return 0;
+}
+
+static short rtl8192_alloc_rx_desc_ring(struct r8192_priv *priv)
+{
+    rx_desc_819x_pci *entry = NULL;
+    int i;
+
+    priv->rx_ring = pci_alloc_consistent(priv->pdev,
+            sizeof(*priv->rx_ring) * priv->rxringcount, &priv->rx_ring_dma);
+
+    if (!priv->rx_ring || (unsigned long)priv->rx_ring & 0xFF) {
+        RT_TRACE(COMP_ERR,"Cannot allocate RX ring\n");
+        return -ENOMEM;
+    }
+
+    memset(priv->rx_ring, 0, sizeof(*priv->rx_ring) * priv->rxringcount);
+    priv->rx_idx = 0;
+
+    for (i = 0; i < priv->rxringcount; i++) {
+        struct sk_buff *skb = dev_alloc_skb(priv->rxbuffersize);
+        dma_addr_t *mapping;
+        entry = &priv->rx_ring[i];
+        if (!skb)
+            return 0;
+        priv->rx_buf[i] = skb;
+        mapping = (dma_addr_t *)skb->cb;
+        *mapping = pci_map_single(priv->pdev, skb_tail_pointer(skb),
+                priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+
+        entry->BufferAddress = cpu_to_le32(*mapping);
+
+        entry->Length = priv->rxbuffersize;
+        entry->OWN = 1;
+    }
+
+    entry->EOR = 1;
+    return 0;
+}
+
+static int rtl8192_alloc_tx_desc_ring(struct r8192_priv *priv,
+        unsigned int prio, unsigned int entries)
+{
+    tx_desc_819x_pci *ring;
+    dma_addr_t dma;
+    int i;
+
+    ring = pci_alloc_consistent(priv->pdev, sizeof(*ring) * entries, &dma);
+    if (!ring || (unsigned long)ring & 0xFF) {
+        RT_TRACE(COMP_ERR, "Cannot allocate TX ring (prio = %d)\n", prio);
+        return -ENOMEM;
+    }
+
+    memset(ring, 0, sizeof(*ring)*entries);
+    priv->tx_ring[prio].desc = ring;
+    priv->tx_ring[prio].dma = dma;
+    priv->tx_ring[prio].idx = 0;
+    priv->tx_ring[prio].entries = entries;
+    skb_queue_head_init(&priv->tx_ring[prio].queue);
+
+    for (i = 0; i < entries; i++)
+        ring[i].NextDescAddress =
+            cpu_to_le32((u32)dma + ((i + 1) % entries) * sizeof(*ring));
+
+    return 0;
+}
+
+static short rtl8192_pci_initdescring(struct r8192_priv *priv)
+{
+       u32 ret;
+       int i;
+
+       ret = rtl8192_alloc_rx_desc_ring(priv);
+       if (ret)
+               return ret;
+
+       /* general process for other queue */
+       for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+               ret = rtl8192_alloc_tx_desc_ring(priv, i, priv->txringcount);
+               if (ret)
+                       goto err_free_rings;
+       }
+
+       return 0;
+
+err_free_rings:
+       rtl8192_free_rx_ring(priv);
+       for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+               if (priv->tx_ring[i].desc)
+                       rtl8192_free_tx_ring(priv, i);
+       return 1;
+}
+
+static void rtl8192_pci_resetdescring(struct r8192_priv *priv)
+{
+    int i;
+
+    /* force the rx_idx to the first one */
+    if(priv->rx_ring) {
+        rx_desc_819x_pci *entry = NULL;
+        for (i = 0; i < priv->rxringcount; i++) {
+            entry = &priv->rx_ring[i];
+            entry->OWN = 1;
+        }
+        priv->rx_idx = 0;
+    }
+
+    /* after reset, release previous pending packet, and force the
+     * tx idx to the first one */
+    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+        if (priv->tx_ring[i].desc) {
+            struct rtl8192_tx_ring *ring = &priv->tx_ring[i];
+
+            while (skb_queue_len(&ring->queue)) {
+                tx_desc_819x_pci *entry = &ring->desc[ring->idx];
+                struct sk_buff *skb = __skb_dequeue(&ring->queue);
+
+                pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+                        skb->len, PCI_DMA_TODEVICE);
+                kfree_skb(skb);
+                ring->idx = (ring->idx + 1) % ring->entries;
+            }
+            ring->idx = 0;
+        }
+    }
+}
+
+static void rtl8192_link_change(struct ieee80211_device *ieee)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+
+       if (ieee->state == IEEE80211_LINKED)
+       {
+               rtl8192_net_update(priv);
+               rtl8192_update_ratr_table(priv);
+
+               //add this as in pure N mode, wep encryption will use software way, but there is no chance to set this as wep will not set group key in wext. WB.2008.07.08
+               if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
+               EnableHWSecurityConfig8192(priv);
+       }
+       else
+       {
+               write_nic_byte(priv, 0x173, 0);
+       }
+
+       rtl8192_update_msr(priv);
+
+       // 2007/10/16 MH MAC Will update TSF according to all received beacon, so we have
+       //      // To set CBSSID bit when link with any AP or STA.
+       if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
+       {
+               u32 reg = 0;
+               reg = read_nic_dword(priv, RCR);
+               if (priv->ieee80211->state == IEEE80211_LINKED)
+                       priv->ReceiveConfig = reg |= RCR_CBSSID;
+               else
+                       priv->ReceiveConfig = reg &= ~RCR_CBSSID;
+               write_nic_dword(priv, RCR, reg);
+       }
+}
+
+
+static const struct ieee80211_qos_parameters def_qos_parameters = {
+        {3,3,3,3},/* cw_min */
+        {7,7,7,7},/* cw_max */
+        {2,2,2,2},/* aifs */
+        {0,0,0,0},/* flags */
+        {0,0,0,0} /* tx_op_limit */
+};
+
+static void rtl8192_update_beacon(struct work_struct * work)
+{
+        struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
+       struct ieee80211_device* ieee = priv->ieee80211;
+       struct ieee80211_network* net = &ieee->current_network;
+
+       if (ieee->pHTInfo->bCurrentHTSupport)
+               HTUpdateSelfAndPeerSetting(ieee, net);
+       ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
+       rtl8192_update_cap(priv, net->capability);
+}
+
+/*
+* background support to run QoS activate functionality
+*/
+static const int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
+static void rtl8192_qos_activate(struct work_struct * work)
+{
+        struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
+        struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
+        u8 mode = priv->ieee80211->current_network.mode;
+       u8  u1bAIFS;
+       u32 u4bAcParam;
+        int i;
+
+        mutex_lock(&priv->mutex);
+        if(priv->ieee80211->state != IEEE80211_LINKED)
+               goto success;
+       RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
+       /* It better set slot time at first */
+       /* For we just support b/g mode at present, let the slot time at 9/20 selection */
+       /* update the ac parameter to related registers */
+       for(i = 0; i <  QOS_QUEUE_NUM; i++) {
+               //Mode G/A: slotTimeTimer = 9; Mode B: 20
+               u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
+               u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
+                               (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
+                               (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
+                               ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
+               write_nic_dword(priv, WDCAPARA_ADD[i], u4bAcParam);
+       }
+
+success:
+        mutex_unlock(&priv->mutex);
+}
+
+static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
+               int active_network,
+               struct ieee80211_network *network)
+{
+       int ret = 0;
+       u32 size = sizeof(struct ieee80211_qos_parameters);
+
+       if(priv->ieee80211->state !=IEEE80211_LINKED)
+                return ret;
+
+        if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
+                return ret;
+
+       if (network->flags & NETWORK_HAS_QOS_MASK) {
+               if (active_network &&
+                               (network->flags & NETWORK_HAS_QOS_PARAMETERS))
+                       network->qos_data.active = network->qos_data.supported;
+
+               if ((network->qos_data.active == 1) && (active_network == 1) &&
+                               (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
+                               (network->qos_data.old_param_count !=
+                                network->qos_data.param_count)) {
+                       network->qos_data.old_param_count =
+                               network->qos_data.param_count;
+                       queue_work(priv->priv_wq, &priv->qos_activate);
+                       RT_TRACE (COMP_QOS, "QoS parameters change call "
+                                       "qos_activate\n");
+               }
+       } else {
+               memcpy(&priv->ieee80211->current_network.qos_data.parameters,
+                      &def_qos_parameters, size);
+
+               if ((network->qos_data.active == 1) && (active_network == 1)) {
+                       queue_work(priv->priv_wq, &priv->qos_activate);
+                       RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate\n");
+               }
+               network->qos_data.active = 0;
+               network->qos_data.supported = 0;
+       }
+
+       return 0;
+}
+
+/* handle manage frame frame beacon and probe response */
+static int rtl8192_handle_beacon(struct ieee80211_device *ieee,
+                              struct ieee80211_beacon * beacon,
+                              struct ieee80211_network * network)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+
+       rtl8192_qos_handle_probe_response(priv,1,network);
+
+       queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
+       return 0;
+
+}
+
+/*
+ * handling the beaconing responses. if we get different QoS setting
+ * off the network from the associated setting, adjust the QoS setting
+ */
+static int rtl8192_qos_association_resp(struct r8192_priv *priv,
+                                    struct ieee80211_network *network)
+{
+       int ret = 0;
+       unsigned long flags;
+       u32 size = sizeof(struct ieee80211_qos_parameters);
+       int set_qos_param = 0;
+
+       if ((priv == NULL) || (network == NULL))
+               return ret;
+
+       if (priv->ieee80211->state != IEEE80211_LINKED)
+               return ret;
+
+       if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
+               return ret;
+
+       spin_lock_irqsave(&priv->ieee80211->lock, flags);
+       if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
+               memcpy(&priv->ieee80211->current_network.qos_data.parameters,
+                        &network->qos_data.parameters,
+                       sizeof(struct ieee80211_qos_parameters));
+               priv->ieee80211->current_network.qos_data.active = 1;
+               set_qos_param = 1;
+               /* update qos parameter for current network */
+               priv->ieee80211->current_network.qos_data.old_param_count =
+                       priv->ieee80211->current_network.qos_data.param_count;
+               priv->ieee80211->current_network.qos_data.param_count =
+                       network->qos_data.param_count;
+
+       } else {
+               memcpy(&priv->ieee80211->current_network.qos_data.parameters,
+                      &def_qos_parameters, size);
+               priv->ieee80211->current_network.qos_data.active = 0;
+               priv->ieee80211->current_network.qos_data.supported = 0;
+               set_qos_param = 1;
+       }
+
+       spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
+
+       RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n", __FUNCTION__,
+               network->flags, priv->ieee80211->current_network.qos_data.active);
+       if (set_qos_param == 1)
+               queue_work(priv->priv_wq, &priv->qos_activate);
+
+       return ret;
+}
+
+
+static int rtl8192_handle_assoc_response(struct ieee80211_device *ieee,
+                                     struct ieee80211_assoc_response_frame *resp,
+                                     struct ieee80211_network *network)
+{
+        struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+        rtl8192_qos_association_resp(priv, network);
+        return 0;
+}
+
+
+/* updateRATRTabel for MCS only. Basic rate is not implemented. */
+static void rtl8192_update_ratr_table(struct r8192_priv* priv)
+{
+       struct ieee80211_device* ieee = priv->ieee80211;
+       u8* pMcsRate = ieee->dot11HTOperationalRateSet;
+       u32 ratr_value = 0;
+       u8 rate_index = 0;
+
+       rtl8192_config_rate(priv, (u16*)(&ratr_value));
+       ratr_value |= (*(u16*)(pMcsRate)) << 12;
+
+       switch (ieee->mode)
+       {
+               case IEEE_A:
+                       ratr_value &= 0x00000FF0;
+                       break;
+               case IEEE_B:
+                       ratr_value &= 0x0000000F;
+                       break;
+               case IEEE_G:
+                       ratr_value &= 0x00000FF7;
+                       break;
+               case IEEE_N_24G:
+               case IEEE_N_5G:
+                       if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
+                               ratr_value &= 0x0007F007;
+                       else{
+                               if (priv->rf_type == RF_1T2R)
+                                       ratr_value &= 0x000FF007;
+                               else
+                                       ratr_value &= 0x0F81F007;
+                       }
+                       break;
+               default:
+                       break;
+       }
+       ratr_value &= 0x0FFFFFFF;
+       if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
+               ratr_value |= 0x80000000;
+       }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
+               ratr_value |= 0x80000000;
+       }
+       write_nic_dword(priv, RATR0+rate_index*4, ratr_value);
+       write_nic_byte(priv, UFWP, 1);
+}
+
+static bool GetNmodeSupportBySecCfg8190Pci(struct ieee80211_device *ieee)
+{
+       return !(ieee->rtllib_ap_sec_type &&
+                (ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_WEP|SEC_ALG_TKIP)));
+}
+
+static void rtl8192_refresh_supportrate(struct r8192_priv* priv)
+{
+       struct ieee80211_device* ieee = priv->ieee80211;
+       //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
+       if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
+       {
+               memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
+       }
+       else
+               memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
+}
+
+static u8 rtl8192_getSupportedWireleeMode(void)
+{
+       return (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
+}
+
+static void rtl8192_SetWirelessMode(struct ieee80211_device *ieee, u8 wireless_mode)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+       u8 bSupportMode = rtl8192_getSupportedWireleeMode();
+
+       if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
+       {
+               if(bSupportMode & WIRELESS_MODE_N_24G)
+               {
+                       wireless_mode = WIRELESS_MODE_N_24G;
+               }
+               else if(bSupportMode & WIRELESS_MODE_N_5G)
+               {
+                       wireless_mode = WIRELESS_MODE_N_5G;
+               }
+               else if((bSupportMode & WIRELESS_MODE_A))
+               {
+                       wireless_mode = WIRELESS_MODE_A;
+               }
+               else if((bSupportMode & WIRELESS_MODE_G))
+               {
+                       wireless_mode = WIRELESS_MODE_G;
+               }
+               else if((bSupportMode & WIRELESS_MODE_B))
+               {
+                       wireless_mode = WIRELESS_MODE_B;
+               }
+               else{
+                       RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
+                       wireless_mode = WIRELESS_MODE_B;
+               }
+       }
+       priv->ieee80211->mode = wireless_mode;
+
+       if ((wireless_mode == WIRELESS_MODE_N_24G) ||  (wireless_mode == WIRELESS_MODE_N_5G))
+               priv->ieee80211->pHTInfo->bEnableHT = 1;
+       else
+               priv->ieee80211->pHTInfo->bEnableHT = 0;
+       RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
+       rtl8192_refresh_supportrate(priv);
+}
+
+static bool GetHalfNmodeSupportByAPs819xPci(struct ieee80211_device* ieee)
+{
+       return ieee->bHalfWirelessN24GMode;
+}
+
+static short rtl8192_is_tx_queue_empty(struct ieee80211_device *ieee)
+{
+       int i=0;
+       struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+
+       for (i=0; i<=MGNT_QUEUE; i++)
+       {
+               if ((i== TXCMD_QUEUE) || (i == HCCA_QUEUE) )
+                       continue;
+               if (skb_queue_len(&(&priv->tx_ring[i])->queue) > 0){
+                       printk("===>tx queue is not empty:%d, %d\n", i, skb_queue_len(&(&priv->tx_ring[i])->queue));
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+static void rtl8192_hw_sleep_down(struct r8192_priv *priv)
+{
+       MgntActSet_RF_State(priv, eRfSleep, RF_CHANGE_BY_PS);
+}
+
+static void rtl8192_hw_wakeup(struct ieee80211_device *ieee)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+       MgntActSet_RF_State(priv, eRfOn, RF_CHANGE_BY_PS);
+}
+
+static void rtl8192_hw_wakeup_wq (struct work_struct *work)
+{
+       struct delayed_work *dwork = container_of(work,struct delayed_work,work);
+       struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_wakeup_wq);
+
+       rtl8192_hw_wakeup(ieee);
+}
+
+#define MIN_SLEEP_TIME 50
+#define MAX_SLEEP_TIME 10000
+static void rtl8192_hw_to_sleep(struct ieee80211_device *ieee, u32 th, u32 tl)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+       u32 tmp;
+       u32 rb = jiffies;
+
+       // Writing HW register with 0 equals to disable
+       // the timer, that is not really what we want
+       //
+       tl -= MSECS(8+16+7);
+
+       // If the interval in witch we are requested to sleep is too
+       // short then give up and remain awake
+       // when we sleep after send null frame, the timer will be too short to sleep.
+       //
+       if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
+                       ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
+               printk("too short to sleep::%x, %x, %lx\n",tl, rb,  MSECS(MIN_SLEEP_TIME));
+               return;
+       }
+
+       if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
+                       ((tl < rb) && (tl>MSECS(69)) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))||
+                       ((tl<rb)&&(tl<MSECS(69))&&((tl+0xffffffff-rb)>MSECS(MAX_SLEEP_TIME)))) {
+               printk("========>too long to sleep:%x, %x, %lx\n", tl, rb,  MSECS(MAX_SLEEP_TIME));
+               return;
+       }
+
+       tmp = (tl>rb)?(tl-rb):(rb-tl);
+       queue_delayed_work(priv->ieee80211->wq,
+                          &priv->ieee80211->hw_wakeup_wq,tmp);
+
+        rtl8192_hw_sleep_down(priv);
+}
+
+static void rtl8192_init_priv_variable(struct r8192_priv *priv)
+{
+       u8 i;
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+
+       // Default Halt the NIC if RF is OFF.
+       pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_HALT_NIC;
+       pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_CLK_REQ;
+       pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_ASPM;
+       pPSC->RegRfPsLevel |= RT_RF_LPS_LEVEL_ASPM;
+       pPSC->bLeisurePs = true;
+       priv->ieee80211->RegMaxLPSAwakeIntvl = 5;
+       priv->bHwRadioOff = false;
+
+       priv->being_init_adapter = false;
+       priv->txringcount = 64;//32;
+       priv->rxbuffersize = 9100;//2048;//1024;
+       priv->rxringcount = MAX_RX_COUNT;//64;
+       priv->chan = 1; //set to channel 1
+       priv->RegWirelessMode = WIRELESS_MODE_AUTO;
+       priv->RegChannelPlan = 0xf;
+       priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
+       priv->ieee80211->iw_mode = IW_MODE_INFRA;
+       priv->ieee80211->ieee_up=0;
+       priv->retry_rts = DEFAULT_RETRY_RTS;
+       priv->retry_data = DEFAULT_RETRY_DATA;
+       priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
+       priv->ieee80211->rate = 110; //11 mbps
+       priv->ieee80211->short_slot = 1;
+       priv->promisc = (priv->ieee80211->dev->flags & IFF_PROMISC) ? 1:0;
+       priv->bcck_in_ch14 = false;
+       priv->CCKPresentAttentuation = 0;
+       priv->rfa_txpowertrackingindex = 0;
+       priv->rfc_txpowertrackingindex = 0;
+       priv->CckPwEnl = 6;
+       //added by amy for silent reset
+       priv->ResetProgress = RESET_TYPE_NORESET;
+       priv->bForcedSilentReset = 0;
+       priv->bDisableNormalResetCheck = false;
+       priv->force_reset = false;
+       //added by amy for power save
+       priv->RfOffReason = 0;
+       priv->bHwRfOffAction = 0;
+       priv->PowerSaveControl.bInactivePs = true;
+       priv->PowerSaveControl.bIPSModeBackup = false;
+
+       priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
+       priv->ieee80211->iw_mode = IW_MODE_INFRA;
+       priv->ieee80211->softmac_features  = IEEE_SOFTMAC_SCAN |
+               IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
+               IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;/* |
+               IEEE_SOFTMAC_BEACONS;*///added by amy 080604 //|  //IEEE_SOFTMAC_SINGLE_QUEUE;
+
+       priv->ieee80211->active_scan = 1;
+       priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
+       priv->ieee80211->host_encrypt = 1;
+       priv->ieee80211->host_decrypt = 1;
+       priv->ieee80211->start_send_beacons = rtl8192_start_beacon;
+       priv->ieee80211->stop_send_beacons = rtl8192_stop_beacon;
+       priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
+       priv->ieee80211->set_chan = rtl8192_set_chan;
+       priv->ieee80211->link_change = rtl8192_link_change;
+       priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
+       priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
+       priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
+       priv->ieee80211->init_wmmparam_flag = 0;
+       priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
+       priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
+       priv->ieee80211->tx_headroom = sizeof(TX_FWINFO_8190PCI);
+       priv->ieee80211->qos_support = 1;
+       priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
+       priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
+       priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
+
+       priv->ieee80211->sta_wake_up = rtl8192_hw_wakeup;
+       priv->ieee80211->enter_sleep_state = rtl8192_hw_to_sleep;
+       priv->ieee80211->ps_is_queue_empty = rtl8192_is_tx_queue_empty;
+       priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8190Pci;
+       priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
+       priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xPci;
+
+       priv->ieee80211->InitialGainHandler = InitialGain819xPci;
+
+#ifdef ENABLE_IPS
+       priv->ieee80211->ieee80211_ips_leave_wq = ieee80211_ips_leave_wq;
+       priv->ieee80211->ieee80211_ips_leave = ieee80211_ips_leave;
+#endif
+#ifdef ENABLE_LPS
+        priv->ieee80211->LeisurePSLeave            = LeisurePSLeave;
+#endif
+
+       priv->ieee80211->SetHwRegHandler = rtl8192e_SetHwReg;
+       priv->ieee80211->rtllib_ap_sec_type = rtl8192e_ap_sec_type;
+
+       priv->ShortRetryLimit = 0x30;
+       priv->LongRetryLimit = 0x30;
+
+       priv->ReceiveConfig = RCR_ADD3  |
+               RCR_AMF | RCR_ADF |             //accept management/data
+               RCR_AICV |                      //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
+               RCR_AB | RCR_AM | RCR_APM |     //accept BC/MC/UC
+               RCR_AAP | ((u32)7<<RCR_MXDMA_OFFSET) |
+               ((u32)7 << RCR_FIFO_OFFSET) | RCR_ONLYERLPKT;
+
+       priv->pFirmware = vzalloc(sizeof(rt_firmware));
+
+       /* rx related queue */
+       skb_queue_head_init(&priv->skb_queue);
+
+       /* Tx related queue */
+       for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
+       }
+       for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
+       }
+       priv->rf_set_chan = rtl8192_phy_SwChnl;
+}
+
+static void rtl8192_init_priv_lock(struct r8192_priv* priv)
+{
+       spin_lock_init(&priv->irq_th_lock);
+       spin_lock_init(&priv->rf_ps_lock);
+       sema_init(&priv->wx_sem,1);
+       sema_init(&priv->rf_sem,1);
+       mutex_init(&priv->mutex);
+}
+
+/* init tasklet and wait_queue here */
+#define DRV_NAME "wlan0"
+static void rtl8192_init_priv_task(struct r8192_priv *priv)
+{
+       priv->priv_wq = create_workqueue(DRV_NAME);
+
+#ifdef ENABLE_IPS
+       INIT_WORK(&priv->ieee80211->ips_leave_wq, IPSLeave_wq);
+#endif
+
+       INIT_WORK(&priv->reset_wq,  rtl8192_restart);
+       INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
+       INIT_DELAYED_WORK(&priv->txpower_tracking_wq,  dm_txpower_trackingcallback);
+       INIT_DELAYED_WORK(&priv->rfpath_check_wq,  dm_rf_pathcheck_workitemcallback);
+       INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
+       INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
+       INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq, rtl8192_hw_wakeup_wq);
+
+       tasklet_init(&priv->irq_rx_tasklet, rtl8192_irq_rx_tasklet,
+                    (unsigned long) priv);
+       tasklet_init(&priv->irq_tx_tasklet, rtl8192_irq_tx_tasklet,
+                    (unsigned long) priv);
+        tasklet_init(&priv->irq_prepare_beacon_tasklet, rtl8192_prepare_beacon,
+                    (unsigned long) priv);
+}
+
+static void rtl8192_get_eeprom_size(struct r8192_priv *priv)
+{
+       u16 curCR = 0;
+       RT_TRACE(COMP_INIT, "===========>%s()\n", __FUNCTION__);
+       curCR = read_nic_dword(priv, EPROM_CMD);
+       RT_TRACE(COMP_INIT, "read from Reg Cmd9346CR(%x):%x\n", EPROM_CMD, curCR);
+       //whether need I consider BIT5?
+       priv->epromtype = (curCR & EPROM_CMD_9356SEL) ? EPROM_93c56 : EPROM_93c46;
+       RT_TRACE(COMP_INIT, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
+}
+
+/*
+ * Adapter->EEPROMAddressSize should be set before this function call.
+ *  EEPROM address size can be got through GetEEPROMSize8185()
+ */
+static void rtl8192_read_eeprom_info(struct r8192_priv *priv)
+{
+       struct net_device *dev = priv->ieee80211->dev;
+       u8                      tempval;
+       u8                      ICVer8192, ICVer8256;
+       u16                     i,usValue, IC_Version;
+       u16                     EEPROMId;
+       u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x01};
+       RT_TRACE(COMP_INIT, "====> rtl8192_read_eeprom_info\n");
+
+
+       // TODO: I don't know if we need to apply EF function to EEPROM read function
+
+       //2 Read EEPROM ID to make sure autoload is success
+       EEPROMId = eprom_read(priv, 0);
+       if( EEPROMId != RTL8190_EEPROM_ID )
+       {
+               RT_TRACE(COMP_ERR, "EEPROM ID is invalid:%x, %x\n", EEPROMId, RTL8190_EEPROM_ID);
+               priv->AutoloadFailFlag=true;
+       }
+       else
+       {
+               priv->AutoloadFailFlag=false;
+       }
+
+       //
+       // Assign Chip Version ID
+       //
+       // Read IC Version && Channel Plan
+       if(!priv->AutoloadFailFlag)
+       {
+               // VID, PID
+               priv->eeprom_vid = eprom_read(priv, (EEPROM_VID >> 1));
+               priv->eeprom_did = eprom_read(priv, (EEPROM_DID >> 1));
+
+               usValue = eprom_read(priv, (u16)(EEPROM_Customer_ID>>1)) >> 8 ;
+               priv->eeprom_CustomerID = (u8)( usValue & 0xff);
+               usValue = eprom_read(priv, (EEPROM_ICVersion_ChannelPlan>>1));
+               priv->eeprom_ChannelPlan = usValue&0xff;
+               IC_Version = ((usValue&0xff00)>>8);
+
+               ICVer8192 = (IC_Version&0xf);           //bit0~3; 1:A cut, 2:B cut, 3:C cut...
+               ICVer8256 = ((IC_Version&0xf0)>>4);//bit4~6, bit7 reserved for other RF chip; 1:A cut, 2:B cut, 3:C cut...
+               RT_TRACE(COMP_INIT, "ICVer8192 = 0x%x\n", ICVer8192);
+               RT_TRACE(COMP_INIT, "ICVer8256 = 0x%x\n", ICVer8256);
+               if(ICVer8192 == 0x2)    //B-cut
+               {
+                       if(ICVer8256 == 0x5) //E-cut
+                               priv->card_8192_version= VERSION_8190_BE;
+               }
+
+               switch(priv->card_8192_version)
+               {
+                       case VERSION_8190_BD:
+                       case VERSION_8190_BE:
+                               break;
+                       default:
+                               priv->card_8192_version = VERSION_8190_BD;
+                               break;
+               }
+               RT_TRACE(COMP_INIT, "\nIC Version = 0x%x\n", priv->card_8192_version);
+       }
+       else
+       {
+               priv->card_8192_version = VERSION_8190_BD;
+               priv->eeprom_vid = 0;
+               priv->eeprom_did = 0;
+               priv->eeprom_CustomerID = 0;
+               priv->eeprom_ChannelPlan = 0;
+               RT_TRACE(COMP_INIT, "IC Version = 0x%x\n", 0xff);
+       }
+
+       RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
+       RT_TRACE(COMP_INIT, "EEPROM DID = 0x%4x\n", priv->eeprom_did);
+       RT_TRACE(COMP_INIT,"EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
+
+       //2 Read Permanent MAC address
+       if(!priv->AutoloadFailFlag)
+       {
+               for(i = 0; i < 6; i += 2)
+               {
+                       usValue = eprom_read(priv, (u16) ((EEPROM_NODE_ADDRESS_BYTE_0+i)>>1));
+                       *(u16*)(&dev->dev_addr[i]) = usValue;
+               }
+       } else {
+               // when auto load failed,  the last address byte set to be a random one.
+               // added by david woo.2007/11/7
+               memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
+       }
+
+       RT_TRACE(COMP_INIT, "Permanent Address = %pM\n", dev->dev_addr);
+
+               //2 TX Power Check EEPROM Fail or not
+       if(priv->card_8192_version > VERSION_8190_BD) {
+               priv->bTXPowerDataReadFromEEPORM = true;
+       } else {
+               priv->bTXPowerDataReadFromEEPORM = false;
+       }
+
+       // 2007/11/15 MH 8190PCI Default=2T4R, 8192PCIE default=1T2R
+       priv->rf_type = RTL819X_DEFAULT_RF_TYPE;
+
+       if(priv->card_8192_version > VERSION_8190_BD)
+       {
+               // Read RF-indication and Tx Power gain index diff of legacy to HT OFDM rate.
+               if(!priv->AutoloadFailFlag)
+               {
+                       tempval = (eprom_read(priv, (EEPROM_RFInd_PowerDiff>>1))) & 0xff;
+                       priv->EEPROMLegacyHTTxPowerDiff = tempval & 0xf;        // bit[3:0]
+
+                       if (tempval&0x80)       //RF-indication, bit[7]
+                               priv->rf_type = RF_1T2R;
+                       else
+                               priv->rf_type = RF_2T4R;
+               }
+               else
+               {
+                       priv->EEPROMLegacyHTTxPowerDiff = EEPROM_Default_LegacyHTTxPowerDiff;
+               }
+               RT_TRACE(COMP_INIT, "EEPROMLegacyHTTxPowerDiff = %d\n",
+                       priv->EEPROMLegacyHTTxPowerDiff);
+
+               // Read ThermalMeter from EEPROM
+               if(!priv->AutoloadFailFlag)
+               {
+                       priv->EEPROMThermalMeter = (u8)(((eprom_read(priv, (EEPROM_ThermalMeter>>1))) & 0xff00)>>8);
+               }
+               else
+               {
+                       priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
+               }
+               RT_TRACE(COMP_INIT, "ThermalMeter = %d\n", priv->EEPROMThermalMeter);
+               //vivi, for tx power track
+               priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
+
+               if(priv->epromtype == EPROM_93c46)
+               {
+               // Read antenna tx power offset of B/C/D to A and CrystalCap from EEPROM
+               if(!priv->AutoloadFailFlag)
+               {
+                               usValue = eprom_read(priv, (EEPROM_TxPwDiff_CrystalCap>>1));
+                               priv->EEPROMAntPwDiff = (usValue&0x0fff);
+                               priv->EEPROMCrystalCap = (u8)((usValue&0xf000)>>12);
+               }
+               else
+               {
+                               priv->EEPROMAntPwDiff = EEPROM_Default_AntTxPowerDiff;
+                               priv->EEPROMCrystalCap = EEPROM_Default_TxPwDiff_CrystalCap;
+               }
+                       RT_TRACE(COMP_INIT, "EEPROMAntPwDiff = %d\n", priv->EEPROMAntPwDiff);
+                       RT_TRACE(COMP_INIT, "EEPROMCrystalCap = %d\n", priv->EEPROMCrystalCap);
+
+               //
+               // Get per-channel Tx Power Level
+               //
+               for(i=0; i<14; i+=2)
+               {
+                       if(!priv->AutoloadFailFlag)
+                       {
+                               usValue = eprom_read(priv, (u16) ((EEPROM_TxPwIndex_CCK+i)>>1) );
+                       }
+                       else
+                       {
+                               usValue = EEPROM_Default_TxPower;
+                       }
+                       *((u16*)(&priv->EEPROMTxPowerLevelCCK[i])) = usValue;
+                       RT_TRACE(COMP_INIT,"CCK Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK[i]);
+                       RT_TRACE(COMP_INIT, "CCK Tx Power Level, Index %d = 0x%02x\n", i+1, priv->EEPROMTxPowerLevelCCK[i+1]);
+               }
+               for(i=0; i<14; i+=2)
+               {
+                       if(!priv->AutoloadFailFlag)
+                       {
+                               usValue = eprom_read(priv, (u16) ((EEPROM_TxPwIndex_OFDM_24G+i)>>1) );
+                       }
+                       else
+                       {
+                               usValue = EEPROM_Default_TxPower;
+                       }
+                       *((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[i])) = usValue;
+                       RT_TRACE(COMP_INIT, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelOFDM24G[i]);
+                       RT_TRACE(COMP_INIT, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i+1, priv->EEPROMTxPowerLevelOFDM24G[i+1]);
+               }
+               }
+
+               //
+               // Update HAL variables.
+               //
+               if(priv->epromtype == EPROM_93c46)
+               {
+                       for(i=0; i<14; i++)
+                       {
+                               priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK[i];
+                               priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[i];
+                       }
+                       priv->LegacyHTTxPowerDiff = priv->EEPROMLegacyHTTxPowerDiff;
+               // Antenna B gain offset to antenna A, bit0~3
+                       priv->AntennaTxPwDiff[0] = (priv->EEPROMAntPwDiff & 0xf);
+               // Antenna C gain offset to antenna A, bit4~7
+                       priv->AntennaTxPwDiff[1] = ((priv->EEPROMAntPwDiff & 0xf0)>>4);
+               // Antenna D gain offset to antenna A, bit8~11
+                       priv->AntennaTxPwDiff[2] = ((priv->EEPROMAntPwDiff & 0xf00)>>8);
+               // CrystalCap, bit12~15
+                       priv->CrystalCap = priv->EEPROMCrystalCap;
+               // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
+                       priv->ThermalMeter[0] = (priv->EEPROMThermalMeter & 0xf);
+                       priv->ThermalMeter[1] = ((priv->EEPROMThermalMeter & 0xf0)>>4);
+               }
+               else if(priv->epromtype == EPROM_93c56)
+               {
+                       for(i=0; i<3; i++)      // channel 1~3 use the same Tx Power Level.
+                       {
+                               priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[0];
+                               priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[0];
+                               priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[0];
+                               priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[0];
+                       }
+                       for(i=3; i<9; i++)      // channel 4~9 use the same Tx Power Level
+                       {
+                               priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[1];
+                               priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[1];
+                               priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[1];
+                               priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[1];
+                       }
+                       for(i=9; i<14; i++)     // channel 10~14 use the same Tx Power Level
+                       {
+                               priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[2];
+                               priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[2];
+                               priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[2];
+                               priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[2];
+                       }
+                       for(i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT, "priv->TxPowerLevelCCK_A[%d] = 0x%x\n", i, priv->TxPowerLevelCCK_A[i]);
+                       for(i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT,"priv->TxPowerLevelOFDM24G_A[%d] = 0x%x\n", i, priv->TxPowerLevelOFDM24G_A[i]);
+                       for(i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT, "priv->TxPowerLevelCCK_C[%d] = 0x%x\n", i, priv->TxPowerLevelCCK_C[i]);
+                       for(i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT, "priv->TxPowerLevelOFDM24G_C[%d] = 0x%x\n", i, priv->TxPowerLevelOFDM24G_C[i]);
+                       priv->LegacyHTTxPowerDiff = priv->EEPROMLegacyHTTxPowerDiff;
+                       priv->AntennaTxPwDiff[0] = 0;
+                       priv->AntennaTxPwDiff[1] = 0;
+                       priv->AntennaTxPwDiff[2] = 0;
+                       priv->CrystalCap = priv->EEPROMCrystalCap;
+                       // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
+                       priv->ThermalMeter[0] = (priv->EEPROMThermalMeter & 0xf);
+                       priv->ThermalMeter[1] = ((priv->EEPROMThermalMeter & 0xf0)>>4);
+               }
+       }
+
+       if(priv->rf_type == RF_1T2R)
+       {
+               RT_TRACE(COMP_INIT, "1T2R config\n");
+       }
+       else if (priv->rf_type == RF_2T4R)
+       {
+               RT_TRACE(COMP_INIT, "2T4R config\n");
+       }
+
+       // 2008/01/16 MH We can only know RF type in the function. So we have to init
+       // DIG RATR table again.
+       init_rate_adaptive(priv);
+
+       //1 Make a copy for following variables and we can change them if we want
+
+       if(priv->RegChannelPlan == 0xf)
+       {
+               priv->ChannelPlan = priv->eeprom_ChannelPlan;
+       }
+       else
+       {
+               priv->ChannelPlan = priv->RegChannelPlan;
+       }
+
+       //
+       //  Used PID and DID to Set CustomerID
+       //
+       if( priv->eeprom_vid == 0x1186 &&  priv->eeprom_did == 0x3304 )
+       {
+               priv->CustomerID =  RT_CID_DLINK;
+       }
+
+       switch(priv->eeprom_CustomerID)
+       {
+               case EEPROM_CID_DEFAULT:
+                       priv->CustomerID = RT_CID_DEFAULT;
+                       break;
+               case EEPROM_CID_CAMEO:
+                       priv->CustomerID = RT_CID_819x_CAMEO;
+                       break;
+               case  EEPROM_CID_RUNTOP:
+                       priv->CustomerID = RT_CID_819x_RUNTOP;
+                       break;
+               case EEPROM_CID_NetCore:
+                       priv->CustomerID = RT_CID_819x_Netcore;
+                       break;
+               case EEPROM_CID_TOSHIBA:        // Merge by Jacken, 2008/01/31
+                       priv->CustomerID = RT_CID_TOSHIBA;
+                       if(priv->eeprom_ChannelPlan&0x80)
+                               priv->ChannelPlan = priv->eeprom_ChannelPlan&0x7f;
+                       else
+                               priv->ChannelPlan = 0x0;
+                       RT_TRACE(COMP_INIT, "Toshiba ChannelPlan = 0x%x\n",
+                               priv->ChannelPlan);
+                       break;
+               case EEPROM_CID_Nettronix:
+                       priv->CustomerID = RT_CID_Nettronix;
+                       break;
+               case EEPROM_CID_Pronet:
+                       priv->CustomerID = RT_CID_PRONET;
+                       break;
+               case EEPROM_CID_DLINK:
+                       priv->CustomerID = RT_CID_DLINK;
+                       break;
+
+               case EEPROM_CID_WHQL:
+                       break;
+               default:
+                       // value from RegCustomerID
+                       break;
+       }
+
+       //Avoid the channel plan array overflow, by Bruce, 2007-08-27.
+       if(priv->ChannelPlan > CHANNEL_PLAN_LEN - 1)
+               priv->ChannelPlan = 0; //FCC
+
+       if( priv->eeprom_vid == 0x1186 &&  priv->eeprom_did == 0x3304)
+               priv->ieee80211->bSupportRemoteWakeUp = true;
+       else
+               priv->ieee80211->bSupportRemoteWakeUp = false;
+
+
+       RT_TRACE(COMP_INIT, "RegChannelPlan(%d)\n", priv->RegChannelPlan);
+       RT_TRACE(COMP_INIT, "ChannelPlan = %d\n", priv->ChannelPlan);
+       RT_TRACE(COMP_TRACE, "<==== ReadAdapterInfo\n");
+}
+
+
+static short rtl8192_get_channel_map(struct r8192_priv *priv)
+{
+#ifdef ENABLE_DOT11D
+       if(priv->ChannelPlan> COUNTRY_CODE_GLOBAL_DOMAIN){
+               printk("rtl8180_init:Error channel plan! Set to default.\n");
+               priv->ChannelPlan= 0;
+       }
+       RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
+
+       rtl819x_set_channel_map(priv->ChannelPlan, priv);
+#else
+       int ch,i;
+       //Set Default Channel Plan
+       if(!channels){
+               DMESG("No channels, aborting");
+               return -1;
+       }
+       ch=channels;
+       priv->ChannelPlan= 0;//hikaru
+        // set channels 1..14 allowed in given locale
+       for (i=1; i<=14; i++) {
+               (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01);
+               ch >>= 1;
+       }
+#endif
+       return 0;
+}
+
+static short rtl8192_init(struct r8192_priv *priv)
+{
+       struct net_device *dev = priv->ieee80211->dev;
+
+       memset(&(priv->stats),0,sizeof(struct Stats));
+       rtl8192_init_priv_variable(priv);
+       rtl8192_init_priv_lock(priv);
+       rtl8192_init_priv_task(priv);
+       rtl8192_get_eeprom_size(priv);
+       rtl8192_read_eeprom_info(priv);
+       rtl8192_get_channel_map(priv);
+       init_hal_dm(priv);
+       init_timer(&priv->watch_dog_timer);
+       priv->watch_dog_timer.data = (unsigned long)priv;
+       priv->watch_dog_timer.function = watch_dog_timer_callback;
+        if (request_irq(dev->irq, rtl8192_interrupt, IRQF_SHARED, dev->name, priv)) {
+               printk("Error allocating IRQ %d",dev->irq);
+               return -1;
+       }else{
+               priv->irq=dev->irq;
+               printk("IRQ %d",dev->irq);
+       }
+       if (rtl8192_pci_initdescring(priv) != 0){
+               printk("Endopoints initialization failed");
+               return -1;
+       }
+
+       return 0;
+}
+
+/*
+ * Actually only set RRSR, RATR and BW_OPMODE registers
+ *  not to do all the hw config as its name says
+ * This part need to modified according to the rate set we filtered
+ */
+static void rtl8192_hwconfig(struct r8192_priv *priv)
+{
+       u32 regRATR = 0, regRRSR = 0;
+       u8 regBwOpMode = 0, regTmp = 0;
+
+// Set RRSR, RATR, and BW_OPMODE registers
+       //
+       switch (priv->ieee80211->mode)
+       {
+       case WIRELESS_MODE_B:
+               regBwOpMode = BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_CCK;
+               regRRSR = RATE_ALL_CCK;
+               break;
+       case WIRELESS_MODE_A:
+               regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_OFDM_AG;
+               regRRSR = RATE_ALL_OFDM_AG;
+               break;
+       case WIRELESS_MODE_G:
+               regBwOpMode = BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               break;
+       case WIRELESS_MODE_AUTO:
+       case WIRELESS_MODE_N_24G:
+               // It support CCK rate by default.
+               // CCK rate will be filtered out only when associated AP does not support it.
+               regBwOpMode = BW_OPMODE_20MHZ;
+                       regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
+                       regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               break;
+       case WIRELESS_MODE_N_5G:
+               regBwOpMode = BW_OPMODE_5G;
+               regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
+               regRRSR = RATE_ALL_OFDM_AG;
+               break;
+       }
+
+       write_nic_byte(priv, BW_OPMODE, regBwOpMode);
+       {
+               u32 ratr_value = 0;
+               ratr_value = regRATR;
+               if (priv->rf_type == RF_1T2R)
+               {
+                       ratr_value &= ~(RATE_ALL_OFDM_2SS);
+               }
+               write_nic_dword(priv, RATR0, ratr_value);
+               write_nic_byte(priv, UFWP, 1);
+       }
+       regTmp = read_nic_byte(priv, 0x313);
+       regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
+       write_nic_dword(priv, RRSR, regRRSR);
+
+       //
+       // Set Retry Limit here
+       //
+       write_nic_word(priv, RETRY_LIMIT,
+                       priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT |
+                       priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
+       // Set Contention Window here
+
+       // Set Tx AGC
+
+       // Set Tx Antenna including Feedback control
+
+       // Set Auto Rate fallback control
+
+
+}
+
+
+static RT_STATUS rtl8192_adapter_start(struct r8192_priv *priv)
+{
+       struct net_device *dev = priv->ieee80211->dev;
+       u32 ulRegRead;
+       RT_STATUS rtStatus = RT_STATUS_SUCCESS;
+       u8 tmpvalue;
+       u8 ICVersion,SwitchingRegulatorOutput;
+       bool bfirmwareok = true;
+       u32     tmpRegA, tmpRegC, TempCCk;
+       int     i =0;
+
+       RT_TRACE(COMP_INIT, "====>%s()\n", __FUNCTION__);
+       priv->being_init_adapter = true;
+        rtl8192_pci_resetdescring(priv);
+       // 2007/11/02 MH Before initalizing RF. We can not use FW to do RF-R/W.
+       priv->Rf_Mode = RF_OP_By_SW_3wire;
+
+        //dPLL on
+        if(priv->ResetProgress == RESET_TYPE_NORESET)
+        {
+            write_nic_byte(priv, ANAPAR, 0x37);
+            // Accordign to designer's explain, LBUS active will never > 10ms. We delay 10ms
+            // Joseph increae the time to prevent firmware download fail
+            mdelay(500);
+        }
+
+       //PlatformSleepUs(10000);
+       // For any kind of InitializeAdapter process, we shall use system now!!
+       priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
+
+       //
+       //3 //Config CPUReset Register
+       //3//
+       //3 Firmware Reset Or Not
+       ulRegRead = read_nic_dword(priv, CPU_GEN);
+       if(priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
+       {       //called from MPInitialized. do nothing
+               ulRegRead |= CPU_GEN_SYSTEM_RESET;
+       }else if(priv->pFirmware->firmware_status == FW_STATUS_5_READY)
+               ulRegRead |= CPU_GEN_FIRMWARE_RESET;    // Called from MPReset
+       else
+               RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __FUNCTION__,   priv->pFirmware->firmware_status);
+
+       write_nic_dword(priv, CPU_GEN, ulRegRead);
+
+       //3//
+       //3 //Fix the issue of E-cut high temperature issue
+       //3//
+       // TODO: E cut only
+       ICVersion = read_nic_byte(priv, IC_VERRSION);
+       if(ICVersion >= 0x4) //E-cut only
+       {
+               // HW SD suggest that we should not wirte this register too often, so driver
+               // should readback this register. This register will be modified only when
+               // power on reset
+               SwitchingRegulatorOutput = read_nic_byte(priv, SWREGULATOR);
+               if(SwitchingRegulatorOutput  != 0xb8)
+               {
+                       write_nic_byte(priv, SWREGULATOR, 0xa8);
+                       mdelay(1);
+                       write_nic_byte(priv, SWREGULATOR, 0xb8);
+               }
+       }
+
+       //3//
+       //3// Initialize BB before MAC
+       //3//
+       RT_TRACE(COMP_INIT, "BB Config Start!\n");
+       rtStatus = rtl8192_BBConfig(priv);
+       if(rtStatus != RT_STATUS_SUCCESS)
+       {
+               RT_TRACE(COMP_ERR, "BB Config failed\n");
+               return rtStatus;
+       }
+       RT_TRACE(COMP_INIT,"BB Config Finished!\n");
+
+       //3//Set Loopback mode or Normal mode
+       //3//
+       //2006.12.13 by emily. Note!We should not merge these two CPU_GEN register writings
+       //      because setting of System_Reset bit reset MAC to default transmission mode.
+               //Loopback mode or not
+       priv->LoopbackMode = RTL819X_NO_LOOPBACK;
+       if(priv->ResetProgress == RESET_TYPE_NORESET)
+       {
+       ulRegRead = read_nic_dword(priv, CPU_GEN);
+       if(priv->LoopbackMode == RTL819X_NO_LOOPBACK)
+       {
+               ulRegRead = ((ulRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
+       }
+       else if (priv->LoopbackMode == RTL819X_MAC_LOOPBACK )
+       {
+               ulRegRead |= CPU_CCK_LOOPBACK;
+       }
+       else
+       {
+               RT_TRACE(COMP_ERR,"Serious error: wrong loopback mode setting\n");
+       }
+
+       //2008.06.03, for WOL
+       //ulRegRead &= (~(CPU_GEN_GPIO_UART));
+       write_nic_dword(priv, CPU_GEN, ulRegRead);
+
+       // 2006.11.29. After reset cpu, we sholud wait for a second, otherwise, it may fail to write registers. Emily
+       udelay(500);
+       }
+       //3Set Hardware(Do nothing now)
+       rtl8192_hwconfig(priv);
+       //2=======================================================
+       // Common Setting for all of the FPGA platform. (part 1)
+       //2=======================================================
+       // If there is changes, please make sure it applies to all of the FPGA version
+       //3 Turn on Tx/Rx
+       write_nic_byte(priv, CMDR, CR_RE|CR_TE);
+
+       //2Set Tx dma burst
+       write_nic_byte(priv, PCIF, ((MXDMA2_NoLimit<<MXDMA2_RX_SHIFT) |
+                                  (MXDMA2_NoLimit<<MXDMA2_TX_SHIFT) ));
+
+       //set IDR0 here
+       write_nic_dword(priv, MAC0, ((u32*)dev->dev_addr)[0]);
+       write_nic_word(priv, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
+       //set RCR
+       write_nic_dword(priv, RCR, priv->ReceiveConfig);
+
+       //3 Initialize Number of Reserved Pages in Firmware Queue
+               write_nic_dword(priv, RQPN1,  NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |
+                                       NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT |
+                                       NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT |
+                                       NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
+               write_nic_dword(priv, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT);
+               write_nic_dword(priv, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW|
+                                       NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT|
+                                       NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT);
+
+       rtl8192_tx_enable(priv);
+       rtl8192_rx_enable(priv);
+       //3Set Response Rate Setting Register
+       // CCK rate is supported by default.
+       // CCK rate will be filtered out only when associated AP does not support it.
+       ulRegRead = (0xFFF00000 & read_nic_dword(priv, RRSR))  | RATE_ALL_OFDM_AG | RATE_ALL_CCK;
+       write_nic_dword(priv, RRSR, ulRegRead);
+       write_nic_dword(priv, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
+
+       //2Set AckTimeout
+       // TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
+       write_nic_byte(priv, ACK_TIMEOUT, 0x30);
+
+       if(priv->ResetProgress == RESET_TYPE_NORESET)
+       rtl8192_SetWirelessMode(priv->ieee80211, priv->ieee80211->mode);
+       //-----------------------------------------------------------------------------
+       // Set up security related. 070106, by rcnjko:
+       // 1. Clear all H/W keys.
+       // 2. Enable H/W encryption/decryption.
+       //-----------------------------------------------------------------------------
+       CamResetAllEntry(priv);
+       {
+               u8 SECR_value = 0x0;
+               SECR_value |= SCR_TxEncEnable;
+               SECR_value |= SCR_RxDecEnable;
+               SECR_value |= SCR_NoSKMC;
+               write_nic_byte(priv, SECR, SECR_value);
+       }
+       //3Beacon related
+       write_nic_word(priv, ATIMWND, 2);
+       write_nic_word(priv, BCN_INTERVAL, 100);
+       for (i=0; i<QOS_QUEUE_NUM; i++)
+               write_nic_dword(priv, WDCAPARA_ADD[i], 0x005e4332);
+       //
+       // Switching regulator controller: This is set temporarily.
+       // It's not sure if this can be removed in the future.
+       // PJ advised to leave it by default.
+       //
+       write_nic_byte(priv, 0xbe, 0xc0);
+
+       //2=======================================================
+       // Set PHY related configuration defined in MAC register bank
+       //2=======================================================
+       rtl8192_phy_configmac(priv);
+
+       if (priv->card_8192_version > (u8) VERSION_8190_BD) {
+               rtl8192_phy_getTxPower(priv);
+               rtl8192_phy_setTxPower(priv, priv->chan);
+       }
+
+       //if D or C cut
+               tmpvalue = read_nic_byte(priv, IC_VERRSION);
+               priv->IC_Cut = tmpvalue;
+               RT_TRACE(COMP_INIT, "priv->IC_Cut = 0x%x\n", priv->IC_Cut);
+               if(priv->IC_Cut >= IC_VersionCut_D)
+               {
+                       //pHalData->bDcut = TRUE;
+                       if(priv->IC_Cut == IC_VersionCut_D)
+                               RT_TRACE(COMP_INIT, "D-cut\n");
+                       if(priv->IC_Cut == IC_VersionCut_E)
+                       {
+                               RT_TRACE(COMP_INIT, "E-cut\n");
+                               // HW SD suggest that we should not wirte this register too often, so driver
+                               // should readback this register. This register will be modified only when
+                               // power on reset
+                       }
+               }
+               else
+               {
+                       //pHalData->bDcut = FALSE;
+                       RT_TRACE(COMP_INIT, "Before C-cut\n");
+               }
+
+       //Firmware download
+       RT_TRACE(COMP_INIT, "Load Firmware!\n");
+       bfirmwareok = init_firmware(priv);
+       if(bfirmwareok != true) {
+               rtStatus = RT_STATUS_FAILURE;
+               return rtStatus;
+       }
+       RT_TRACE(COMP_INIT, "Load Firmware finished!\n");
+
+       //RF config
+       if(priv->ResetProgress == RESET_TYPE_NORESET)
+       {
+       RT_TRACE(COMP_INIT, "RF Config Started!\n");
+       rtStatus = rtl8192_phy_RFConfig(priv);
+       if(rtStatus != RT_STATUS_SUCCESS)
+       {
+               RT_TRACE(COMP_ERR, "RF Config failed\n");
+                       return rtStatus;
+       }
+       RT_TRACE(COMP_INIT, "RF Config Finished!\n");
+       }
+       rtl8192_phy_updateInitGain(priv);
+
+       /*---- Set CCK and OFDM Block "ON"----*/
+       rtl8192_setBBreg(priv, rFPGA0_RFMOD, bCCKEn, 0x1);
+       rtl8192_setBBreg(priv, rFPGA0_RFMOD, bOFDMEn, 0x1);
+
+       //Enable Led
+       write_nic_byte(priv, 0x87, 0x0);
+
+       //2=======================================================
+       // RF Power Save
+       //2=======================================================
+#ifdef ENABLE_IPS
+
+{
+       if(priv->RfOffReason > RF_CHANGE_BY_PS)
+       { // H/W or S/W RF OFF before sleep.
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RfOffReason(%d)\n", __FUNCTION__,priv->RfOffReason);
+               MgntActSet_RF_State(priv, eRfOff, priv->RfOffReason);
+       }
+       else if(priv->RfOffReason >= RF_CHANGE_BY_IPS)
+       { // H/W or S/W RF OFF before sleep.
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RfOffReason(%d)\n",  __FUNCTION__, priv->RfOffReason);
+               MgntActSet_RF_State(priv, eRfOff, priv->RfOffReason);
+       }
+       else
+       {
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): RF-ON \n",__FUNCTION__);
+               priv->eRFPowerState = eRfOn;
+               priv->RfOffReason = 0;
+       }
+}
+#endif
+       // We can force firmware to do RF-R/W
+       if(priv->ieee80211->FwRWRF)
+               priv->Rf_Mode = RF_OP_By_FW;
+       else
+               priv->Rf_Mode = RF_OP_By_SW_3wire;
+
+       if(priv->ResetProgress == RESET_TYPE_NORESET)
+       {
+               dm_initialize_txpower_tracking(priv);
+
+               if(priv->IC_Cut >= IC_VersionCut_D)
+               {
+                       tmpRegA = rtl8192_QueryBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord);
+                       tmpRegC = rtl8192_QueryBBReg(priv, rOFDM0_XCTxIQImbalance, bMaskDWord);
+                       for(i = 0; i<TxBBGainTableLength; i++)
+                       {
+                               if(tmpRegA == priv->txbbgain_table[i].txbbgain_value)
+                               {
+                                       priv->rfa_txpowertrackingindex= (u8)i;
+                                       priv->rfa_txpowertrackingindex_real= (u8)i;
+                                       priv->rfa_txpowertracking_default = priv->rfa_txpowertrackingindex;
+                                       break;
+                               }
+                       }
+
+               TempCCk = rtl8192_QueryBBReg(priv, rCCK0_TxFilter1, bMaskByte2);
+
+               for(i=0 ; i<CCKTxBBGainTableLength ; i++)
+               {
+                       if(TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0])
+                       {
+                               priv->CCKPresentAttentuation_20Mdefault =(u8) i;
+                               break;
+                       }
+               }
+               priv->CCKPresentAttentuation_40Mdefault = 0;
+               priv->CCKPresentAttentuation_difference = 0;
+               priv->CCKPresentAttentuation = priv->CCKPresentAttentuation_20Mdefault;
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_initial = %d\n", priv->rfa_txpowertrackingindex);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real__initial = %d\n", priv->rfa_txpowertrackingindex_real);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_difference_initial = %d\n", priv->CCKPresentAttentuation_difference);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_initial = %d\n", priv->CCKPresentAttentuation);
+                       priv->btxpower_tracking = FALSE;//TEMPLY DISABLE
+               }
+       }
+
+       rtl8192_irq_enable(priv);
+       priv->being_init_adapter = false;
+       return rtStatus;
+
+}
+
+static void rtl8192_prepare_beacon(unsigned long arg)
+{
+       struct r8192_priv *priv = (struct r8192_priv*) arg;
+       struct sk_buff *skb;
+       cb_desc *tcb_desc;
+
+       skb = ieee80211_get_beacon(priv->ieee80211);
+       tcb_desc = (cb_desc *)(skb->cb + 8);
+       /* prepare misc info for the beacon xmit */
+       tcb_desc->queue_index = BEACON_QUEUE;
+       /* IBSS does not support HT yet, use 1M defaultly */
+       tcb_desc->data_rate = 2;
+       tcb_desc->RATRIndex = 7;
+       tcb_desc->bTxDisableRateFallBack = 1;
+       tcb_desc->bTxUseDriverAssingedRate = 1;
+
+       skb_push(skb, priv->ieee80211->tx_headroom);
+       if(skb){
+               rtl8192_tx(priv, skb);
+       }
+}
+
+
+/*
+ * configure registers for beacon tx and enables it via
+ * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
+ * be used to stop beacon transmission
+ */
+static void rtl8192_start_beacon(struct ieee80211_device *ieee80211)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       struct ieee80211_network *net = &priv->ieee80211->current_network;
+       u16 BcnTimeCfg = 0;
+        u16 BcnCW = 6;
+        u16 BcnIFS = 0xf;
+
+       DMESG("Enabling beacon TX");
+       rtl8192_irq_disable(priv);
+       //rtl8192_beacon_tx_enable(dev);
+
+       /* ATIM window */
+       write_nic_word(priv, ATIMWND, 2);
+
+       /* Beacon interval (in unit of TU) */
+       write_nic_word(priv, BCN_INTERVAL, net->beacon_interval);
+
+       /*
+        * DrvErlyInt (in unit of TU).
+        * (Time to send interrupt to notify driver to c
+        * hange beacon content)
+        * */
+       write_nic_word(priv, BCN_DRV_EARLY_INT, 10);
+
+       /*
+        * BcnDMATIM(in unit of us).
+        * Indicates the time before TBTT to perform beacon queue DMA
+        * */
+       write_nic_word(priv, BCN_DMATIME, 256);
+
+       /*
+        * Force beacon frame transmission even after receiving
+        * beacon frame from other ad hoc STA
+        * */
+       write_nic_byte(priv, BCN_ERR_THRESH, 100);
+
+       /* Set CW and IFS */
+       BcnTimeCfg |= BcnCW<<BCN_TCFG_CW_SHIFT;
+       BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
+       write_nic_word(priv, BCN_TCFG, BcnTimeCfg);
+
+
+       /* enable the interrupt for ad-hoc process */
+       rtl8192_irq_enable(priv);
+}
+
+static bool HalRxCheckStuck8190Pci(struct r8192_priv *priv)
+{
+       u16 RegRxCounter = read_nic_word(priv, 0x130);
+       bool                            bStuck = FALSE;
+
+       RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
+       // If rssi is small, we should check rx for long time because of bad rx.
+       // or maybe it will continuous silent reset every 2 seconds.
+       priv->rx_chk_cnt++;
+       if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
+       {
+               priv->rx_chk_cnt = 0;   /* high rssi, check rx stuck right now. */
+       }
+       else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
+               ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
+               (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
+
+       {
+               if(priv->rx_chk_cnt < 2)
+               {
+                       return bStuck;
+               }
+               else
+               {
+                       priv->rx_chk_cnt = 0;
+               }
+       }
+       else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
+               (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
+               priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
+       {
+               if(priv->rx_chk_cnt < 4)
+               {
+                       return bStuck;
+               }
+               else
+               {
+                       priv->rx_chk_cnt = 0;
+               }
+       }
+       else
+       {
+               if(priv->rx_chk_cnt < 8)
+               {
+                       return bStuck;
+               }
+               else
+               {
+                       priv->rx_chk_cnt = 0;
+               }
+       }
+       if(priv->RxCounter==RegRxCounter)
+               bStuck = TRUE;
+
+       priv->RxCounter = RegRxCounter;
+
+       return bStuck;
+}
+
+static RESET_TYPE RxCheckStuck(struct r8192_priv *priv)
+{
+
+       if(HalRxCheckStuck8190Pci(priv))
+       {
+               RT_TRACE(COMP_RESET, "RxStuck Condition\n");
+               return RESET_TYPE_SILENT;
+       }
+
+       return RESET_TYPE_NORESET;
+}
+
+static RESET_TYPE rtl819x_check_reset(struct r8192_priv *priv)
+{
+       RESET_TYPE RxResetType = RESET_TYPE_NORESET;
+       RT_RF_POWER_STATE rfState;
+
+       rfState = priv->eRFPowerState;
+
+       if (rfState != eRfOff && (priv->ieee80211->iw_mode != IW_MODE_ADHOC)) {
+               /*
+                * If driver is in the status of firmware download failure,
+                * driver skips RF initialization and RF is in turned off state.
+                * Driver should check whether Rx stuck and do silent reset. And
+                * if driver is in firmware download failure status, driver
+                * should initialize RF in the following silent reset procedure
+                *
+                * Driver should not check RX stuck in IBSS mode because it is
+                * required to set Check BSSID in order to send beacon, however,
+                * if check BSSID is set, STA cannot hear any packet a all.
+                */
+               RxResetType = RxCheckStuck(priv);
+       }
+
+       RT_TRACE(COMP_RESET, "%s():  RxResetType is %d\n", __FUNCTION__, RxResetType);
+
+       return RxResetType;
+}
+
+#ifdef ENABLE_IPS
+static void InactivePsWorkItemCallback(struct r8192_priv *priv)
+{
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+
+       RT_TRACE(COMP_POWER, "InactivePsWorkItemCallback() --------->\n");
+       //
+       // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
+       // is really scheduled.
+       // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
+       // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
+       // blocks the IPS procedure of switching RF.
+       // By Bruce, 2007-12-25.
+       //
+       pPSC->bSwRfProcessing = TRUE;
+
+       RT_TRACE(COMP_RF, "InactivePsWorkItemCallback(): Set RF to %s.\n",
+                       pPSC->eInactivePowerState == eRfOff?"OFF":"ON");
+
+
+       MgntActSet_RF_State(priv, pPSC->eInactivePowerState, RF_CHANGE_BY_IPS);
+
+       //
+       // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
+       //
+       pPSC->bSwRfProcessing = FALSE;
+       RT_TRACE(COMP_POWER, "InactivePsWorkItemCallback() <---------\n");
+}
+
+#ifdef ENABLE_LPS
+/* Change current and default preamble mode. */
+bool MgntActSet_802_11_PowerSaveMode(struct r8192_priv *priv, u8 rtPsMode)
+{
+
+       // Currently, we do not change power save mode on IBSS mode.
+       if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
+       {
+               return false;
+       }
+
+       //
+       // <RJ_NOTE> If we make HW to fill up the PwrMgt bit for us,
+       // some AP will not response to our mgnt frames with PwrMgt bit set,
+       // e.g. cannot associate the AP.
+       // So I commented out it. 2005.02.16, by rcnjko.
+       //
+//     // Change device's power save mode.
+//     Adapter->HalFunc.SetPSModeHandler( Adapter, rtPsMode );
+
+       // Update power save mode configured.
+       //RT_TRACE(COMP_LPS,"%s(): set ieee->ps = %x\n",__FUNCTION__,rtPsMode);
+       if(!priv->ps_force) {
+               priv->ieee80211->ps = rtPsMode;
+       }
+
+       // Awake immediately
+       if(priv->ieee80211->sta_sleep != 0 && rtPsMode == IEEE80211_PS_DISABLED)
+       {
+               // Notify the AP we awke.
+               rtl8192_hw_wakeup(priv->ieee80211);
+               priv->ieee80211->sta_sleep = 0;
+
+                spin_lock(&priv->ieee80211->mgmt_tx_lock);
+               printk("LPS leave: notify AP we are awaked ++++++++++ SendNullFunctionData\n");
+               ieee80211_sta_ps_send_null_frame(priv->ieee80211, 0);
+                spin_unlock(&priv->ieee80211->mgmt_tx_lock);
+       }
+
+       return true;
+}
+
+/* Enter the leisure power save mode. */
+void LeisurePSEnter(struct ieee80211_device *ieee80211)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+
+       if(!((priv->ieee80211->iw_mode == IW_MODE_INFRA) &&
+               (priv->ieee80211->state == IEEE80211_LINKED)) ||
+               (priv->ieee80211->iw_mode == IW_MODE_ADHOC) ||
+               (priv->ieee80211->iw_mode == IW_MODE_MASTER))
+               return;
+
+       if (pPSC->bLeisurePs)
+       {
+               // Idle for a while if we connect to AP a while ago.
+               if(pPSC->LpsIdleCount >= RT_CHECK_FOR_HANG_PERIOD) //  4 Sec
+               {
+
+                       if(priv->ieee80211->ps == IEEE80211_PS_DISABLED)
+                       {
+                               MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_MBCAST|IEEE80211_PS_UNICAST);
+
+                       }
+               }
+               else
+                       pPSC->LpsIdleCount++;
+       }
+}
+
+
+/* Leave leisure power save mode. */
+void LeisurePSLeave(struct ieee80211_device *ieee80211)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+
+       if (pPSC->bLeisurePs)
+       {
+               if(priv->ieee80211->ps != IEEE80211_PS_DISABLED)
+               {
+                       // move to lps_wakecomplete()
+                       MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_DISABLED);
+
+               }
+       }
+}
+#endif
+
+
+/* Enter the inactive power save mode. RF will be off */
+void IPSEnter(struct r8192_priv *priv)
+{
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+       RT_RF_POWER_STATE                       rtState;
+
+       if (pPSC->bInactivePs)
+       {
+               rtState = priv->eRFPowerState;
+               //
+               // Added by Bruce, 2007-12-25.
+               // Do not enter IPS in the following conditions:
+               // (1) RF is already OFF or Sleep
+               // (2) bSwRfProcessing (indicates the IPS is still under going)
+               // (3) Connectted (only disconnected can trigger IPS)
+               // (4) IBSS (send Beacon)
+               // (5) AP mode (send Beacon)
+               //
+               if (rtState == eRfOn && !pPSC->bSwRfProcessing
+                       && (priv->ieee80211->state != IEEE80211_LINKED) )
+               {
+                       RT_TRACE(COMP_RF,"IPSEnter(): Turn off RF.\n");
+                       pPSC->eInactivePowerState = eRfOff;
+//                     queue_work(priv->priv_wq,&(pPSC->InactivePsWorkItem));
+                       InactivePsWorkItemCallback(priv);
+               }
+       }
+}
+
+//
+//     Description:
+//             Leave the inactive power save mode, RF will be on.
+//     2007.08.17, by shien chang.
+//
+void IPSLeave(struct r8192_priv *priv)
+{
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+       RT_RF_POWER_STATE       rtState;
+
+       if (pPSC->bInactivePs)
+       {
+               rtState = priv->eRFPowerState;
+               if (rtState != eRfOn && !pPSC->bSwRfProcessing && priv->RfOffReason <= RF_CHANGE_BY_IPS)
+               {
+                       RT_TRACE(COMP_POWER, "IPSLeave(): Turn on RF.\n");
+                       pPSC->eInactivePowerState = eRfOn;
+                       InactivePsWorkItemCallback(priv);
+               }
+       }
+}
+
+void IPSLeave_wq(struct work_struct *work)
+{
+       struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ips_leave_wq);
+       struct net_device *dev = ieee->dev;
+
+       struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
+       down(&priv->ieee80211->ips_sem);
+       IPSLeave(priv);
+       up(&priv->ieee80211->ips_sem);
+}
+
+void ieee80211_ips_leave_wq(struct ieee80211_device *ieee80211)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       RT_RF_POWER_STATE       rtState;
+       rtState = priv->eRFPowerState;
+
+       if (priv->PowerSaveControl.bInactivePs){
+               if(rtState == eRfOff){
+                       if(priv->RfOffReason > RF_CHANGE_BY_IPS)
+                       {
+                               RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
+                               return;
+                       }
+                       else{
+                               printk("=========>%s(): IPSLeave\n",__FUNCTION__);
+                               queue_work(priv->ieee80211->wq,&priv->ieee80211->ips_leave_wq);
+                       }
+               }
+       }
+}
+//added by amy 090331 end
+void ieee80211_ips_leave(struct ieee80211_device *ieee80211)
+{
+       struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+       down(&ieee80211->ips_sem);
+       IPSLeave(priv);
+       up(&ieee80211->ips_sem);
+}
+#endif
+
+static void rtl819x_update_rxcounts(
+       struct r8192_priv *priv,
+       u32* TotalRxBcnNum,
+       u32* TotalRxDataNum
+)
+{
+       u16                     SlotIndex;
+       u8                      i;
+
+       *TotalRxBcnNum = 0;
+       *TotalRxDataNum = 0;
+
+       SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
+       priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
+       priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
+       for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
+               *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
+               *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
+       }
+}
+
+
+static void rtl819x_watchdog_wqcallback(struct work_struct *work)
+{
+       struct delayed_work *dwork = container_of(work,struct delayed_work,work);
+       struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
+       struct ieee80211_device* ieee = priv->ieee80211;
+       RESET_TYPE      ResetType = RESET_TYPE_NORESET;
+       bool bBusyTraffic = false;
+       bool bEnterPS = false;
+
+       if ((!priv->up) || priv->bHwRadioOff)
+               return;
+
+       if(!priv->up)
+               return;
+       hal_dm_watchdog(priv);
+#ifdef ENABLE_IPS
+       if(ieee->actscanning == false){
+               if((ieee->iw_mode == IW_MODE_INFRA) && (ieee->state == IEEE80211_NOLINK) &&
+                   (priv->eRFPowerState == eRfOn) && !ieee->is_set_key &&
+                   (!ieee->proto_stoppping) && !ieee->wx_set_enc){
+                       if (priv->PowerSaveControl.ReturnPoint == IPS_CALLBACK_NONE){
+                               IPSEnter(priv);
+                       }
+               }
+       }
+#endif
+       {//to get busy traffic condition
+               if(ieee->state == IEEE80211_LINKED)
+               {
+                       if(     ieee->LinkDetectInfo.NumRxOkInPeriod> 100 ||
+                               ieee->LinkDetectInfo.NumTxOkInPeriod> 100 ) {
+                               bBusyTraffic = true;
+                       }
+
+#ifdef ENABLE_LPS
+                       //added by amy for Leisure PS
+                       if(     ((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod + ieee->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
+                               (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
+                       {
+                               bEnterPS= false;
+                       }
+                       else
+                       {
+                               bEnterPS= true;
+                       }
+
+                       // LeisurePS only work in infra mode.
+                       if(bEnterPS)
+                       {
+                               LeisurePSEnter(priv->ieee80211);
+                       }
+                       else
+                       {
+                               LeisurePSLeave(priv->ieee80211);
+                       }
+#endif
+
+               }
+               else
+               {
+#ifdef ENABLE_LPS
+                       LeisurePSLeave(priv->ieee80211);
+#endif
+               }
+
+               ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
+               ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
+               ieee->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
+               ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
+       }
+
+
+       //added by amy for AP roaming
+               if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
+               {
+                       u32     TotalRxBcnNum = 0;
+                       u32     TotalRxDataNum = 0;
+
+                       rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
+                       if((TotalRxBcnNum+TotalRxDataNum) == 0)
+                       {
+                               if (priv->eRFPowerState == eRfOff)
+                                       RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
+                               printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
+                               //              Dot11d_Reset(dev);
+                               ieee->state = IEEE80211_ASSOCIATING;
+                               notify_wx_assoc_event(priv->ieee80211);
+                               RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
+                               ieee->is_roaming = true;
+                               ieee->is_set_key = false;
+                               ieee->link_change(ieee);
+                               queue_work(ieee->wq, &ieee->associate_procedure_wq);
+                       }
+               }
+             ieee->LinkDetectInfo.NumRecvBcnInPeriod=0;
+              ieee->LinkDetectInfo.NumRecvDataInPeriod=0;
+
+       //check if reset the driver
+       if (priv->watchdog_check_reset_cnt++ >= 3 && !ieee->is_roaming && 
+           priv->watchdog_last_time != 1)
+       {
+               ResetType = rtl819x_check_reset(priv);
+               priv->watchdog_check_reset_cnt = 3;
+       }
+       if(!priv->bDisableNormalResetCheck && ResetType == RESET_TYPE_NORMAL)
+       {
+               priv->ResetProgress = RESET_TYPE_NORMAL;
+               RT_TRACE(COMP_RESET,"%s(): NOMAL RESET\n",__FUNCTION__);
+               return;
+       }
+       /* disable silent reset temply 2008.9.11*/
+
+       if( ((priv->force_reset) || (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT))) // This is control by OID set in Pomelo
+       {
+               priv->watchdog_last_time = 1;
+       }
+       else
+               priv->watchdog_last_time = 0;
+
+       priv->force_reset = false;
+       priv->bForcedSilentReset = false;
+       priv->bResetInProgress = false;
+       RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
+
+}
+
+void watch_dog_timer_callback(unsigned long data)
+{
+       struct r8192_priv *priv = (struct r8192_priv *) data;
+       queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq,0);
+       mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
+
+}
+
+static int _rtl8192_up(struct r8192_priv *priv)
+{
+       RT_STATUS init_status = RT_STATUS_SUCCESS;
+       struct net_device *dev = priv->ieee80211->dev;
+
+       priv->up=1;
+       priv->ieee80211->ieee_up=1;
+       priv->bdisable_nic = false;  //YJ,add,091111
+       RT_TRACE(COMP_INIT, "Bringing up iface\n");
+
+       init_status = rtl8192_adapter_start(priv);
+       if(init_status != RT_STATUS_SUCCESS)
+       {
+               RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n",__FUNCTION__);
+               return -1;
+       }
+       RT_TRACE(COMP_INIT, "start adapter finished\n");
+
+       if (priv->eRFPowerState != eRfOn)
+               MgntActSet_RF_State(priv, eRfOn, priv->RfOffReason);
+
+       if(priv->ieee80211->state != IEEE80211_LINKED)
+       ieee80211_softmac_start_protocol(priv->ieee80211);
+       ieee80211_reset_queue(priv->ieee80211);
+       watch_dog_timer_callback((unsigned long) priv);
+       if(!netif_queue_stopped(dev))
+               netif_start_queue(dev);
+       else
+               netif_wake_queue(dev);
+
+       return 0;
+}
+
+
+static int rtl8192_open(struct net_device *dev)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+       int ret;
+
+       down(&priv->wx_sem);
+       ret = rtl8192_up(dev);
+       up(&priv->wx_sem);
+       return ret;
+
+}
+
+
+int rtl8192_up(struct net_device *dev)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+
+       if (priv->up == 1) return -1;
+
+       return _rtl8192_up(priv);
+}
+
+
+static int rtl8192_close(struct net_device *dev)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+       int ret;
+
+       down(&priv->wx_sem);
+
+       ret = rtl8192_down(dev);
+
+       up(&priv->wx_sem);
+
+       return ret;
+
+}
+
+int rtl8192_down(struct net_device *dev)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+
+       if (priv->up == 0) return -1;
+
+#ifdef ENABLE_LPS
+       //LZM for PS-Poll AID issue. 090429
+       if(priv->ieee80211->state == IEEE80211_LINKED)
+               LeisurePSLeave(priv->ieee80211);
+#endif
+
+       priv->up=0;
+       priv->ieee80211->ieee_up = 0;
+       RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
+/* FIXME */
+       if (!netif_queue_stopped(dev))
+               netif_stop_queue(dev);
+
+       rtl8192_irq_disable(priv);
+       rtl8192_cancel_deferred_work(priv);
+       deinit_hal_dm(priv);
+       del_timer_sync(&priv->watch_dog_timer);
+
+       ieee80211_softmac_stop_protocol(priv->ieee80211,true);
+
+       rtl8192_halt_adapter(priv, false);
+       memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
+
+       RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
+
+       return 0;
+}
+
+
+void rtl8192_commit(struct r8192_priv *priv)
+{
+       if (priv->up == 0) return ;
+
+
+       ieee80211_softmac_stop_protocol(priv->ieee80211,true);
+
+       rtl8192_irq_disable(priv);
+       rtl8192_halt_adapter(priv, true);
+       _rtl8192_up(priv);
+}
+
+static void rtl8192_restart(struct work_struct *work)
+{
+        struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
+
+       down(&priv->wx_sem);
+
+       rtl8192_commit(priv);
+
+       up(&priv->wx_sem);
+}
+
+static void r8192_set_multicast(struct net_device *dev)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+
+       priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
+}
+
+
+static int r8192_set_mac_adr(struct net_device *dev, void *mac)
+{
+       struct r8192_priv *priv = ieee80211_priv(dev);
+       struct sockaddr *addr = mac;
+
+       down(&priv->wx_sem);
+
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+
+       schedule_work(&priv->reset_wq);
+       up(&priv->wx_sem);
+
+       return 0;
+}
+
+static void r8192e_set_hw_key(struct r8192_priv *priv, struct ieee_param *ipw)
+{
+       struct ieee80211_device *ieee = priv->ieee80211;
+       u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
+       u32 key[4];
+
+       if (ipw->u.crypt.set_tx) {
+               if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
+                       ieee->pairwise_key_type = KEY_TYPE_CCMP;
+               else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
+                       ieee->pairwise_key_type = KEY_TYPE_TKIP;
+               else if (strcmp(ipw->u.crypt.alg, "WEP") == 0) {
+                       if (ipw->u.crypt.key_len == 13)
+                               ieee->pairwise_key_type = KEY_TYPE_WEP104;
+                       else if (ipw->u.crypt.key_len == 5)
+                               ieee->pairwise_key_type = KEY_TYPE_WEP40;
+               } else
+                       ieee->pairwise_key_type = KEY_TYPE_NA;
+
+               if (ieee->pairwise_key_type) {
+                       memcpy(key, ipw->u.crypt.key, 16);
+                       EnableHWSecurityConfig8192(priv);
+                       /*
+                        * We fill both index entry and 4th entry for pairwise
+                        * key as in IPW interface, adhoc will only get here,
+                        * so we need index entry for its default key serching!
+                        */
+                       setKey(priv, 4, ipw->u.crypt.idx,
+                              ieee->pairwise_key_type,
+                              (u8*)ieee->ap_mac_addr, 0, key);
+
+                       /* LEAP WEP will never set this. */
+                       if (ieee->auth_mode != 2)
+                               setKey(priv, ipw->u.crypt.idx, ipw->u.crypt.idx,
+                                      ieee->pairwise_key_type,
+                                      (u8*)ieee->ap_mac_addr, 0, key);
+               }
+               if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) &&
+                   ieee->pHTInfo->bCurrentHTSupport) {
+                       write_nic_byte(priv, 0x173, 1); /* fix aes bug */
+               }
+       } else {
+               memcpy(key, ipw->u.crypt.key, 16);
+               if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
+                       ieee->group_key_type= KEY_TYPE_CCMP;
+               else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
+                       ieee->group_key_type = KEY_TYPE_TKIP;
+               else if (strcmp(ipw->u.crypt.alg, "WEP") == 0) {
+                       if (ipw->u.crypt.key_len == 13)
+                               ieee->group_key_type = KEY_TYPE_WEP104;
+                       else if (ipw->u.crypt.key_len == 5)
+                               ieee->group_key_type = KEY_TYPE_WEP40;
+               } else
+                       ieee->group_key_type = KEY_TYPE_NA;
+
+               if (ieee->group_key_type) {
+                       setKey(priv, ipw->u.crypt.idx, ipw->u.crypt.idx,
+                              ieee->group_key_type, broadcast_addr, 0, key);
+               }
+       }
+}
+
+/* based on ipw2200 driver */
+static int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
+       struct iwreq *wrq = (struct iwreq *)rq;
+       int ret=-1;
+       struct iw_point *p = &wrq->u.data;
+       struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
+
+       down(&priv->wx_sem);
+
+
+     if (p->length < sizeof(struct ieee_param) || !p->pointer){
+             ret = -EINVAL;
+             goto out;
+     }
+
+     ipw = kmalloc(p->length, GFP_KERNEL);
+     if (ipw == NULL){
+             ret = -ENOMEM;
+             goto out;
+     }
+     if (copy_from_user(ipw, p->pointer, p->length)) {
+            kfree(ipw);
+            ret = -EFAULT;
+            goto out;
+     }
+
+       switch (cmd) {
+       case RTL_IOCTL_WPA_SUPPLICANT:
+               /* parse here for HW security */
+               if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
+                       r8192e_set_hw_key(priv, ipw);
+               ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
+               break;
+
+       default:
+               ret = -EOPNOTSUPP;
+               break;
+       }
+
+       kfree(ipw);
+out:
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+static u8 HwRateToMRate90(bool bIsHT, u8 rate)
+{
+       u8  ret_rate = 0x02;
+
+       if(!bIsHT) {
+               switch(rate) {
+                       case DESC90_RATE1M:   ret_rate = MGN_1M;         break;
+                       case DESC90_RATE2M:   ret_rate = MGN_2M;         break;
+                       case DESC90_RATE5_5M: ret_rate = MGN_5_5M;       break;
+                       case DESC90_RATE11M:  ret_rate = MGN_11M;        break;
+                       case DESC90_RATE6M:   ret_rate = MGN_6M;         break;
+                       case DESC90_RATE9M:   ret_rate = MGN_9M;         break;
+                       case DESC90_RATE12M:  ret_rate = MGN_12M;        break;
+                       case DESC90_RATE18M:  ret_rate = MGN_18M;        break;
+                       case DESC90_RATE24M:  ret_rate = MGN_24M;        break;
+                       case DESC90_RATE36M:  ret_rate = MGN_36M;        break;
+                       case DESC90_RATE48M:  ret_rate = MGN_48M;        break;
+                       case DESC90_RATE54M:  ret_rate = MGN_54M;        break;
+
+                       default:
+                                             RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
+                                             break;
+               }
+
+       } else {
+               switch(rate) {
+                       case DESC90_RATEMCS0:   ret_rate = MGN_MCS0;    break;
+                       case DESC90_RATEMCS1:   ret_rate = MGN_MCS1;    break;
+                       case DESC90_RATEMCS2:   ret_rate = MGN_MCS2;    break;
+                       case DESC90_RATEMCS3:   ret_rate = MGN_MCS3;    break;
+                       case DESC90_RATEMCS4:   ret_rate = MGN_MCS4;    break;
+                       case DESC90_RATEMCS5:   ret_rate = MGN_MCS5;    break;
+                       case DESC90_RATEMCS6:   ret_rate = MGN_MCS6;    break;
+                       case DESC90_RATEMCS7:   ret_rate = MGN_MCS7;    break;
+                       case DESC90_RATEMCS8:   ret_rate = MGN_MCS8;    break;
+                       case DESC90_RATEMCS9:   ret_rate = MGN_MCS9;    break;
+                       case DESC90_RATEMCS10:  ret_rate = MGN_MCS10;   break;
+                       case DESC90_RATEMCS11:  ret_rate = MGN_MCS11;   break;
+                       case DESC90_RATEMCS12:  ret_rate = MGN_MCS12;   break;
+                       case DESC90_RATEMCS13:  ret_rate = MGN_MCS13;   break;
+                       case DESC90_RATEMCS14:  ret_rate = MGN_MCS14;   break;
+                       case DESC90_RATEMCS15:  ret_rate = MGN_MCS15;   break;
+                       case DESC90_RATEMCS32:  ret_rate = (0x80|0x20); break;
+
+                       default:
+                                               RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
+                                               break;
+               }
+       }
+
+       return ret_rate;
+}
+
+/* Record the TSF time stamp when receiving a packet */
+static void UpdateRxPktTimeStamp8190(struct r8192_priv *priv, struct ieee80211_rx_stats *stats)
+{
+
+       if(stats->bIsAMPDU && !stats->bFirstMPDU) {
+               stats->mac_time[0] = priv->LastRxDescTSFLow;
+               stats->mac_time[1] = priv->LastRxDescTSFHigh;
+       } else {
+               priv->LastRxDescTSFLow = stats->mac_time[0];
+               priv->LastRxDescTSFHigh = stats->mac_time[1];
+       }
+}
+
+static long rtl819x_translate_todbm(u8 signal_strength_index)// 0-100 index.
+{
+       long    signal_power; // in dBm.
+
+       // Translate to dBm (x=0.5y-95).
+       signal_power = (long)((signal_strength_index + 1) >> 1);
+       signal_power -= 95;
+
+       return signal_power;
+}
+
+/* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
+       be a local static. Otherwise, it may increase when we return from S3/S4. The
+       value will be kept in memory or disk. We must delcare the value in adapter
+       and it will be reinitialized when return from S3/S4. */
+static void rtl8192_process_phyinfo(struct r8192_priv * priv, u8* buffer,struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
+{
+       bool bcheck = false;
+       u8      rfpath;
+       u32 nspatial_stream, tmp_val;
+       static u32 slide_rssi_index=0, slide_rssi_statistics=0;
+       static u32 slide_evm_index=0, slide_evm_statistics=0;
+       static u32 last_rssi=0, last_evm=0;
+       //cosa add for beacon rssi smoothing
+       static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
+       static u32 last_beacon_adc_pwdb=0;
+
+       struct ieee80211_hdr_3addr *hdr;
+       u16 sc ;
+       unsigned int frag,seq;
+       hdr = (struct ieee80211_hdr_3addr *)buffer;
+       sc = le16_to_cpu(hdr->seq_ctl);
+       frag = WLAN_GET_SEQ_FRAG(sc);
+       seq = WLAN_GET_SEQ_SEQ(sc);
+
+       //
+       // Check whether we should take the previous packet into accounting
+       //
+       if(!pprevious_stats->bIsAMPDU)
+       {
+               // if previous packet is not aggregated packet
+               bcheck = true;
+       }
+
+       if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
+       {
+               slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
+               last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
+               priv->stats.slide_rssi_total -= last_rssi;
+       }
+       priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
+
+       priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
+       if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
+               slide_rssi_index = 0;
+
+       // <1> Showed on UI for user, in dbm
+       tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
+       priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
+       pcurrent_stats->rssi = priv->stats.signal_strength;
+       //
+       // If the previous packet does not match the criteria, neglect it
+       //
+       if(!pprevious_stats->bPacketMatchBSSID)
+       {
+               if(!pprevious_stats->bToSelfBA)
+                       return;
+       }
+
+       if(!bcheck)
+               return;
+
+       // <2> Showed on UI for engineering
+       // hardware does not provide rssi information for each rf path in CCK
+       if(!pprevious_stats->bIsCCK && pprevious_stats->bPacketToSelf)
+       {
+               for (rfpath = RF90_PATH_A; rfpath < RF90_PATH_C; rfpath++)
+               {
+                       if (!rtl8192_phy_CheckIsLegalRFPath(priv, rfpath))
+                               continue;
+                       RT_TRACE(COMP_DBG, "pPreviousstats->RxMIMOSignalStrength[rfpath] = %d\n", pprevious_stats->RxMIMOSignalStrength[rfpath]);
+                       //Fixed by Jacken 2008-03-20
+                       if(priv->stats.rx_rssi_percentage[rfpath] == 0)
+                       {
+                               priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
+                       }
+                       if(pprevious_stats->RxMIMOSignalStrength[rfpath]  > priv->stats.rx_rssi_percentage[rfpath])
+                       {
+                               priv->stats.rx_rssi_percentage[rfpath] =
+                                       ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
+                               priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath]  + 1;
+                       }
+                       else
+                       {
+                               priv->stats.rx_rssi_percentage[rfpath] =
+                                       ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
+                       }
+                       RT_TRACE(COMP_DBG, "priv->RxStats.RxRSSIPercentage[rfPath] = %d \n" , priv->stats.rx_rssi_percentage[rfpath]);
+               }
+       }
+
+
+       //
+       // Check PWDB.
+       //
+       //cosa add for beacon rssi smoothing by average.
+       if(pprevious_stats->bPacketBeacon)
+       {
+               /* record the beacon pwdb to the sliding window. */
+               if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
+               {
+                       slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
+                       last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
+                       priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
+                       //      slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
+               }
+               priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
+               priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
+               slide_beacon_adc_pwdb_index++;
+               if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
+                       slide_beacon_adc_pwdb_index = 0;
+               pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
+               if(pprevious_stats->RxPWDBAll >= 3)
+                       pprevious_stats->RxPWDBAll -= 3;
+       }
+
+       RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
+                               pprevious_stats->bIsCCK? "CCK": "OFDM",
+                               pprevious_stats->RxPWDBAll);
+
+       if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
+       {
+               if(priv->undecorated_smoothed_pwdb < 0) // initialize
+               {
+                       priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
+               }
+
+               if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
+               {
+                       priv->undecorated_smoothed_pwdb =
+                                       ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
+                       priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
+               }
+               else
+               {
+                       priv->undecorated_smoothed_pwdb =
+                                       ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
+               }
+       }
+
+       //
+       // Check EVM
+       //
+       /* record the general EVM to the sliding window. */
+       if(pprevious_stats->SignalQuality == 0)
+       {
+       }
+       else
+       {
+               if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
+                       if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
+                               slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
+                               last_evm = priv->stats.slide_evm[slide_evm_index];
+                               priv->stats.slide_evm_total -= last_evm;
+                       }
+
+                       priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
+
+                       priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
+                       if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
+                               slide_evm_index = 0;
+
+                       // <1> Showed on UI for user, in percentage.
+                       tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
+                       //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
+               }
+
+               // <2> Showed on UI for engineering
+               if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
+               {
+                       for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
+                       {
+                               if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
+                               {
+                                       if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
+                                       {
+                                               priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
+                                       }
+                                       priv->stats.rx_evm_percentage[nspatial_stream] =
+                                               ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
+                                               (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
+                               }
+                       }
+               }
+       }
+
+}
+
+static u8 rtl819x_query_rxpwrpercentage(
+       char            antpower
+       )
+{
+       if ((antpower <= -100) || (antpower >= 20))
+       {
+               return  0;
+       }
+       else if (antpower >= 0)
+       {
+               return  100;
+       }
+       else
+       {
+               return  (100+antpower);
+       }
+
+}
+
+static u8
+rtl819x_evm_dbtopercentage(
+       char value
+       )
+{
+       char ret_val;
+
+       ret_val = value;
+
+       if(ret_val >= 0)
+               ret_val = 0;
+       if(ret_val <= -33)
+               ret_val = -33;
+       ret_val = 0 - ret_val;
+       ret_val*=3;
+       if(ret_val == 99)
+               ret_val = 100;
+       return ret_val;
+}
+
+/* We want good-looking for signal strength/quality */
+static long rtl819x_signal_scale_mapping(long currsig)
+{
+       long retsig;
+
+       // Step 1. Scale mapping.
+       if(currsig >= 61 && currsig <= 100)
+       {
+               retsig = 90 + ((currsig - 60) / 4);
+       }
+       else if(currsig >= 41 && currsig <= 60)
+       {
+               retsig = 78 + ((currsig - 40) / 2);
+       }
+       else if(currsig >= 31 && currsig <= 40)
+       {
+               retsig = 66 + (currsig - 30);
+       }
+       else if(currsig >= 21 && currsig <= 30)
+       {
+               retsig = 54 + (currsig - 20);
+       }
+       else if(currsig >= 5 && currsig <= 20)
+       {
+               retsig = 42 + (((currsig - 5) * 2) / 3);
+       }
+       else if(currsig == 4)
+       {
+               retsig = 36;
+       }
+       else if(currsig == 3)
+       {
+               retsig = 27;
+       }
+       else if(currsig == 2)
+       {
+               retsig = 18;
+       }
+       else if(currsig == 1)
+       {
+               retsig = 9;
+       }
+       else
+       {
+               retsig = currsig;
+       }
+
+       return retsig;
+}
+
+static void rtl8192_query_rxphystatus(
+       struct r8192_priv * priv,
+       struct ieee80211_rx_stats * pstats,
+       prx_desc_819x_pci  pdesc,
+       prx_fwinfo_819x_pci   pdrvinfo,
+       struct ieee80211_rx_stats * precord_stats,
+       bool bpacket_match_bssid,
+       bool bpacket_toself,
+       bool bPacketBeacon,
+       bool bToSelfBA
+       )
+{
+       //PRT_RFD_STATUS                pRtRfdStatus = &(pRfd->Status);
+       phy_sts_ofdm_819xpci_t* pofdm_buf;
+       phy_sts_cck_819xpci_t   *       pcck_buf;
+       phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
+       u8                              *prxpkt;
+       u8                              i,max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
+       char                            rx_pwr[4], rx_pwr_all=0;
+       //long                          rx_avg_pwr = 0;
+       char                            rx_snrX, rx_evmX;
+       u8                              evm, pwdb_all;
+       u32                     RSSI, total_rssi=0;//, total_evm=0;
+//     long                            signal_strength_index = 0;
+       u8                              is_cck_rate=0;
+       u8                              rf_rx_num = 0;
+
+       is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
+
+       // Record it for next packet processing
+       memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
+       pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
+       pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
+       pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
+       pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
+       pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
+       /*2007.08.30 requested by SD3 Jerry */
+       if (priv->phy_check_reg824 == 0)
+       {
+               priv->phy_reg824_bit9 = rtl8192_QueryBBReg(priv, rFPGA0_XA_HSSIParameter2, 0x200);
+               priv->phy_check_reg824 = 1;
+       }
+
+
+       prxpkt = (u8*)pdrvinfo;
+
+       /* Move pointer to the 16th bytes. Phy status start address. */
+       prxpkt += sizeof(rx_fwinfo_819x_pci);
+
+       /* Initial the cck and ofdm buffer pointer */
+       pcck_buf = (phy_sts_cck_819xpci_t *)prxpkt;
+       pofdm_buf = (phy_sts_ofdm_819xpci_t *)prxpkt;
+
+       pstats->RxMIMOSignalQuality[0] = -1;
+       pstats->RxMIMOSignalQuality[1] = -1;
+       precord_stats->RxMIMOSignalQuality[0] = -1;
+       precord_stats->RxMIMOSignalQuality[1] = -1;
+
+       if(is_cck_rate)
+       {
+               //
+               // (1)Hardware does not provide RSSI for CCK
+               //
+
+               //
+               // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
+               //
+               u8 report;//, cck_agc_rpt;
+
+               if (!priv->phy_reg824_bit9)
+               {
+                       report = pcck_buf->cck_agc_rpt & 0xc0;
+                       report = report>>6;
+                       switch(report)
+                       {
+                               //Fixed by Jacken from Bryant 2008-03-20
+                               //Original value is -38 , -26 , -14 , -2
+                               //Fixed value is -35 , -23 , -11 , 6
+                               case 0x3:
+                                       rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                               case 0x2:
+                                       rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                               case 0x1:
+                                       rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                               case 0x0:
+                                       rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                       }
+               }
+               else
+               {
+                       report = pcck_buf->cck_agc_rpt & 0x60;
+                       report = report>>5;
+                       switch(report)
+                       {
+                               case 0x3:
+                                       rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+                                       break;
+                               case 0x2:
+                                       rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
+                                       break;
+                               case 0x1:
+                                       rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+                                       break;
+                               case 0x0:
+                                       rx_pwr_all = -8 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+                                       break;
+                       }
+               }
+
+               pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
+               pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
+               pstats->RecvSignalPower = rx_pwr_all;
+
+               //
+               // (3) Get Signal Quality (EVM)
+               //
+               if(bpacket_match_bssid)
+               {
+                       u8      sq;
+
+                       if(pstats->RxPWDBAll > 40)
+                       {
+                               sq = 100;
+                       }else
+                       {
+                               sq = pcck_buf->sq_rpt;
+
+                               if(pcck_buf->sq_rpt > 64)
+                                       sq = 0;
+                               else if (pcck_buf->sq_rpt < 20)
+                                       sq = 100;
+                               else
+                                       sq = ((64-sq) * 100) / 44;
+                       }
+                       pstats->SignalQuality = precord_stats->SignalQuality = sq;
+                       pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
+                       pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
+               }
+       }
+       else
+       {
+               //
+               // (1)Get RSSI for HT rate
+               //
+               for(i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+               {
+                       // 2008/01/30 MH we will judge RF RX path now.
+                       if (priv->brfpath_rxenable[i])
+                               rf_rx_num++;
+                       //else
+                               //continue;
+
+                       //Fixed by Jacken from Bryant 2008-03-20
+                       //Original value is 106
+                       rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 110;
+
+                       //Get Rx snr value in DB
+                       tmp_rxsnr = pofdm_buf->rxsnr_X[i];
+                       rx_snrX = (char)(tmp_rxsnr);
+                       rx_snrX /= 2;
+
+                       /* Translate DBM to percentage. */
+                       RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
+                       if (priv->brfpath_rxenable[i])
+                               total_rssi += RSSI;
+
+                       /* Record Signal Strength for next packet */
+                       if(bpacket_match_bssid)
+                       {
+                               pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
+                               precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
+                       }
+               }
+
+
+               //
+               // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
+               //
+               //Fixed by Jacken from Bryant 2008-03-20
+               //Original value is 106
+               rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
+               pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
+
+               pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
+               pstats->RxPower = precord_stats->RxPower =      rx_pwr_all;
+               pstats->RecvSignalPower = rx_pwr_all;
+               //
+               // (3)EVM of HT rate
+               //
+               if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
+                       pdrvinfo->RxRate<=DESC90_RATEMCS15)
+                       max_spatial_stream = 2; //both spatial stream make sense
+               else
+                       max_spatial_stream = 1; //only spatial stream 1 makes sense
+
+               for(i=0; i<max_spatial_stream; i++)
+               {
+                       tmp_rxevm = pofdm_buf->rxevm_X[i];
+                       rx_evmX = (char)(tmp_rxevm);
+
+                       // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
+                       // fill most significant bit to "zero" when doing shifting operation which may change a negative
+                       // value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.
+                       rx_evmX /= 2;   //dbm
+
+                       evm = rtl819x_evm_dbtopercentage(rx_evmX);
+                       if(bpacket_match_bssid)
+                       {
+                               if(i==0) // Fill value in RFD, Get the first spatial stream only
+                                       pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
+                               pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
+                       }
+               }
+
+
+               /* record rx statistics for debug */
+               rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
+               prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
+       }
+
+       //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
+       //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
+       if(is_cck_rate)
+       {
+               pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;
+
+       }
+       else
+       {
+               //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u1Byte)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u1Byte)(total_rssi/=RF90_PATH_MAX);
+               // We can judge RX path number now.
+               if (rf_rx_num != 0)
+                       pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
+       }
+}
+
+static void
+rtl8192_record_rxdesc_forlateruse(
+       struct ieee80211_rx_stats * psrc_stats,
+       struct ieee80211_rx_stats * ptarget_stats
+)
+{
+       ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
+       ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
+}
+
+
+
+static void TranslateRxSignalStuff819xpci(struct r8192_priv *priv,
+        struct sk_buff *skb,
+        struct ieee80211_rx_stats * pstats,
+        prx_desc_819x_pci pdesc,
+        prx_fwinfo_819x_pci pdrvinfo)
+{
+    // TODO: We must only check packet for current MAC address. Not finish
+    bool bpacket_match_bssid, bpacket_toself;
+    bool bPacketBeacon=false, bToSelfBA=false;
+    struct ieee80211_hdr_3addr *hdr;
+    u16 fc,type;
+
+    // Get Signal Quality for only RX data queue (but not command queue)
+
+    u8* tmp_buf;
+    u8 *praddr;
+
+    /* Get MAC frame start address. */
+    tmp_buf = skb->data;
+
+    hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
+    fc = le16_to_cpu(hdr->frame_ctl);
+    type = WLAN_FC_GET_TYPE(fc);
+    praddr = hdr->addr1;
+
+    /* Check if the received packet is acceptabe. */
+    bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
+            (!compare_ether_addr(priv->ieee80211->current_network.bssid,       (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
+            && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
+    bpacket_toself =  bpacket_match_bssid & (!compare_ether_addr(praddr, priv->ieee80211->dev->dev_addr));
+
+    if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
+    {
+        bPacketBeacon = true;
+    }
+    if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
+    {
+        if (!compare_ether_addr(praddr, priv->ieee80211->dev->dev_addr))
+            bToSelfBA = true;
+    }
+
+    //
+    // Process PHY information for previous packet (RSSI/PWDB/EVM)
+    //
+    // Because phy information is contained in the last packet of AMPDU only, so driver
+    // should process phy information of previous packet
+    rtl8192_process_phyinfo(priv, tmp_buf, &priv->previous_stats, pstats);
+    rtl8192_query_rxphystatus(priv, pstats, pdesc, pdrvinfo, &priv->previous_stats, bpacket_match_bssid,
+            bpacket_toself ,bPacketBeacon, bToSelfBA);
+    rtl8192_record_rxdesc_forlateruse(pstats, &priv->previous_stats);
+
+}
+
+
+static void rtl8192_tx_resume(struct r8192_priv *priv)
+{
+       struct ieee80211_device *ieee = priv->ieee80211;
+       struct sk_buff *skb;
+       int i;
+
+       for (i = BK_QUEUE; i < TXCMD_QUEUE; i++) {
+               while ((!skb_queue_empty(&ieee->skb_waitQ[i])) &&
+                      (priv->ieee80211->check_nic_enough_desc(ieee, i) > 0)) {
+                       /* 1. dequeue the packet from the wait queue */
+                       skb = skb_dequeue(&ieee->skb_waitQ[i]);
+                       /* 2. tx the packet directly */
+                       ieee->softmac_data_hard_start_xmit(skb, ieee, 0);
+               }
+       }
+}
+
+static void rtl8192_irq_tx_tasklet(unsigned long arg)
+{
+       struct r8192_priv *priv = (struct r8192_priv*) arg;
+       struct rtl8192_tx_ring *mgnt_ring = &priv->tx_ring[MGNT_QUEUE];
+       unsigned long flags;
+
+       /* check if we need to report that the management queue is drained */
+       spin_lock_irqsave(&priv->irq_th_lock, flags);
+
+       if (!skb_queue_len(&mgnt_ring->queue) &&
+           priv->ieee80211->ack_tx_to_ieee &&
+           rtl8192_is_tx_queue_empty(priv->ieee80211)) {
+               priv->ieee80211->ack_tx_to_ieee = 0;
+               ieee80211_ps_tx_ack(priv->ieee80211, 1);
+       }
+
+       spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+
+       rtl8192_tx_resume(priv);
+}
+
+/* Record the received data rate */
+static void UpdateReceivedRateHistogramStatistics8190(
+       struct r8192_priv *priv,
+       struct ieee80211_rx_stats* pstats
+       )
+{
+       u32 rcvType=1;   //0: Total, 1:OK, 2:CRC, 3:ICV
+       u32 rateIndex;
+       u32 preamble_guardinterval;  //1: short preamble/GI, 0: long preamble/GI
+
+       if(pstats->bCRC)
+               rcvType = 2;
+       else if(pstats->bICV)
+               rcvType = 3;
+
+       if(pstats->bShortPreamble)
+               preamble_guardinterval = 1;// short
+       else
+               preamble_guardinterval = 0;// long
+
+       switch(pstats->rate)
+       {
+               //
+               // CCK rate
+               //
+               case MGN_1M:    rateIndex = 0;  break;
+               case MGN_2M:    rateIndex = 1;  break;
+               case MGN_5_5M:  rateIndex = 2;  break;
+               case MGN_11M:   rateIndex = 3;  break;
+               //
+               // Legacy OFDM rate
+               //
+               case MGN_6M:    rateIndex = 4;  break;
+               case MGN_9M:    rateIndex = 5;  break;
+               case MGN_12M:   rateIndex = 6;  break;
+               case MGN_18M:   rateIndex = 7;  break;
+               case MGN_24M:   rateIndex = 8;  break;
+               case MGN_36M:   rateIndex = 9;  break;
+               case MGN_48M:   rateIndex = 10; break;
+               case MGN_54M:   rateIndex = 11; break;
+               //
+               // 11n High throughput rate
+               //
+               case MGN_MCS0:  rateIndex = 12; break;
+               case MGN_MCS1:  rateIndex = 13; break;
+               case MGN_MCS2:  rateIndex = 14; break;
+               case MGN_MCS3:  rateIndex = 15; break;
+               case MGN_MCS4:  rateIndex = 16; break;
+               case MGN_MCS5:  rateIndex = 17; break;
+               case MGN_MCS6:  rateIndex = 18; break;
+               case MGN_MCS7:  rateIndex = 19; break;
+               case MGN_MCS8:  rateIndex = 20; break;
+               case MGN_MCS9:  rateIndex = 21; break;
+               case MGN_MCS10: rateIndex = 22; break;
+               case MGN_MCS11: rateIndex = 23; break;
+               case MGN_MCS12: rateIndex = 24; break;
+               case MGN_MCS13: rateIndex = 25; break;
+               case MGN_MCS14: rateIndex = 26; break;
+               case MGN_MCS15: rateIndex = 27; break;
+               default:        rateIndex = 28; break;
+       }
+       priv->stats.received_rate_histogram[0][rateIndex]++; //total
+       priv->stats.received_rate_histogram[rcvType][rateIndex]++;
+}
+
+static void rtl8192_rx(struct r8192_priv *priv)
+{
+    struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
+    bool unicast_packet = false;
+    struct ieee80211_rx_stats stats = {
+        .signal = 0,
+        .noise = -98,
+        .rate = 0,
+        .freq = IEEE80211_24GHZ_BAND,
+    };
+    unsigned int count = priv->rxringcount;
+    prx_fwinfo_819x_pci pDrvInfo = NULL;
+    struct sk_buff *new_skb;
+
+    while (count--) {
+        rx_desc_819x_pci *pdesc = &priv->rx_ring[priv->rx_idx];//rx descriptor
+        struct sk_buff *skb = priv->rx_buf[priv->rx_idx];//rx pkt
+
+        if (pdesc->OWN)
+            /* wait data to be filled by hardware */
+            return;
+
+            stats.bICV = pdesc->ICV;
+            stats.bCRC = pdesc->CRC32;
+            stats.bHwError = pdesc->CRC32 | pdesc->ICV;
+
+            stats.Length = pdesc->Length;
+            if(stats.Length < 24)
+                stats.bHwError |= 1;
+
+            if(stats.bHwError) {
+                stats.bShift = false;
+                goto done;
+            }
+                pDrvInfo = NULL;
+                new_skb = dev_alloc_skb(priv->rxbuffersize);
+
+                if (unlikely(!new_skb))
+                    goto done;
+
+                stats.RxDrvInfoSize = pdesc->RxDrvInfoSize;
+                stats.RxBufShift = ((pdesc->Shift)&0x03);
+                stats.Decrypted = !pdesc->SWDec;
+
+                pci_dma_sync_single_for_cpu(priv->pdev,
+                     *((dma_addr_t *)skb->cb),
+                     priv->rxbuffersize,
+                     PCI_DMA_FROMDEVICE);
+                skb_put(skb, pdesc->Length);
+                pDrvInfo = (rx_fwinfo_819x_pci *)(skb->data + stats.RxBufShift);
+                skb_reserve(skb, stats.RxDrvInfoSize + stats.RxBufShift);
+
+                stats.rate = HwRateToMRate90((bool)pDrvInfo->RxHT, (u8)pDrvInfo->RxRate);
+                stats.bShortPreamble = pDrvInfo->SPLCP;
+
+                /* it is debug only. It should be disabled in released driver.
+                 * 2007.1.11 by Emily
+                 * */
+                UpdateReceivedRateHistogramStatistics8190(priv, &stats);
+
+                stats.bIsAMPDU = (pDrvInfo->PartAggr==1);
+                stats.bFirstMPDU = (pDrvInfo->PartAggr==1) && (pDrvInfo->FirstAGGR==1);
+
+                stats.TimeStampLow = pDrvInfo->TSFL;
+                stats.TimeStampHigh = read_nic_dword(priv, TSFR+4);
+
+                UpdateRxPktTimeStamp8190(priv, &stats);
+
+                //
+                // Get Total offset of MPDU Frame Body
+                //
+                if((stats.RxBufShift + stats.RxDrvInfoSize) > 0)
+                    stats.bShift = 1;
+
+                /* ???? */
+                TranslateRxSignalStuff819xpci(priv, skb, &stats, pdesc, pDrvInfo);
+
+                /* Rx A-MPDU */
+                if(pDrvInfo->FirstAGGR==1 || pDrvInfo->PartAggr == 1)
+                    RT_TRACE(COMP_RXDESC, "pDrvInfo->FirstAGGR = %d, pDrvInfo->PartAggr = %d\n",
+                            pDrvInfo->FirstAGGR, pDrvInfo->PartAggr);
+                  skb_trim(skb, skb->len - 4/*sCrcLng*/);
+                /* rx packets statistics */
+                ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
+                unicast_packet = false;
+
+                if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
+                    //TODO
+                }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
+                    //TODO
+                }else {
+                    /* unicast packet */
+                    unicast_packet = true;
+                }
+
+                if(!ieee80211_rtl_rx(priv->ieee80211, skb, &stats)){
+                    dev_kfree_skb_any(skb);
+                } else {
+                    priv->stats.rxok++;
+                    if(unicast_packet) {
+                        priv->stats.rxbytesunicast += skb->len;
+                    }
+                }
+
+               pci_unmap_single(priv->pdev, *((dma_addr_t *) skb->cb),
+                       priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+
+                skb = new_skb;
+                priv->rx_buf[priv->rx_idx] = skb;
+                *((dma_addr_t *) skb->cb) = pci_map_single(priv->pdev, skb_tail_pointer(skb), priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+
+done:
+        pdesc->BufferAddress = cpu_to_le32(*((dma_addr_t *)skb->cb));
+        pdesc->OWN = 1;
+        pdesc->Length = priv->rxbuffersize;
+        if (priv->rx_idx == priv->rxringcount-1)
+            pdesc->EOR = 1;
+        priv->rx_idx = (priv->rx_idx + 1) % priv->rxringcount;
+    }
+
+}
+
+static void rtl8192_irq_rx_tasklet(unsigned long arg)
+{
+       struct r8192_priv *priv = (struct r8192_priv*) arg;
+       rtl8192_rx(priv);
+       /* unmask RDU */
+       write_nic_dword(priv, INTA_MASK, read_nic_dword(priv, INTA_MASK) | IMR_RDU);
+}
+
+static const struct net_device_ops rtl8192_netdev_ops = {
+       .ndo_open =                     rtl8192_open,
+       .ndo_stop =                     rtl8192_close,
+       .ndo_tx_timeout =               tx_timeout,
+       .ndo_do_ioctl =                 rtl8192_ioctl,
+       .ndo_set_multicast_list =       r8192_set_multicast,
+       .ndo_set_mac_address =          r8192_set_mac_adr,
+       .ndo_start_xmit =               ieee80211_rtl_xmit,
+};
+
+static int __devinit rtl8192_pci_probe(struct pci_dev *pdev,
+                        const struct pci_device_id *id)
+{
+       struct net_device *dev = NULL;
+       struct r8192_priv *priv= NULL;
+       u8 unit = 0;
+       int ret = -ENODEV;
+       unsigned long pmem_start, pmem_len, pmem_flags;
+       u8 revisionid;
+
+       RT_TRACE(COMP_INIT,"Configuring chip resources\n");
+
+       if( pci_enable_device (pdev) ){
+               RT_TRACE(COMP_ERR,"Failed to enable PCI device");
+               return -EIO;
+       }
+
+       pci_set_master(pdev);
+       //pci_set_wmi(pdev);
+       pci_set_dma_mask(pdev, 0xffffff00ULL);
+       pci_set_consistent_dma_mask(pdev,0xffffff00ULL);
+       dev = alloc_ieee80211(sizeof(struct r8192_priv));
+       if (!dev) {
+               ret = -ENOMEM;
+               goto fail_free;
+       }
+
+       pci_set_drvdata(pdev, dev);
+       SET_NETDEV_DEV(dev, &pdev->dev);
+       priv = ieee80211_priv(dev);
+       priv->ieee80211 = netdev_priv(dev);
+       priv->pdev=pdev;
+       if((pdev->subsystem_vendor == PCI_VENDOR_ID_DLINK)&&(pdev->subsystem_device == 0x3304)){
+               priv->ieee80211->bSupportRemoteWakeUp = 1;
+       } else
+       {
+               priv->ieee80211->bSupportRemoteWakeUp = 0;
+       }
+
+       pmem_start = pci_resource_start(pdev, 1);
+       pmem_len = pci_resource_len(pdev, 1);
+       pmem_flags = pci_resource_flags (pdev, 1);
+
+       if (!(pmem_flags & IORESOURCE_MEM)) {
+               RT_TRACE(COMP_ERR, "region #1 not a MMIO resource, aborting\n");
+               goto fail;
+       }
+
+       //DMESG("Memory mapped space @ 0x%08lx ", pmem_start);
+       if( ! request_mem_region(pmem_start, pmem_len, RTL819xE_MODULE_NAME)) {
+               RT_TRACE(COMP_ERR,"request_mem_region failed!\n");
+               goto fail;
+       }
+
+       priv->mem_start = ioremap_nocache(pmem_start, pmem_len);
+       if (!priv->mem_start) {
+               RT_TRACE(COMP_ERR,"ioremap failed!\n");
+               goto fail1;
+       }
+
+       dev->mem_start = (unsigned long) priv->mem_start;
+       dev->mem_end = (unsigned long) (priv->mem_start +
+                                       pci_resource_len(pdev, 0));
+
+        /* We disable the RETRY_TIMEOUT register (0x41) to keep
+         * PCI Tx retries from interfering with C3 CPU state */
+         pci_write_config_byte(pdev, 0x41, 0x00);
+
+
+       pci_read_config_byte(pdev, 0x08, &revisionid);
+       /* If the revisionid is 0x10, the device uses rtl8192se. */
+       if (pdev->device == 0x8192 && revisionid == 0x10)
+               goto fail1;
+
+       pci_read_config_byte(pdev, 0x05, &unit);
+       pci_write_config_byte(pdev, 0x05, unit & (~0x04));
+
+       dev->irq = pdev->irq;
+       priv->irq = 0;
+
+       dev->netdev_ops = &rtl8192_netdev_ops;
+
+       dev->wireless_handlers = &r8192_wx_handlers_def;
+       dev->type=ARPHRD_ETHER;
+
+       dev->watchdog_timeo = HZ*3;
+
+       if (dev_alloc_name(dev, ifname) < 0){
+                RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
+               strcpy(ifname, "wlan%d");
+               dev_alloc_name(dev, ifname);
+        }
+
+       RT_TRACE(COMP_INIT, "Driver probe completed1\n");
+       if (rtl8192_init(priv)!=0) {
+               RT_TRACE(COMP_ERR, "Initialization failed\n");
+               goto fail;
+       }
+
+       register_netdev(dev);
+       RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
+       rtl8192_proc_init_one(priv);
+
+
+       RT_TRACE(COMP_INIT, "Driver probe completed\n");
+       return 0;
+
+fail1:
+
+       if (priv->mem_start) {
+               iounmap(priv->mem_start);
+               release_mem_region( pci_resource_start(pdev, 1),
+                                   pci_resource_len(pdev, 1) );
+       }
+
+fail:
+       if(dev){
+
+               if (priv->irq) {
+                       free_irq(priv->irq, priv);
+                       priv->irq = 0;
+               }
+               free_ieee80211(dev);
+       }
+
+fail_free:
+       pci_disable_device(pdev);
+
+       DMESG("wlan driver load failed\n");
+       pci_set_drvdata(pdev, NULL);
+       return ret;
+
+}
+
+/* detach all the work and timer structure declared or inititialized
+ * in r8192_init function.
+ * */
+static void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
+{
+       /* call cancel_work_sync instead of cancel_delayed_work if and only if Linux_version_code
+         * is  or is newer than 2.6.20 and work structure is defined to be struct work_struct.
+         * Otherwise call cancel_delayed_work is enough.
+         * FIXME (2.6.20 should 2.6.22, work_struct should not cancel)
+         * */
+       cancel_delayed_work(&priv->watch_dog_wq);
+       cancel_delayed_work(&priv->update_beacon_wq);
+       cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
+       cancel_delayed_work(&priv->gpio_change_rf_wq);
+       cancel_work_sync(&priv->reset_wq);
+       cancel_work_sync(&priv->qos_activate);
+}
+
+
+static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct r8192_priv *priv ;
+       u32 i;
+
+       if (dev) {
+
+               unregister_netdev(dev);
+
+               priv = ieee80211_priv(dev);
+
+               rtl8192_proc_remove_one(priv);
+
+               rtl8192_down(dev);
+               if (priv->pFirmware)
+               {
+                       vfree(priv->pFirmware);
+                       priv->pFirmware = NULL;
+               }
+               destroy_workqueue(priv->priv_wq);
+
+               /* free tx/rx rings */
+               rtl8192_free_rx_ring(priv);
+               for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+                       rtl8192_free_tx_ring(priv, i);
+
+               if (priv->irq) {
+                       printk("Freeing irq %d\n", priv->irq);
+                       free_irq(priv->irq, priv);
+                       priv->irq = 0;
+               }
+
+               if (priv->mem_start) {
+                       iounmap(priv->mem_start);
+                       release_mem_region( pci_resource_start(pdev, 1),
+                                           pci_resource_len(pdev, 1) );
+               }
+
+               free_ieee80211(dev);
+       }
+
+       pci_disable_device(pdev);
+       RT_TRACE(COMP_DOWN, "wlan driver removed\n");
+}
+
+extern int ieee80211_rtl_init(void);
+extern void ieee80211_rtl_exit(void);
+
+static int __init rtl8192_pci_module_init(void)
+{
+       int retval;
+
+       retval = ieee80211_rtl_init();
+       if (retval)
+               return retval;
+
+       printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
+       printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
+       RT_TRACE(COMP_INIT, "Initializing module\n");
+       rtl8192_proc_module_init();
+      if(0!=pci_register_driver(&rtl8192_pci_driver))
+       {
+               DMESG("No device found");
+               /*pci_unregister_driver (&rtl8192_pci_driver);*/
+               return -ENODEV;
+       }
+       return 0;
+}
+
+
+static void __exit rtl8192_pci_module_exit(void)
+{
+       pci_unregister_driver(&rtl8192_pci_driver);
+
+       RT_TRACE(COMP_DOWN, "Exiting\n");
+       rtl8192_proc_module_remove();
+       ieee80211_rtl_exit();
+}
+
+static irqreturn_t rtl8192_interrupt(int irq, void *param)
+{
+       struct r8192_priv *priv = param;
+       struct net_device *dev = priv->ieee80211->dev;
+       unsigned long flags;
+       u32 inta;
+       irqreturn_t ret = IRQ_HANDLED;
+
+       spin_lock_irqsave(&priv->irq_th_lock, flags);
+
+       /* ISR: 4bytes */
+
+       inta = read_nic_dword(priv, ISR); /* & priv->IntrMask; */
+       write_nic_dword(priv, ISR, inta); /* reset int situation */
+
+       if (!inta) {
+               /*
+                * most probably we can safely return IRQ_NONE,
+                * but for now is better to avoid problems
+                */
+               goto out_unlock;
+       }
+
+       if (inta == 0xffff) {
+               /* HW disappared */
+               goto out_unlock;
+       }
+
+       if (!netif_running(dev))
+               goto out_unlock;
+
+       if (inta & IMR_TBDOK) {
+               RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+               rtl8192_tx_isr(priv, BEACON_QUEUE);
+               priv->stats.txbeaconokint++;
+       }
+
+       if (inta & IMR_TBDER) {
+               RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+               rtl8192_tx_isr(priv, BEACON_QUEUE);
+               priv->stats.txbeaconerr++;
+       }
+
+       if (inta & IMR_MGNTDOK ) {
+               RT_TRACE(COMP_INTR, "Manage ok interrupt!\n");
+               priv->stats.txmanageokint++;
+               rtl8192_tx_isr(priv, MGNT_QUEUE);
+       }
+
+       if (inta & IMR_COMDOK)
+       {
+               priv->stats.txcmdpktokint++;
+               rtl8192_tx_isr(priv, TXCMD_QUEUE);
+       }
+
+       if (inta & IMR_ROK) {
+               priv->stats.rxint++;
+               tasklet_schedule(&priv->irq_rx_tasklet);
+       }
+
+       if (inta & IMR_BcnInt) {
+               RT_TRACE(COMP_INTR, "prepare beacon for interrupt!\n");
+               tasklet_schedule(&priv->irq_prepare_beacon_tasklet);
+       }
+
+       if (inta & IMR_RDU) {
+               RT_TRACE(COMP_INTR, "rx descriptor unavailable!\n");
+               priv->stats.rxrdu++;
+               /* reset int situation */
+               write_nic_dword(priv, INTA_MASK, read_nic_dword(priv, INTA_MASK) & ~IMR_RDU);
+               tasklet_schedule(&priv->irq_rx_tasklet);
+       }
+
+       if (inta & IMR_RXFOVW) {
+               RT_TRACE(COMP_INTR, "rx overflow !\n");
+               priv->stats.rxoverflow++;
+               tasklet_schedule(&priv->irq_rx_tasklet);
+       }
+
+       if (inta & IMR_TXFOVW)
+               priv->stats.txoverflow++;
+
+       if (inta & IMR_BKDOK) {
+               RT_TRACE(COMP_INTR, "BK Tx OK interrupt!\n");
+               priv->stats.txbkokint++;
+               priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(priv, BK_QUEUE);
+       }
+
+       if (inta & IMR_BEDOK) {
+               RT_TRACE(COMP_INTR, "BE TX OK interrupt!\n");
+               priv->stats.txbeokint++;
+               priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(priv, BE_QUEUE);
+       }
+
+       if (inta & IMR_VIDOK) {
+               RT_TRACE(COMP_INTR, "VI TX OK interrupt!\n");
+               priv->stats.txviokint++;
+               priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(priv, VI_QUEUE);
+       }
+
+       if (inta & IMR_VODOK) {
+               priv->stats.txvookint++;
+               priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(priv, VO_QUEUE);
+       }
+
+out_unlock:
+       spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+
+       return ret;
+}
+
+void EnableHWSecurityConfig8192(struct r8192_priv *priv)
+{
+        u8 SECR_value = 0x0;
+       struct ieee80211_device* ieee = priv->ieee80211;
+
+       SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
+
+       if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
+       {
+               SECR_value |= SCR_RxUseDK;
+               SECR_value |= SCR_TxUseDK;
+       }
+       else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
+       {
+               SECR_value |= SCR_RxUseDK;
+               SECR_value |= SCR_TxUseDK;
+       }
+
+        //add HWSec active enable here.
+//default using hwsec. when peer AP is in N mode only and pairwise_key_type is none_aes(which HT_IOT_ACT_PURE_N_MODE indicates it), use software security. when peer AP is in b,g,n mode mixed and pairwise_key_type is none_aes, use g mode hw security. WB on 2008.7.4
+       ieee->hwsec_active = 1;
+
+       if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep)//!ieee->hwsec_support) //add hwsec_support flag to totol control hw_sec on/off
+       {
+               ieee->hwsec_active = 0;
+               SECR_value &= ~SCR_RxDecEnable;
+       }
+
+       RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__,
+                       ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
+       {
+                write_nic_byte(priv, SECR,  SECR_value);//SECR_value |  SCR_UseDK );
+        }
+
+}
+#define TOTAL_CAM_ENTRY 32
+//#define CAM_CONTENT_COUNT 8
+void setKey(struct r8192_priv *priv, u8 EntryNo, u8 KeyIndex, u16 KeyType,
+           const u8 *MacAddr, u8 DefaultKey, u32 *KeyContent)
+{
+       u32 TargetCommand = 0;
+       u32 TargetContent = 0;
+       u16 usConfig = 0;
+       u8 i;
+#ifdef ENABLE_IPS
+       RT_RF_POWER_STATE       rtState;
+
+       rtState = priv->eRFPowerState;
+       if (priv->PowerSaveControl.bInactivePs){
+               if(rtState == eRfOff){
+                       if(priv->RfOffReason > RF_CHANGE_BY_IPS)
+                       {
+                               RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
+                               //up(&priv->wx_sem);
+                               return ;
+                       }
+                       else{
+                               down(&priv->ieee80211->ips_sem);
+                               IPSLeave(priv);
+                               up(&priv->ieee80211->ips_sem);
+                       }
+               }
+       }
+       priv->ieee80211->is_set_key = true;
+#endif
+       if (EntryNo >= TOTAL_CAM_ENTRY)
+               RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
+
+       RT_TRACE(COMP_SEC, "====>to setKey(), priv:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", priv, EntryNo, KeyIndex, KeyType, MacAddr);
+
+       if (DefaultKey)
+               usConfig |= BIT15 | (KeyType<<2);
+       else
+               usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
+//     usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
+
+
+       for(i=0 ; i<CAM_CONTENT_COUNT; i++){
+               TargetCommand  = i+CAM_CONTENT_COUNT*EntryNo;
+               TargetCommand |= BIT31|BIT16;
+
+               if(i==0){//MAC|Config
+                       TargetContent = (u32)(*(MacAddr+0)) << 16|
+                                       (u32)(*(MacAddr+1)) << 24|
+                                       (u32)usConfig;
+
+                       write_nic_dword(priv, WCAMI, TargetContent);
+                       write_nic_dword(priv, RWCAM, TargetCommand);
+               }
+               else if(i==1){//MAC
+                        TargetContent = (u32)(*(MacAddr+2))     |
+                                        (u32)(*(MacAddr+3)) <<  8|
+                                        (u32)(*(MacAddr+4)) << 16|
+                                        (u32)(*(MacAddr+5)) << 24;
+                       write_nic_dword(priv, WCAMI, TargetContent);
+                       write_nic_dword(priv, RWCAM, TargetCommand);
+               }
+               else {  //Key Material
+                       if(KeyContent != NULL)
+                       {
+                       write_nic_dword(priv, WCAMI, (u32)(*(KeyContent+i-2)) );
+                       write_nic_dword(priv, RWCAM, TargetCommand);
+               }
+       }
+       }
+       RT_TRACE(COMP_SEC,"=========>after set key, usconfig:%x\n", usConfig);
+}
+
+bool NicIFEnableNIC(struct r8192_priv *priv)
+{
+       RT_STATUS init_status = RT_STATUS_SUCCESS;
+       PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+
+       //YJ,add,091109
+       if (priv->up == 0){
+               RT_TRACE(COMP_ERR, "ERR!!! %s(): Driver is already down!\n",__FUNCTION__);
+               priv->bdisable_nic = false;  //YJ,add,091111
+               return false;
+       }
+       // <1> Reset memory: descriptor, buffer,..
+       //NicIFResetMemory(Adapter);
+
+       // <2> Enable Adapter
+       //priv->bfirst_init = true;
+       init_status = rtl8192_adapter_start(priv);
+       if (init_status != RT_STATUS_SUCCESS) {
+               RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n",__FUNCTION__);
+               priv->bdisable_nic = false;  //YJ,add,091111
+               return -1;
+       }
+       RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+       //priv->bfirst_init = false;
+
+       // <3> Enable Interrupt
+       rtl8192_irq_enable(priv);
+       priv->bdisable_nic = false;
+
+       return (init_status == RT_STATUS_SUCCESS);
+}
+
+bool NicIFDisableNIC(struct r8192_priv *priv)
+{
+       bool    status = true;
+       u8 tmp_state = 0;
+       // <1> Disable Interrupt
+
+       priv->bdisable_nic = true;      //YJ,move,091109
+       tmp_state = priv->ieee80211->state;
+
+       ieee80211_softmac_stop_protocol(priv->ieee80211, false);
+
+       priv->ieee80211->state = tmp_state;
+       rtl8192_cancel_deferred_work(priv);
+       rtl8192_irq_disable(priv);
+       // <2> Stop all timer
+
+       // <3> Disable Adapter
+       rtl8192_halt_adapter(priv, false);
+//     priv->bdisable_nic = true;
+
+       return status;
+}
+
+module_init(rtl8192_pci_module_init);
+module_exit(rtl8192_pci_module_exit);
diff --git a/drivers/staging/rtl8192e/r8192E_core.c.rej b/drivers/staging/rtl8192e/r8192E_core.c.rej
new file mode 100644 (file)
index 0000000..351b44c
--- /dev/null
@@ -0,0 +1,5036 @@
+--- drivers/staging/rtl8192e/r8192E_core.c
++++ drivers/staging/rtl8192e/r8192E_core.c
+@@ -1,5033 +0,0 @@
+-/******************************************************************************
+- * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+- * Linux device driver for RTL8192E
+- *
+- * Based on the r8180 driver, which is:
+- * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+- * This program is free software; you can redistribute it and/or modify it
+- * under the terms of version 2 of the GNU General Public License as
+- * published by the Free Software Foundation.
+- *
+- * This program is distributed in the hope that it will be useful, but WITHOUT
+- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+- * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+- * more details.
+- *
+- * You should have received a copy of the GNU General Public License along with
+- * this program; if not, write to the Free Software Foundation, Inc.,
+- * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+- *
+- * The full GNU General Public License is included in this distribution in the
+- * file called LICENSE.
+- *
+- * Contact Information:
+- * Jerry chuang <wlanfae@realtek.com>
+- */
+-
+-
+-#include <linux/vmalloc.h>
+-#include <linux/slab.h>
+-#include <asm/uaccess.h>
+-#include "r8192E_hw.h"
+-#include "r8192E.h"
+-#include "r8190_rtl8256.h" /* RTL8225 Radio frontend */
+-#include "r8180_93cx6.h"   /* Card EEPROM */
+-#include "r8192E_wx.h"
+-#include "r819xE_phy.h" //added by WB 4.30.2008
+-#include "r819xE_phyreg.h"
+-#include "r819xE_cmdpkt.h"
+-#include "r8192E_dm.h"
+-
+-#ifdef CONFIG_PM
+-#include "r8192_pm.h"
+-#endif
+-
+-#ifdef ENABLE_DOT11D
+-#include "ieee80211/dot11d.h"
+-#endif
+-
+-//set here to open your trace code. //WB
+-u32 rt_global_debug_component = COMP_ERR ; //always open err flags on
+-
+-static DEFINE_PCI_DEVICE_TABLE(rtl8192_pci_id_tbl) = {
+-      /* Realtek */
+-      { PCI_DEVICE(0x10ec, 0x8192) },
+-
+-      /* Corega */
+-      { PCI_DEVICE(0x07aa, 0x0044) },
+-      { PCI_DEVICE(0x07aa, 0x0047) },
+-      {}
+-};
+-
+-static char ifname[IFNAMSIZ] = "wlan%d";
+-static int hwwep = 1; //default use hw. set 0 to use software security
+-static int channels = 0x3fff;
+-
+-MODULE_LICENSE("GPL");
+-MODULE_VERSION("V 1.1");
+-MODULE_DEVICE_TABLE(pci, rtl8192_pci_id_tbl);
+-//MODULE_AUTHOR("Andrea Merello <andreamrl@tiscali.it>");
+-MODULE_DESCRIPTION("Linux driver for Realtek RTL819x WiFi cards");
+-
+-
+-module_param_string(ifname, ifname, sizeof(ifname), S_IRUGO|S_IWUSR);
+-module_param(hwwep,int, S_IRUGO|S_IWUSR);
+-module_param(channels,int, S_IRUGO|S_IWUSR);
+-
+-MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
+-MODULE_PARM_DESC(hwwep," Try to use hardware WEP support. Still broken and not available on all cards");
+-MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
+-
+-static int __devinit rtl8192_pci_probe(struct pci_dev *pdev,
+-                       const struct pci_device_id *id);
+-static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev);
+-
+-static struct pci_driver rtl8192_pci_driver = {
+-      .name           = RTL819xE_MODULE_NAME,           /* Driver name   */
+-      .id_table       = rtl8192_pci_id_tbl,             /* PCI_ID table  */
+-      .probe          = rtl8192_pci_probe,              /* probe fn      */
+-      .remove         = __devexit_p(rtl8192_pci_disconnect),    /* remove fn     */
+-#ifdef CONFIG_PM
+-      .suspend        = rtl8192E_suspend,               /* PM suspend fn */
+-      .resume         = rtl8192E_resume,                 /* PM resume fn  */
+-#else
+-      .suspend        = NULL,                           /* PM suspend fn */
+-      .resume         = NULL,                           /* PM resume fn  */
+-#endif
+-};
+-
+-static void rtl8192_start_beacon(struct ieee80211_device *ieee80211);
+-static void rtl8192_stop_beacon(struct ieee80211_device *ieee80211);
+-static void rtl819x_watchdog_wqcallback(struct work_struct *work);
+-static void rtl8192_irq_rx_tasklet(unsigned long arg);
+-static void rtl8192_irq_tx_tasklet(unsigned long arg);
+-static void rtl8192_prepare_beacon(unsigned long arg);
+-static irqreturn_t rtl8192_interrupt(int irq, void *param);
+-static void rtl819xE_tx_cmd(struct r8192_priv *priv, struct sk_buff *skb);
+-static void rtl8192_update_ratr_table(struct r8192_priv *priv);
+-static void rtl8192_restart(struct work_struct *work);
+-static void watch_dog_timer_callback(unsigned long data);
+-static int _rtl8192_up(struct r8192_priv *priv);
+-static void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
+-static short rtl8192_tx(struct r8192_priv *priv, struct sk_buff* skb);
+-
+-#ifdef ENABLE_DOT11D
+-
+-typedef struct _CHANNEL_LIST
+-{
+-      u8      Channel[32];
+-      u8      Len;
+-}CHANNEL_LIST, *PCHANNEL_LIST;
+-
+-static const CHANNEL_LIST ChannelPlan[] = {
+-      {{1,2,3,4,5,6,7,8,9,10,11,36,40,44,48,52,56,60,64,149,153,157,161,165},24},             //FCC
+-      {{1,2,3,4,5,6,7,8,9,10,11},11},                                                 //IC
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13,36,40,44,48,52,56,60,64},21},   //ETSI
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},    //Spain. Change to ETSI.
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //France. Change to ETSI.
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},        //MKK                                   //MKK
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},//MKK1
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13},13},   //Israel.
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64},22},                        // For 11a , TELEC
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13,14,36,40,44,48,52,56,60,64}, 22},    //MIC
+-      {{1,2,3,4,5,6,7,8,9,10,11,12,13,14},14}                                 //For Global Domain. 1-11:active scan, 12-14 passive scan. //+YJ, 080626
+-};
+-
+-static void rtl819x_set_channel_map(u8 channel_plan, struct r8192_priv* priv)
+-{
+-      int i, max_chan=-1, min_chan=-1;
+-      struct ieee80211_device* ieee = priv->ieee80211;
+-      switch (channel_plan)
+-      {
+-              case COUNTRY_CODE_FCC:
+-              case COUNTRY_CODE_IC:
+-              case COUNTRY_CODE_ETSI:
+-              case COUNTRY_CODE_SPAIN:
+-              case COUNTRY_CODE_FRANCE:
+-              case COUNTRY_CODE_MKK:
+-              case COUNTRY_CODE_MKK1:
+-              case COUNTRY_CODE_ISRAEL:
+-              case COUNTRY_CODE_TELEC:
+-              case COUNTRY_CODE_MIC:
+-              {
+-                      Dot11d_Init(ieee);
+-                      ieee->bGlobalDomain = false;
+-                        //acturally 8225 & 8256 rf chip only support B,G,24N mode
+-                      min_chan = 1;
+-                      max_chan = 14;
+-
+-                      if (ChannelPlan[channel_plan].Len != 0){
+-                              // Clear old channel map
+-                              memset(GET_DOT11D_INFO(ieee)->channel_map, 0, sizeof(GET_DOT11D_INFO(ieee)->channel_map));
+-                              // Set new channel map
+-                              for (i=0;i<ChannelPlan[channel_plan].Len;i++)
+-                              {
+-                                      if (ChannelPlan[channel_plan].Channel[i] < min_chan || ChannelPlan[channel_plan].Channel[i] > max_chan)
+-                                          break;
+-                                      GET_DOT11D_INFO(ieee)->channel_map[ChannelPlan[channel_plan].Channel[i]] = 1;
+-                              }
+-                      }
+-                      break;
+-              }
+-              case COUNTRY_CODE_GLOBAL_DOMAIN:
+-              {
+-                      GET_DOT11D_INFO(ieee)->bEnabled = 0; //this flag enabled to follow 11d country IE setting, otherwise, it shall follow global domain setting
+-                      Dot11d_Reset(ieee);
+-                      ieee->bGlobalDomain = true;
+-                      break;
+-              }
+-              default:
+-                      break;
+-      }
+-}
+-#endif
+-
+-static inline bool rx_hal_is_cck_rate(prx_fwinfo_819x_pci pdrvinfo)
+-{
+-      return (pdrvinfo->RxRate == DESC90_RATE1M ||
+-              pdrvinfo->RxRate == DESC90_RATE2M ||
+-              pdrvinfo->RxRate == DESC90_RATE5_5M ||
+-              pdrvinfo->RxRate == DESC90_RATE11M) &&
+-              !pdrvinfo->RxHT;
+-}
+-
+-void CamResetAllEntry(struct r8192_priv* priv)
+-{
+-      write_nic_dword(priv, RWCAM, BIT31|BIT30);
+-}
+-
+-void write_cam(struct r8192_priv *priv, u8 addr, u32 data)
+-{
+-        write_nic_dword(priv, WCAMI, data);
+-        write_nic_dword(priv, RWCAM, BIT31|BIT16|(addr&0xff) );
+-}
+-
+-u32 read_cam(struct r8192_priv *priv, u8 addr)
+-{
+-        write_nic_dword(priv, RWCAM, 0x80000000|(addr&0xff) );
+-        return read_nic_dword(priv, 0xa8);
+-}
+-
+-u8 read_nic_byte(struct r8192_priv *priv, int x)
+-{
+-        return 0xff & readb(priv->mem_start + x);
+-}
+-
+-u32 read_nic_dword(struct r8192_priv *priv, int x)
+-{
+-        return readl(priv->mem_start + x);
+-}
+-
+-u16 read_nic_word(struct r8192_priv *priv, int x)
+-{
+-        return readw(priv->mem_start + x);
+-}
+-
+-void write_nic_byte(struct r8192_priv *priv, int x,u8 y)
+-{
+-        writeb(y, priv->mem_start + x);
+-      udelay(20);
+-}
+-
+-void write_nic_dword(struct r8192_priv *priv, int x,u32 y)
+-{
+-        writel(y, priv->mem_start + x);
+-      udelay(20);
+-}
+-
+-void write_nic_word(struct r8192_priv *priv, int x,u16 y)
+-{
+-        writew(y, priv->mem_start + x);
+-      udelay(20);
+-}
+-
+-u8 rtl8192e_ap_sec_type(struct ieee80211_device *ieee)
+-{
+-      static const u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
+-      static const u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
+-      int wpa_ie_len= ieee->wpa_ie_len;
+-      struct ieee80211_crypt_data* crypt;
+-      int encrypt;
+-
+-      crypt = ieee->crypt[ieee->tx_keyidx];
+-
+-      encrypt = (ieee->current_network.capability & WLAN_CAPABILITY_PRIVACY) ||
+-                (ieee->host_encrypt && crypt && crypt->ops &&
+-                 (0 == strcmp(crypt->ops->name,"WEP")));
+-
+-      /* simply judge  */
+-      if(encrypt && (wpa_ie_len == 0)) {
+-              // wep encryption, no N mode setting */
+-              return SEC_ALG_WEP;
+-      } else if((wpa_ie_len != 0)) {
+-              // parse pairwise key type */
+-              if (((ieee->wpa_ie[0] == 0xdd) && (!memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) ||
+-                              ((ieee->wpa_ie[0] == 0x30) && (!memcmp(&ieee->wpa_ie[10],ccmp_rsn_ie, 4))))
+-                      return SEC_ALG_CCMP;
+-              else
+-                      return SEC_ALG_TKIP;
+-      } else {
+-              return SEC_ALG_NONE;
+-      }
+-}
+-
+-void rtl8192e_SetHwReg(struct ieee80211_device *ieee80211, u8 variable, u8 *val)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-
+-      switch(variable)
+-      {
+-
+-              case HW_VAR_BSSID:
+-                      write_nic_dword(priv, BSSIDR, ((u32*)(val))[0]);
+-                      write_nic_word(priv, BSSIDR+2, ((u16*)(val+2))[0]);
+-              break;
+-
+-              case HW_VAR_MEDIA_STATUS:
+-              {
+-                      RT_OP_MODE      OpMode = *((RT_OP_MODE *)(val));
+-                      u8              btMsr = read_nic_byte(priv, MSR);
+-
+-                      btMsr &= 0xfc;
+-
+-                      switch(OpMode)
+-                      {
+-                      case RT_OP_MODE_INFRASTRUCTURE:
+-                              btMsr |= MSR_INFRA;
+-                              break;
+-
+-                      case RT_OP_MODE_IBSS:
+-                              btMsr |= MSR_ADHOC;
+-                              break;
+-
+-                      case RT_OP_MODE_AP:
+-                              btMsr |= MSR_AP;
+-                              break;
+-
+-                      default:
+-                              btMsr |= MSR_NOLINK;
+-                              break;
+-                      }
+-
+-                      write_nic_byte(priv, MSR, btMsr);
+-              }
+-              break;
+-
+-              case HW_VAR_CHECK_BSSID:
+-              {
+-                      u32     RegRCR, Type;
+-
+-                      Type = ((u8*)(val))[0];
+-                      RegRCR = read_nic_dword(priv, RCR);
+-                      priv->ReceiveConfig = RegRCR;
+-
+-                      if (Type == true)
+-                              RegRCR |= (RCR_CBSSID);
+-                      else if (Type == false)
+-                              RegRCR &= (~RCR_CBSSID);
+-
+-                      write_nic_dword(priv, RCR,RegRCR);
+-                      priv->ReceiveConfig = RegRCR;
+-
+-              }
+-              break;
+-
+-              case HW_VAR_SLOT_TIME:
+-              {
+-                      priv->slot_time = val[0];
+-                      write_nic_byte(priv, SLOT_TIME, val[0]);
+-
+-              }
+-              break;
+-
+-              case HW_VAR_ACK_PREAMBLE:
+-              {
+-                      u32 regTmp = 0;
+-                      priv->short_preamble = (bool)(*(u8*)val );
+-                      regTmp = priv->basic_rate;
+-                      if (priv->short_preamble)
+-                              regTmp |= BRSR_AckShortPmb;
+-                      write_nic_dword(priv, RRSR, regTmp);
+-              }
+-              break;
+-
+-              case HW_VAR_CPU_RST:
+-                      write_nic_dword(priv, CPU_GEN, ((u32*)(val))[0]);
+-              break;
+-
+-              default:
+-              break;
+-      }
+-
+-}
+-
+-static struct proc_dir_entry *rtl8192_proc = NULL;
+-
+-static int proc_get_stats_ap(char *page, char **start,
+-                        off_t offset, int count,
+-                        int *eof, void *data)
+-{
+-      struct r8192_priv *priv = data;
+-      struct ieee80211_device *ieee = priv->ieee80211;
+-      struct ieee80211_network *target;
+-      int len = 0;
+-
+-        list_for_each_entry(target, &ieee->network_list, list) {
+-
+-              len += snprintf(page + len, count - len,
+-                "%s ", target->ssid);
+-
+-              if(target->wpa_ie_len>0 || target->rsn_ie_len>0){
+-                      len += snprintf(page + len, count - len,
+-                      "WPA\n");
+-              }
+-              else{
+-                        len += snprintf(page + len, count - len,
+-                        "non_WPA\n");
+-                }
+-
+-        }
+-
+-      *eof = 1;
+-      return len;
+-}
+-
+-static int proc_get_registers(char *page, char **start,
+-                        off_t offset, int count,
+-                        int *eof, void *data)
+-{
+-      struct r8192_priv *priv = data;
+-      int len = 0;
+-      int i,n;
+-      int max=0xff;
+-
+-      /* This dump the current register page */
+-      len += snprintf(page + len, count - len,
+-                        "\n####################page 0##################\n ");
+-
+-      for(n=0;n<=max;)
+-      {
+-              len += snprintf(page + len, count - len,
+-                      "\nD:  %2x > ",n);
+-
+-              for(i=0;i<16 && n<=max;i++,n++)
+-              len += snprintf(page + len, count - len,
+-                      "%2x ",read_nic_byte(priv,n));
+-      }
+-      len += snprintf(page + len, count - len,"\n");
+-      len += snprintf(page + len, count - len,
+-                        "\n####################page 1##################\n ");
+-        for(n=0;n<=max;)
+-        {
+-                len += snprintf(page + len, count - len,
+-                        "\nD:  %2x > ",n);
+-
+-                for(i=0;i<16 && n<=max;i++,n++)
+-                len += snprintf(page + len, count - len,
+-                        "%2x ",read_nic_byte(priv,0x100|n));
+-        }
+-
+-      len += snprintf(page + len, count - len,
+-                        "\n####################page 3##################\n ");
+-        for(n=0;n<=max;)
+-        {
+-                len += snprintf(page + len, count - len,
+-                        "\nD:  %2x > ",n);
+-
+-                for(i=0;i<16 && n<=max;i++,n++)
+-                len += snprintf(page + len, count - len,
+-                        "%2x ",read_nic_byte(priv,0x300|n));
+-        }
+-
+-      *eof = 1;
+-      return len;
+-
+-}
+-
+-static int proc_get_stats_tx(char *page, char **start,
+-                        off_t offset, int count,
+-                        int *eof, void *data)
+-{
+-      struct r8192_priv *priv = data;
+-
+-      int len = 0;
+-
+-      len += snprintf(page + len, count - len,
+-              "TX VI priority ok int: %lu\n"
+-              "TX VO priority ok int: %lu\n"
+-              "TX BE priority ok int: %lu\n"
+-              "TX BK priority ok int: %lu\n"
+-              "TX MANAGE priority ok int: %lu\n"
+-              "TX BEACON priority ok int: %lu\n"
+-              "TX BEACON priority error int: %lu\n"
+-              "TX CMDPKT priority ok int: %lu\n"
+-              "TX queue stopped?: %d\n"
+-              "TX fifo overflow: %lu\n"
+-              "TX total data packets %lu\n"
+-              "TX total data bytes :%lu\n",
+-              priv->stats.txviokint,
+-              priv->stats.txvookint,
+-              priv->stats.txbeokint,
+-              priv->stats.txbkokint,
+-              priv->stats.txmanageokint,
+-              priv->stats.txbeaconokint,
+-              priv->stats.txbeaconerr,
+-              priv->stats.txcmdpktokint,
+-              netif_queue_stopped(priv->ieee80211->dev),
+-              priv->stats.txoverflow,
+-              priv->ieee80211->stats.tx_packets,
+-              priv->ieee80211->stats.tx_bytes);
+-
+-      *eof = 1;
+-      return len;
+-}
+-
+-
+-
+-static int proc_get_stats_rx(char *page, char **start,
+-                        off_t offset, int count,
+-                        int *eof, void *data)
+-{
+-      struct r8192_priv *priv = data;
+-      int len = 0;
+-
+-      len += snprintf(page + len, count - len,
+-              "RX packets: %lu\n"
+-              "RX desc err: %lu\n"
+-              "RX rx overflow error: %lu\n",
+-              priv->stats.rxint,
+-              priv->stats.rxrdu,
+-              priv->stats.rxoverflow);
+-
+-      *eof = 1;
+-      return len;
+-}
+-
+-static void rtl8192_proc_module_init(void)
+-{
+-      RT_TRACE(COMP_INIT, "Initializing proc filesystem\n");
+-      rtl8192_proc=create_proc_entry(RTL819xE_MODULE_NAME, S_IFDIR, init_net.proc_net);
+-}
+-
+-
+-static void rtl8192_proc_module_remove(void)
+-{
+-      remove_proc_entry(RTL819xE_MODULE_NAME, init_net.proc_net);
+-}
+-
+-
+-static void rtl8192_proc_remove_one(struct r8192_priv *priv)
+-{
+-      struct net_device *dev = priv->ieee80211->dev;
+-
+-      printk("dev name=======> %s\n",dev->name);
+-
+-      if (priv->dir_dev) {
+-              remove_proc_entry("stats-tx", priv->dir_dev);
+-              remove_proc_entry("stats-rx", priv->dir_dev);
+-              remove_proc_entry("stats-ap", priv->dir_dev);
+-              remove_proc_entry("registers", priv->dir_dev);
+-              remove_proc_entry("wlan0", rtl8192_proc);
+-              priv->dir_dev = NULL;
+-      }
+-}
+-
+-
+-static void rtl8192_proc_init_one(struct r8192_priv *priv)
+-{
+-      struct net_device *dev = priv->ieee80211->dev;
+-      struct proc_dir_entry *e;
+-
+-      priv->dir_dev = create_proc_entry(dev->name,
+-                                        S_IFDIR | S_IRUGO | S_IXUGO,
+-                                        rtl8192_proc);
+-      if (!priv->dir_dev) {
+-              RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
+-                    dev->name);
+-              return;
+-      }
+-      e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
+-                                 priv->dir_dev, proc_get_stats_rx, priv);
+-
+-      if (!e) {
+-              RT_TRACE(COMP_ERR,"Unable to initialize "
+-                    "/proc/net/rtl8192/%s/stats-rx\n",
+-                    dev->name);
+-      }
+-
+-
+-      e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
+-                                 priv->dir_dev, proc_get_stats_tx, priv);
+-
+-      if (!e) {
+-              RT_TRACE(COMP_ERR, "Unable to initialize "
+-                    "/proc/net/rtl8192/%s/stats-tx\n",
+-                    dev->name);
+-      }
+-
+-      e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
+-                                 priv->dir_dev, proc_get_stats_ap, priv);
+-
+-      if (!e) {
+-              RT_TRACE(COMP_ERR, "Unable to initialize "
+-                    "/proc/net/rtl8192/%s/stats-ap\n",
+-                    dev->name);
+-      }
+-
+-      e = create_proc_read_entry("registers", S_IFREG | S_IRUGO,
+-                                 priv->dir_dev, proc_get_registers, priv);
+-      if (!e) {
+-              RT_TRACE(COMP_ERR, "Unable to initialize "
+-                    "/proc/net/rtl8192/%s/registers\n",
+-                    dev->name);
+-      }
+-}
+-
+-static short check_nic_enough_desc(struct ieee80211_device *ieee, int prio)
+-{
+-    struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-    struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+-
+-    /* for now we reserve two free descriptor as a safety boundary
+-     * between the tail and the head
+-     */
+-    return (ring->entries - skb_queue_len(&ring->queue) >= 2);
+-}
+-
+-static void tx_timeout(struct net_device *dev)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-
+-      schedule_work(&priv->reset_wq);
+-      printk("TXTIMEOUT");
+-}
+-
+-static void rtl8192_irq_enable(struct r8192_priv *priv)
+-{
+-      u32 mask;
+-
+-      mask = IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK |
+-             IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK |
+-             IMR_BDOK | IMR_RXCMDOK | IMR_TIMEOUT0 | IMR_RDU | IMR_RXFOVW |
+-             IMR_TXFOVW | IMR_BcnInt | IMR_TBDOK | IMR_TBDER;
+-
+-      write_nic_dword(priv, INTA_MASK, mask);
+-}
+-
+-static void rtl8192_irq_disable(struct r8192_priv *priv)
+-{
+-      write_nic_dword(priv, INTA_MASK, 0);
+-      synchronize_irq(priv->irq);
+-}
+-
+-static void rtl8192_update_msr(struct r8192_priv *priv)
+-{
+-      u8 msr;
+-
+-      msr  = read_nic_byte(priv, MSR);
+-      msr &= ~ MSR_LINK_MASK;
+-
+-      /* do not change in link_state != WLAN_LINK_ASSOCIATED.
+-       * msr must be updated if the state is ASSOCIATING.
+-       * this is intentional and make sense for ad-hoc and
+-       * master (see the create BSS/IBSS func)
+-       */
+-      if (priv->ieee80211->state == IEEE80211_LINKED){
+-
+-              if (priv->ieee80211->iw_mode == IW_MODE_INFRA)
+-                      msr |= (MSR_LINK_MANAGED<<MSR_LINK_SHIFT);
+-              else if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
+-                      msr |= (MSR_LINK_ADHOC<<MSR_LINK_SHIFT);
+-              else if (priv->ieee80211->iw_mode == IW_MODE_MASTER)
+-                      msr |= (MSR_LINK_MASTER<<MSR_LINK_SHIFT);
+-
+-      }else
+-              msr |= (MSR_LINK_NONE<<MSR_LINK_SHIFT);
+-
+-      write_nic_byte(priv, MSR, msr);
+-}
+-
+-static void rtl8192_set_chan(struct ieee80211_device *ieee80211, short ch)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-
+-      priv->chan = ch;
+-
+-      /* need to implement rf set channel here WB */
+-
+-      if (priv->rf_set_chan)
+-              priv->rf_set_chan(ieee80211, priv->chan);
+-}
+-
+-static void rtl8192_rx_enable(struct r8192_priv *priv)
+-{
+-      write_nic_dword(priv, RDQDA, priv->rx_ring_dma);
+-}
+-
+-/* the TX_DESC_BASE setting is according to the following queue index
+- *  BK_QUEUE       ===>                        0
+- *  BE_QUEUE       ===>                        1
+- *  VI_QUEUE       ===>                        2
+- *  VO_QUEUE       ===>                        3
+- *  HCCA_QUEUE     ===>                        4
+- *  TXCMD_QUEUE    ===>                        5
+- *  MGNT_QUEUE     ===>                        6
+- *  HIGH_QUEUE     ===>                        7
+- *  BEACON_QUEUE   ===>                        8
+- *  */
+-static const u32 TX_DESC_BASE[] = {BKQDA, BEQDA, VIQDA, VOQDA, HCCAQDA, CQDA, MQDA, HQDA, BQDA};
+-static void rtl8192_tx_enable(struct r8192_priv *priv)
+-{
+-      u32 i;
+-
+-      for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+-              write_nic_dword(priv, TX_DESC_BASE[i], priv->tx_ring[i].dma);
+-
+-      ieee80211_reset_queue(priv->ieee80211);
+-}
+-
+-
+-static void rtl8192_free_rx_ring(struct r8192_priv *priv)
+-{
+-      int i;
+-
+-      for (i = 0; i < priv->rxringcount; i++) {
+-              struct sk_buff *skb = priv->rx_buf[i];
+-              if (!skb)
+-                      continue;
+-
+-              pci_unmap_single(priv->pdev,
+-                               *((dma_addr_t *)skb->cb),
+-                               priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+-              kfree_skb(skb);
+-      }
+-
+-      pci_free_consistent(priv->pdev, sizeof(*priv->rx_ring) * priv->rxringcount,
+-                          priv->rx_ring, priv->rx_ring_dma);
+-      priv->rx_ring = NULL;
+-}
+-
+-static void rtl8192_free_tx_ring(struct r8192_priv *priv, unsigned int prio)
+-{
+-      struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+-
+-      while (skb_queue_len(&ring->queue)) {
+-              tx_desc_819x_pci *entry = &ring->desc[ring->idx];
+-              struct sk_buff *skb = __skb_dequeue(&ring->queue);
+-
+-              pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+-                               skb->len, PCI_DMA_TODEVICE);
+-              kfree_skb(skb);
+-              ring->idx = (ring->idx + 1) % ring->entries;
+-      }
+-
+-      pci_free_consistent(priv->pdev, sizeof(*ring->desc)*ring->entries,
+-                          ring->desc, ring->dma);
+-      ring->desc = NULL;
+-}
+-
+-void PHY_SetRtl8192eRfOff(struct r8192_priv *priv)
+-{
+-      //disable RF-Chip A/B
+-      rtl8192_setBBreg(priv, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
+-      //analog to digital off, for power save
+-      rtl8192_setBBreg(priv, rFPGA0_AnalogParameter4, 0x300, 0x0);
+-      //digital to analog off, for power save
+-      rtl8192_setBBreg(priv, rFPGA0_AnalogParameter1, 0x18, 0x0);
+-      //rx antenna off
+-      rtl8192_setBBreg(priv, rOFDM0_TRxPathEnable, 0xf, 0x0);
+-      //rx antenna off
+-      rtl8192_setBBreg(priv, rOFDM1_TRxPathEnable, 0xf, 0x0);
+-      //analog to digital part2 off, for power save
+-      rtl8192_setBBreg(priv, rFPGA0_AnalogParameter1, 0x60, 0x0);
+-      rtl8192_setBBreg(priv, rFPGA0_AnalogParameter1, 0x4, 0x0);
+-      // Analog parameter!!Change bias and Lbus control.
+-      write_nic_byte(priv, ANAPAR_FOR_8192PciE, 0x07);
+-}
+-
+-static void rtl8192_halt_adapter(struct r8192_priv *priv, bool reset)
+-{
+-      int i;
+-      u8 OpMode;
+-      u32 ulRegRead;
+-
+-      OpMode = RT_OP_MODE_NO_LINK;
+-      priv->ieee80211->SetHwRegHandler(priv->ieee80211, HW_VAR_MEDIA_STATUS, &OpMode);
+-
+-      if (!priv->ieee80211->bSupportRemoteWakeUp) {
+-              /*
+-               * disable tx/rx. In 8185 we write 0x10 (Reset bit),
+-               * but here we make reference to WMAC and wirte 0x0
+-               */
+-              write_nic_byte(priv, CMDR, 0);
+-      }
+-
+-      mdelay(20);
+-
+-      if (!reset) {
+-              mdelay(150);
+-
+-              priv->bHwRfOffAction = 2;
+-
+-              /*
+-               * Call MgntActSet_RF_State instead to
+-               * prevent RF config race condition.
+-               */
+-              if (!priv->ieee80211->bSupportRemoteWakeUp) {
+-                      PHY_SetRtl8192eRfOff(priv);
+-                      ulRegRead = read_nic_dword(priv, CPU_GEN);
+-                      ulRegRead |= CPU_GEN_SYSTEM_RESET;
+-                      write_nic_dword(priv,CPU_GEN, ulRegRead);
+-              } else {
+-                      /* for WOL */
+-                      write_nic_dword(priv, WFCRC0, 0xffffffff);
+-                      write_nic_dword(priv, WFCRC1, 0xffffffff);
+-                      write_nic_dword(priv, WFCRC2, 0xffffffff);
+-
+-                      /* Write PMR register */
+-                      write_nic_byte(priv, PMR, 0x5);
+-                      /* Disable tx, enanble rx */
+-                      write_nic_byte(priv, MacBlkCtrl, 0xa);
+-              }
+-      }
+-
+-      for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+-              skb_queue_purge(&priv->ieee80211->skb_waitQ [i]);
+-      }
+-      for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+-              skb_queue_purge(&priv->ieee80211->skb_aggQ [i]);
+-      }
+-
+-      skb_queue_purge(&priv->skb_queue);
+-}
+-
+-static void rtl8192_data_hard_stop(struct ieee80211_device *ieee80211)
+-{
+-}
+-
+-static void rtl8192_data_hard_resume(struct ieee80211_device *ieee80211)
+-{
+-}
+-
+-/*
+- * this function TX data frames when the ieee80211 stack requires this.
+- * It checks also if we need to stop the ieee tx queue, eventually do it
+- */
+-static void rtl8192_hard_data_xmit(struct sk_buff *skb,
+-                                 struct ieee80211_device *ieee80211, int rate)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      int ret;
+-      cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+-      u8 queue_index = tcb_desc->queue_index;
+-
+-      /* shall not be referred by command packet */
+-      BUG_ON(queue_index == TXCMD_QUEUE);
+-
+-      if (priv->bHwRadioOff || (!priv->up))
+-      {
+-              kfree_skb(skb);
+-              return;
+-      }
+-
+-      skb_push(skb, priv->ieee80211->tx_headroom);
+-      ret = rtl8192_tx(priv, skb);
+-      if (ret != 0) {
+-              kfree_skb(skb);
+-      }
+-
+-      if (queue_index != MGNT_QUEUE) {
+-              priv->ieee80211->stats.tx_bytes += (skb->len - priv->ieee80211->tx_headroom);
+-              priv->ieee80211->stats.tx_packets++;
+-      }
+-}
+-
+-/*
+- * This is a rough attempt to TX a frame
+- * This is called by the ieee 80211 stack to TX management frames.
+- * If the ring is full packet are dropped (for data frame the queue
+- * is stopped before this can happen).
+- */
+-static int rtl8192_hard_start_xmit(struct sk_buff *skb, struct ieee80211_device *ieee80211)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      int ret;
+-        cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+-        u8 queue_index = tcb_desc->queue_index;
+-
+-        if (queue_index != TXCMD_QUEUE) {
+-              if (priv->bHwRadioOff || (!priv->up))
+-              {
+-                      kfree_skb(skb);
+-                      return 0;
+-              }
+-        }
+-
+-      if (queue_index == TXCMD_QUEUE) {
+-              rtl819xE_tx_cmd(priv, skb);
+-              ret = 0;
+-              return ret;
+-      } else {
+-              tcb_desc->RATRIndex = 7;
+-              tcb_desc->bTxDisableRateFallBack = 1;
+-              tcb_desc->bTxUseDriverAssingedRate = 1;
+-              tcb_desc->bTxEnableFwCalcDur = 1;
+-              skb_push(skb, ieee80211->tx_headroom);
+-              ret = rtl8192_tx(priv, skb);
+-              if (ret != 0) {
+-                      kfree_skb(skb);
+-              }
+-      }
+-
+-      return ret;
+-}
+-
+-
+-static void rtl8192_tx_isr(struct r8192_priv *priv, int prio)
+-{
+-      struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+-
+-      while (skb_queue_len(&ring->queue)) {
+-              tx_desc_819x_pci *entry = &ring->desc[ring->idx];
+-              struct sk_buff *skb;
+-
+-              /*
+-               * beacon packet will only use the first descriptor defaultly,
+-               * and the OWN may not be cleared by the hardware
+-               */
+-              if (prio != BEACON_QUEUE) {
+-                      if (entry->OWN)
+-                              return;
+-                      ring->idx = (ring->idx + 1) % ring->entries;
+-              }
+-
+-              skb = __skb_dequeue(&ring->queue);
+-              pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+-                               skb->len, PCI_DMA_TODEVICE);
+-
+-              kfree_skb(skb);
+-      }
+-
+-      if (prio != BEACON_QUEUE) {
+-              /* try to deal with the pending packets  */
+-              tasklet_schedule(&priv->irq_tx_tasklet);
+-      }
+-}
+-
+-static void rtl8192_stop_beacon(struct ieee80211_device *ieee80211)
+-{
+-}
+-
+-static void rtl8192_config_rate(struct r8192_priv *priv, u16* rate_config)
+-{
+-       struct ieee80211_network *net;
+-       u8 i=0, basic_rate = 0;
+-       net = & priv->ieee80211->current_network;
+-
+-       for (i=0; i<net->rates_len; i++)
+-       {
+-               basic_rate = net->rates[i]&0x7f;
+-               switch(basic_rate)
+-               {
+-                       case MGN_1M:   *rate_config |= RRSR_1M;        break;
+-                       case MGN_2M:   *rate_config |= RRSR_2M;        break;
+-                       case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
+-                       case MGN_11M:  *rate_config |= RRSR_11M;       break;
+-                       case MGN_6M:   *rate_config |= RRSR_6M;        break;
+-                       case MGN_9M:   *rate_config |= RRSR_9M;        break;
+-                       case MGN_12M:  *rate_config |= RRSR_12M;       break;
+-                       case MGN_18M:  *rate_config |= RRSR_18M;       break;
+-                       case MGN_24M:  *rate_config |= RRSR_24M;       break;
+-                       case MGN_36M:  *rate_config |= RRSR_36M;       break;
+-                       case MGN_48M:  *rate_config |= RRSR_48M;       break;
+-                       case MGN_54M:  *rate_config |= RRSR_54M;       break;
+-               }
+-       }
+-       for (i=0; i<net->rates_ex_len; i++)
+-       {
+-               basic_rate = net->rates_ex[i]&0x7f;
+-               switch(basic_rate)
+-               {
+-                       case MGN_1M:   *rate_config |= RRSR_1M;        break;
+-                       case MGN_2M:   *rate_config |= RRSR_2M;        break;
+-                       case MGN_5_5M: *rate_config |= RRSR_5_5M;      break;
+-                       case MGN_11M:  *rate_config |= RRSR_11M;       break;
+-                       case MGN_6M:   *rate_config |= RRSR_6M;        break;
+-                       case MGN_9M:   *rate_config |= RRSR_9M;        break;
+-                       case MGN_12M:  *rate_config |= RRSR_12M;       break;
+-                       case MGN_18M:  *rate_config |= RRSR_18M;       break;
+-                       case MGN_24M:  *rate_config |= RRSR_24M;       break;
+-                       case MGN_36M:  *rate_config |= RRSR_36M;       break;
+-                       case MGN_48M:  *rate_config |= RRSR_48M;       break;
+-                       case MGN_54M:  *rate_config |= RRSR_54M;       break;
+-               }
+-       }
+-}
+-
+-
+-#define SHORT_SLOT_TIME 9
+-#define NON_SHORT_SLOT_TIME 20
+-
+-static void rtl8192_update_cap(struct r8192_priv *priv, u16 cap)
+-{
+-      u32 tmp = 0;
+-      struct ieee80211_network *net = &priv->ieee80211->current_network;
+-
+-      priv->short_preamble = cap & WLAN_CAPABILITY_SHORT_PREAMBLE;
+-      tmp = priv->basic_rate;
+-      if (priv->short_preamble)
+-              tmp |= BRSR_AckShortPmb;
+-      write_nic_dword(priv, RRSR, tmp);
+-
+-      if (net->mode & (IEEE_G|IEEE_N_24G))
+-      {
+-              u8 slot_time = 0;
+-              if ((cap & WLAN_CAPABILITY_SHORT_SLOT)&&(!priv->ieee80211->pHTInfo->bCurrentRT2RTLongSlotTime))
+-              {//short slot time
+-                      slot_time = SHORT_SLOT_TIME;
+-              }
+-              else //long slot time
+-                      slot_time = NON_SHORT_SLOT_TIME;
+-              priv->slot_time = slot_time;
+-              write_nic_byte(priv, SLOT_TIME, slot_time);
+-      }
+-
+-}
+-
+-static void rtl8192_net_update(struct r8192_priv *priv)
+-{
+-      struct ieee80211_network *net;
+-      u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
+-      u16 rate_config = 0;
+-      net = &priv->ieee80211->current_network;
+-
+-      /* update Basic rate: RR, BRSR */
+-      rtl8192_config_rate(priv, &rate_config);
+-
+-      /*
+-       * Select RRSR (in Legacy-OFDM and CCK)
+-       * For 8190, we select only 24M, 12M, 6M, 11M, 5.5M,
+-       * 2M, and 1M from the Basic rate.
+-       * We do not use other rates.
+-       */
+-      priv->basic_rate = rate_config &= 0x15f;
+-
+-      /* BSSID */
+-      write_nic_dword(priv, BSSIDR, ((u32 *)net->bssid)[0]);
+-      write_nic_word(priv, BSSIDR+4, ((u16 *)net->bssid)[2]);
+-
+-      if (priv->ieee80211->iw_mode == IW_MODE_ADHOC)
+-      {
+-              write_nic_word(priv, ATIMWND, 2);
+-              write_nic_word(priv, BCN_DMATIME, 256);
+-              write_nic_word(priv, BCN_INTERVAL, net->beacon_interval);
+-              /*
+-               * BIT15 of BCN_DRV_EARLY_INT will indicate
+-               * whether software beacon or hw beacon is applied.
+-               */
+-              write_nic_word(priv, BCN_DRV_EARLY_INT, 10);
+-              write_nic_byte(priv, BCN_ERR_THRESH, 100);
+-
+-              BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
+-              /* TODO: BcnIFS may required to be changed on ASIC */
+-              BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
+-              write_nic_word(priv, BCN_TCFG, BcnTimeCfg);
+-      }
+-}
+-
+-static void rtl819xE_tx_cmd(struct r8192_priv *priv, struct sk_buff *skb)
+-{
+-    struct rtl8192_tx_ring *ring;
+-    tx_desc_819x_pci *entry;
+-    unsigned int idx;
+-    dma_addr_t mapping;
+-    cb_desc *tcb_desc;
+-    unsigned long flags;
+-
+-    ring = &priv->tx_ring[TXCMD_QUEUE];
+-    mapping = pci_map_single(priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+-
+-    spin_lock_irqsave(&priv->irq_th_lock,flags);
+-    idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+-    entry = &ring->desc[idx];
+-
+-    tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+-    memset(entry,0,12);
+-    entry->LINIP = tcb_desc->bLastIniPkt;
+-    entry->FirstSeg = 1;//first segment
+-    entry->LastSeg = 1; //last segment
+-    if(tcb_desc->bCmdOrInit == DESC_PACKET_TYPE_INIT) {
+-        entry->CmdInit = DESC_PACKET_TYPE_INIT;
+-    } else {
+-        entry->CmdInit = DESC_PACKET_TYPE_NORMAL;
+-        entry->Offset = sizeof(TX_FWINFO_8190PCI) + 8;
+-        entry->PktSize = (u16)(tcb_desc->pkt_size + entry->Offset);
+-        entry->QueueSelect = QSLT_CMD;
+-        entry->TxFWInfoSize = 0x08;
+-        entry->RATid = (u8)DESC_PACKET_TYPE_INIT;
+-    }
+-    entry->TxBufferSize = skb->len;
+-    entry->TxBuffAddr = cpu_to_le32(mapping);
+-    entry->OWN = 1;
+-
+-    __skb_queue_tail(&ring->queue, skb);
+-    spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+-
+-    write_nic_byte(priv, TPPoll, TPPoll_CQ);
+-
+-    return;
+-}
+-
+-/*
+- * Mapping Software/Hardware descriptor queue id to "Queue Select Field"
+- * in TxFwInfo data structure
+- */
+-static u8 MapHwQueueToFirmwareQueue(u8 QueueID)
+-{
+-      u8 QueueSelect = 0;
+-
+-      switch (QueueID) {
+-      case BE_QUEUE:
+-              QueueSelect = QSLT_BE;
+-              break;
+-
+-      case BK_QUEUE:
+-              QueueSelect = QSLT_BK;
+-              break;
+-
+-      case VO_QUEUE:
+-              QueueSelect = QSLT_VO;
+-              break;
+-
+-      case VI_QUEUE:
+-              QueueSelect = QSLT_VI;
+-              break;
+-
+-      case MGNT_QUEUE:
+-              QueueSelect = QSLT_MGNT;
+-              break;
+-
+-      case BEACON_QUEUE:
+-              QueueSelect = QSLT_BEACON;
+-              break;
+-
+-      case TXCMD_QUEUE:
+-              QueueSelect = QSLT_CMD;
+-              break;
+-
+-      case HIGH_QUEUE:
+-      default:
+-              RT_TRACE(COMP_ERR, "Impossible Queue Selection: %d\n", QueueID);
+-              break;
+-      }
+-      return QueueSelect;
+-}
+-
+-static u8 MRateToHwRate8190Pci(u8 rate)
+-{
+-      u8  ret = DESC90_RATE1M;
+-
+-      switch(rate) {
+-              case MGN_1M:    ret = DESC90_RATE1M;            break;
+-              case MGN_2M:    ret = DESC90_RATE2M;            break;
+-              case MGN_5_5M:  ret = DESC90_RATE5_5M;  break;
+-              case MGN_11M:   ret = DESC90_RATE11M;   break;
+-              case MGN_6M:    ret = DESC90_RATE6M;            break;
+-              case MGN_9M:    ret = DESC90_RATE9M;            break;
+-              case MGN_12M:   ret = DESC90_RATE12M;   break;
+-              case MGN_18M:   ret = DESC90_RATE18M;   break;
+-              case MGN_24M:   ret = DESC90_RATE24M;   break;
+-              case MGN_36M:   ret = DESC90_RATE36M;   break;
+-              case MGN_48M:   ret = DESC90_RATE48M;   break;
+-              case MGN_54M:   ret = DESC90_RATE54M;   break;
+-
+-              // HT rate since here
+-              case MGN_MCS0:  ret = DESC90_RATEMCS0;  break;
+-              case MGN_MCS1:  ret = DESC90_RATEMCS1;  break;
+-              case MGN_MCS2:  ret = DESC90_RATEMCS2;  break;
+-              case MGN_MCS3:  ret = DESC90_RATEMCS3;  break;
+-              case MGN_MCS4:  ret = DESC90_RATEMCS4;  break;
+-              case MGN_MCS5:  ret = DESC90_RATEMCS5;  break;
+-              case MGN_MCS6:  ret = DESC90_RATEMCS6;  break;
+-              case MGN_MCS7:  ret = DESC90_RATEMCS7;  break;
+-              case MGN_MCS8:  ret = DESC90_RATEMCS8;  break;
+-              case MGN_MCS9:  ret = DESC90_RATEMCS9;  break;
+-              case MGN_MCS10: ret = DESC90_RATEMCS10; break;
+-              case MGN_MCS11: ret = DESC90_RATEMCS11; break;
+-              case MGN_MCS12: ret = DESC90_RATEMCS12; break;
+-              case MGN_MCS13: ret = DESC90_RATEMCS13; break;
+-              case MGN_MCS14: ret = DESC90_RATEMCS14; break;
+-              case MGN_MCS15: ret = DESC90_RATEMCS15; break;
+-              case (0x80|0x20): ret = DESC90_RATEMCS32; break;
+-
+-              default:       break;
+-      }
+-      return ret;
+-}
+-
+-
+-static u8 QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
+-{
+-      u8   tmp_Short;
+-
+-      tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
+-
+-      if(TxHT==1 && TxRate != DESC90_RATEMCS15)
+-              tmp_Short = 0;
+-
+-      return tmp_Short;
+-}
+-
+-/*
+- * The tx procedure is just as following,
+- * skb->cb will contain all the following information,
+- * priority, morefrag, rate, &dev.
+- */
+-static short rtl8192_tx(struct r8192_priv *priv, struct sk_buff* skb)
+-{
+-      struct rtl8192_tx_ring *ring;
+-      unsigned long flags;
+-      cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+-      tx_desc_819x_pci *pdesc = NULL;
+-      TX_FWINFO_8190PCI *pTxFwInfo = NULL;
+-      dma_addr_t mapping;
+-      bool multi_addr = false, broad_addr = false, uni_addr = false;
+-      u8 *pda_addr = NULL;
+-      int idx;
+-
+-      if (priv->bdisable_nic) {
+-              RT_TRACE(COMP_ERR, "Nic is disabled! Can't tx packet len=%d qidx=%d!!!\n",
+-                       skb->len, tcb_desc->queue_index);
+-              return skb->len;
+-      }
+-
+-#ifdef ENABLE_LPS
+-      priv->ieee80211->bAwakePktSent = true;
+-#endif
+-
+-      mapping = pci_map_single(priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+-
+-      /* collect the tx packets statitcs */
+-      pda_addr = ((u8 *)skb->data) + sizeof(TX_FWINFO_8190PCI);
+-      if (is_multicast_ether_addr(pda_addr))
+-              multi_addr = true;
+-      else if (is_broadcast_ether_addr(pda_addr))
+-              broad_addr = true;
+-      else
+-              uni_addr = true;
+-
+-      if (uni_addr)
+-              priv->stats.txbytesunicast += (u8)(skb->len) - sizeof(TX_FWINFO_8190PCI);
+-
+-      /* fill tx firmware */
+-      pTxFwInfo = (PTX_FWINFO_8190PCI)skb->data;
+-      memset(pTxFwInfo, 0, sizeof(TX_FWINFO_8190PCI));
+-      pTxFwInfo->TxHT = (tcb_desc->data_rate&0x80) ? 1 : 0;
+-      pTxFwInfo->TxRate = MRateToHwRate8190Pci((u8)tcb_desc->data_rate);
+-      pTxFwInfo->EnableCPUDur = tcb_desc->bTxEnableFwCalcDur;
+-      pTxFwInfo->Short = QueryIsShort(pTxFwInfo->TxHT, pTxFwInfo->TxRate, tcb_desc);
+-
+-      /* Aggregation related */
+-      if (tcb_desc->bAMPDUEnable) {
+-              pTxFwInfo->AllowAggregation = 1;
+-              pTxFwInfo->RxMF = tcb_desc->ampdu_factor;
+-              pTxFwInfo->RxAMD = tcb_desc->ampdu_density;
+-      } else {
+-              pTxFwInfo->AllowAggregation = 0;
+-              pTxFwInfo->RxMF = 0;
+-              pTxFwInfo->RxAMD = 0;
+-      }
+-
+-      /* Protection mode related */
+-      pTxFwInfo->RtsEnable = (tcb_desc->bRTSEnable) ? 1 : 0;
+-      pTxFwInfo->CtsEnable = (tcb_desc->bCTSEnable) ? 1 : 0;
+-      pTxFwInfo->RtsSTBC = (tcb_desc->bRTSSTBC) ? 1 : 0;
+-      pTxFwInfo->RtsHT = (tcb_desc->rts_rate&0x80) ? 1 : 0;
+-      pTxFwInfo->RtsRate = MRateToHwRate8190Pci((u8)tcb_desc->rts_rate);
+-      pTxFwInfo->RtsBandwidth = 0;
+-      pTxFwInfo->RtsSubcarrier = tcb_desc->RTSSC;
+-      pTxFwInfo->RtsShort = (pTxFwInfo->RtsHT == 0) ? (tcb_desc->bRTSUseShortPreamble ? 1 : 0) : (tcb_desc->bRTSUseShortGI? 1 : 0);
+-
+-      /* Set Bandwidth and sub-channel settings. */
+-      if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40) {
+-              if (tcb_desc->bPacketBW) {
+-                      pTxFwInfo->TxBandwidth = 1;
+-                      /* use duplicated mode */
+-                      pTxFwInfo->TxSubCarrier = 0;
+-              } else {
+-                      pTxFwInfo->TxBandwidth = 0;
+-                      pTxFwInfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
+-              }
+-      } else {
+-              pTxFwInfo->TxBandwidth = 0;
+-              pTxFwInfo->TxSubCarrier = 0;
+-      }
+-
+-      spin_lock_irqsave(&priv->irq_th_lock, flags);
+-      ring = &priv->tx_ring[tcb_desc->queue_index];
+-      if (tcb_desc->queue_index != BEACON_QUEUE)
+-              idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+-      else
+-              idx = 0;
+-
+-      pdesc = &ring->desc[idx];
+-      if ((pdesc->OWN == 1) && (tcb_desc->queue_index != BEACON_QUEUE)) {
+-              RT_TRACE(COMP_ERR, "No more TX desc@%d, ring->idx = %d,idx = %d,%x\n",
+-                       tcb_desc->queue_index, ring->idx, idx, skb->len);
+-              spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+-              return skb->len;
+-      }
+-
+-      /* fill tx descriptor */
+-      memset(pdesc, 0, 12);
+-
+-      /*DWORD 0*/
+-      pdesc->LINIP = 0;
+-      pdesc->CmdInit = 1;
+-      pdesc->Offset = sizeof(TX_FWINFO_8190PCI) + 8; /* We must add 8!! */
+-      pdesc->PktSize = (u16)skb->len-sizeof(TX_FWINFO_8190PCI);
+-
+-      /*DWORD 1*/
+-      pdesc->SecCAMID = 0;
+-      pdesc->RATid = tcb_desc->RATRIndex;
+-
+-      pdesc->NoEnc = 1;
+-      pdesc->SecType = 0x0;
+-      if (tcb_desc->bHwSec) {
+-              switch (priv->ieee80211->pairwise_key_type) {
+-              case KEY_TYPE_WEP40:
+-              case KEY_TYPE_WEP104:
+-                      pdesc->SecType = 0x1;
+-                      pdesc->NoEnc = 0;
+-                      break;
+-              case KEY_TYPE_TKIP:
+-                      pdesc->SecType = 0x2;
+-                      pdesc->NoEnc = 0;
+-                      break;
+-              case KEY_TYPE_CCMP:
+-                      pdesc->SecType = 0x3;
+-                      pdesc->NoEnc = 0;
+-                      break;
+-              case KEY_TYPE_NA:
+-                      pdesc->SecType = 0x0;
+-                      pdesc->NoEnc = 1;
+-                      break;
+-              }
+-      }
+-
+-      /* Set Packet ID */
+-      pdesc->PktId = 0x0;
+-
+-      pdesc->QueueSelect = MapHwQueueToFirmwareQueue(tcb_desc->queue_index);
+-      pdesc->TxFWInfoSize = sizeof(TX_FWINFO_8190PCI);
+-
+-      pdesc->DISFB = tcb_desc->bTxDisableRateFallBack;
+-      pdesc->USERATE = tcb_desc->bTxUseDriverAssingedRate;
+-
+-      pdesc->FirstSeg = 1;
+-      pdesc->LastSeg = 1;
+-      pdesc->TxBufferSize = skb->len;
+-
+-      pdesc->TxBuffAddr = cpu_to_le32(mapping);
+-      __skb_queue_tail(&ring->queue, skb);
+-      pdesc->OWN = 1;
+-      spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+-      priv->ieee80211->dev->trans_start = jiffies;
+-      write_nic_word(priv, TPPoll, 0x01<<tcb_desc->queue_index);
+-      return 0;
+-}
+-
+-static short rtl8192_alloc_rx_desc_ring(struct r8192_priv *priv)
+-{
+-    rx_desc_819x_pci *entry = NULL;
+-    int i;
+-
+-    priv->rx_ring = pci_alloc_consistent(priv->pdev,
+-            sizeof(*priv->rx_ring) * priv->rxringcount, &priv->rx_ring_dma);
+-
+-    if (!priv->rx_ring || (unsigned long)priv->rx_ring & 0xFF) {
+-        RT_TRACE(COMP_ERR,"Cannot allocate RX ring\n");
+-        return -ENOMEM;
+-    }
+-
+-    memset(priv->rx_ring, 0, sizeof(*priv->rx_ring) * priv->rxringcount);
+-    priv->rx_idx = 0;
+-
+-    for (i = 0; i < priv->rxringcount; i++) {
+-        struct sk_buff *skb = dev_alloc_skb(priv->rxbuffersize);
+-        dma_addr_t *mapping;
+-        entry = &priv->rx_ring[i];
+-        if (!skb)
+-            return 0;
+-        priv->rx_buf[i] = skb;
+-        mapping = (dma_addr_t *)skb->cb;
+-        *mapping = pci_map_single(priv->pdev, skb_tail_pointer(skb),
+-                priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+-
+-        entry->BufferAddress = cpu_to_le32(*mapping);
+-
+-        entry->Length = priv->rxbuffersize;
+-        entry->OWN = 1;
+-    }
+-
+-    entry->EOR = 1;
+-    return 0;
+-}
+-
+-static int rtl8192_alloc_tx_desc_ring(struct r8192_priv *priv,
+-        unsigned int prio, unsigned int entries)
+-{
+-    tx_desc_819x_pci *ring;
+-    dma_addr_t dma;
+-    int i;
+-
+-    ring = pci_alloc_consistent(priv->pdev, sizeof(*ring) * entries, &dma);
+-    if (!ring || (unsigned long)ring & 0xFF) {
+-        RT_TRACE(COMP_ERR, "Cannot allocate TX ring (prio = %d)\n", prio);
+-        return -ENOMEM;
+-    }
+-
+-    memset(ring, 0, sizeof(*ring)*entries);
+-    priv->tx_ring[prio].desc = ring;
+-    priv->tx_ring[prio].dma = dma;
+-    priv->tx_ring[prio].idx = 0;
+-    priv->tx_ring[prio].entries = entries;
+-    skb_queue_head_init(&priv->tx_ring[prio].queue);
+-
+-    for (i = 0; i < entries; i++)
+-        ring[i].NextDescAddress =
+-            cpu_to_le32((u32)dma + ((i + 1) % entries) * sizeof(*ring));
+-
+-    return 0;
+-}
+-
+-static short rtl8192_pci_initdescring(struct r8192_priv *priv)
+-{
+-      u32 ret;
+-      int i;
+-
+-      ret = rtl8192_alloc_rx_desc_ring(priv);
+-      if (ret)
+-              return ret;
+-
+-      /* general process for other queue */
+-      for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+-              ret = rtl8192_alloc_tx_desc_ring(priv, i, priv->txringcount);
+-              if (ret)
+-                      goto err_free_rings;
+-      }
+-
+-      return 0;
+-
+-err_free_rings:
+-      rtl8192_free_rx_ring(priv);
+-      for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+-              if (priv->tx_ring[i].desc)
+-                      rtl8192_free_tx_ring(priv, i);
+-      return 1;
+-}
+-
+-static void rtl8192_pci_resetdescring(struct r8192_priv *priv)
+-{
+-    int i;
+-
+-    /* force the rx_idx to the first one */
+-    if(priv->rx_ring) {
+-        rx_desc_819x_pci *entry = NULL;
+-        for (i = 0; i < priv->rxringcount; i++) {
+-            entry = &priv->rx_ring[i];
+-            entry->OWN = 1;
+-        }
+-        priv->rx_idx = 0;
+-    }
+-
+-    /* after reset, release previous pending packet, and force the
+-     * tx idx to the first one */
+-    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+-        if (priv->tx_ring[i].desc) {
+-            struct rtl8192_tx_ring *ring = &priv->tx_ring[i];
+-
+-            while (skb_queue_len(&ring->queue)) {
+-                tx_desc_819x_pci *entry = &ring->desc[ring->idx];
+-                struct sk_buff *skb = __skb_dequeue(&ring->queue);
+-
+-                pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+-                        skb->len, PCI_DMA_TODEVICE);
+-                kfree_skb(skb);
+-                ring->idx = (ring->idx + 1) % ring->entries;
+-            }
+-            ring->idx = 0;
+-        }
+-    }
+-}
+-
+-static void rtl8192_link_change(struct ieee80211_device *ieee)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-
+-      if (ieee->state == IEEE80211_LINKED)
+-      {
+-              rtl8192_net_update(priv);
+-              rtl8192_update_ratr_table(priv);
+-
+-              //add this as in pure N mode, wep encryption will use software way, but there is no chance to set this as wep will not set group key in wext. WB.2008.07.08
+-              if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
+-              EnableHWSecurityConfig8192(priv);
+-      }
+-      else
+-      {
+-              write_nic_byte(priv, 0x173, 0);
+-      }
+-
+-      rtl8192_update_msr(priv);
+-
+-      // 2007/10/16 MH MAC Will update TSF according to all received beacon, so we have
+-      //      // To set CBSSID bit when link with any AP or STA.
+-      if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
+-      {
+-              u32 reg = 0;
+-              reg = read_nic_dword(priv, RCR);
+-              if (priv->ieee80211->state == IEEE80211_LINKED)
+-                      priv->ReceiveConfig = reg |= RCR_CBSSID;
+-              else
+-                      priv->ReceiveConfig = reg &= ~RCR_CBSSID;
+-              write_nic_dword(priv, RCR, reg);
+-      }
+-}
+-
+-
+-static const struct ieee80211_qos_parameters def_qos_parameters = {
+-        {3,3,3,3},/* cw_min */
+-        {7,7,7,7},/* cw_max */
+-        {2,2,2,2},/* aifs */
+-        {0,0,0,0},/* flags */
+-        {0,0,0,0} /* tx_op_limit */
+-};
+-
+-static void rtl8192_update_beacon(struct work_struct * work)
+-{
+-        struct r8192_priv *priv = container_of(work, struct r8192_priv, update_beacon_wq.work);
+-      struct ieee80211_device* ieee = priv->ieee80211;
+-      struct ieee80211_network* net = &ieee->current_network;
+-
+-      if (ieee->pHTInfo->bCurrentHTSupport)
+-              HTUpdateSelfAndPeerSetting(ieee, net);
+-      ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
+-      rtl8192_update_cap(priv, net->capability);
+-}
+-
+-/*
+-* background support to run QoS activate functionality
+-*/
+-static const int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
+-static void rtl8192_qos_activate(struct work_struct * work)
+-{
+-        struct r8192_priv *priv = container_of(work, struct r8192_priv, qos_activate);
+-        struct ieee80211_qos_parameters *qos_parameters = &priv->ieee80211->current_network.qos_data.parameters;
+-        u8 mode = priv->ieee80211->current_network.mode;
+-      u8  u1bAIFS;
+-      u32 u4bAcParam;
+-        int i;
+-
+-        mutex_lock(&priv->mutex);
+-        if(priv->ieee80211->state != IEEE80211_LINKED)
+-              goto success;
+-      RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
+-      /* It better set slot time at first */
+-      /* For we just support b/g mode at present, let the slot time at 9/20 selection */
+-      /* update the ac parameter to related registers */
+-      for(i = 0; i <  QOS_QUEUE_NUM; i++) {
+-              //Mode G/A: slotTimeTimer = 9; Mode B: 20
+-              u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
+-              u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
+-                              (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
+-                              (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
+-                              ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
+-              write_nic_dword(priv, WDCAPARA_ADD[i], u4bAcParam);
+-      }
+-
+-success:
+-        mutex_unlock(&priv->mutex);
+-}
+-
+-static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
+-              int active_network,
+-              struct ieee80211_network *network)
+-{
+-      int ret = 0;
+-      u32 size = sizeof(struct ieee80211_qos_parameters);
+-
+-      if(priv->ieee80211->state !=IEEE80211_LINKED)
+-                return ret;
+-
+-        if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
+-                return ret;
+-
+-      if (network->flags & NETWORK_HAS_QOS_MASK) {
+-              if (active_network &&
+-                              (network->flags & NETWORK_HAS_QOS_PARAMETERS))
+-                      network->qos_data.active = network->qos_data.supported;
+-
+-              if ((network->qos_data.active == 1) && (active_network == 1) &&
+-                              (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
+-                              (network->qos_data.old_param_count !=
+-                               network->qos_data.param_count)) {
+-                      network->qos_data.old_param_count =
+-                              network->qos_data.param_count;
+-                      queue_work(priv->priv_wq, &priv->qos_activate);
+-                      RT_TRACE (COMP_QOS, "QoS parameters change call "
+-                                      "qos_activate\n");
+-              }
+-      } else {
+-              memcpy(&priv->ieee80211->current_network.qos_data.parameters,
+-                     &def_qos_parameters, size);
+-
+-              if ((network->qos_data.active == 1) && (active_network == 1)) {
+-                      queue_work(priv->priv_wq, &priv->qos_activate);
+-                      RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate\n");
+-              }
+-              network->qos_data.active = 0;
+-              network->qos_data.supported = 0;
+-      }
+-
+-      return 0;
+-}
+-
+-/* handle manage frame frame beacon and probe response */
+-static int rtl8192_handle_beacon(struct ieee80211_device *ieee,
+-                              struct ieee80211_beacon * beacon,
+-                              struct ieee80211_network * network)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-
+-      rtl8192_qos_handle_probe_response(priv,1,network);
+-
+-      queue_delayed_work(priv->priv_wq, &priv->update_beacon_wq, 0);
+-      return 0;
+-
+-}
+-
+-/*
+- * handling the beaconing responses. if we get different QoS setting
+- * off the network from the associated setting, adjust the QoS setting
+- */
+-static int rtl8192_qos_association_resp(struct r8192_priv *priv,
+-                                    struct ieee80211_network *network)
+-{
+-      int ret = 0;
+-      unsigned long flags;
+-      u32 size = sizeof(struct ieee80211_qos_parameters);
+-      int set_qos_param = 0;
+-
+-      if ((priv == NULL) || (network == NULL))
+-              return ret;
+-
+-      if (priv->ieee80211->state != IEEE80211_LINKED)
+-              return ret;
+-
+-      if ((priv->ieee80211->iw_mode != IW_MODE_INFRA))
+-              return ret;
+-
+-      spin_lock_irqsave(&priv->ieee80211->lock, flags);
+-      if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
+-              memcpy(&priv->ieee80211->current_network.qos_data.parameters,
+-                       &network->qos_data.parameters,
+-                      sizeof(struct ieee80211_qos_parameters));
+-              priv->ieee80211->current_network.qos_data.active = 1;
+-              set_qos_param = 1;
+-              /* update qos parameter for current network */
+-              priv->ieee80211->current_network.qos_data.old_param_count =
+-                      priv->ieee80211->current_network.qos_data.param_count;
+-              priv->ieee80211->current_network.qos_data.param_count =
+-                      network->qos_data.param_count;
+-
+-      } else {
+-              memcpy(&priv->ieee80211->current_network.qos_data.parameters,
+-                     &def_qos_parameters, size);
+-              priv->ieee80211->current_network.qos_data.active = 0;
+-              priv->ieee80211->current_network.qos_data.supported = 0;
+-              set_qos_param = 1;
+-      }
+-
+-      spin_unlock_irqrestore(&priv->ieee80211->lock, flags);
+-
+-      RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n", __FUNCTION__,
+-              network->flags, priv->ieee80211->current_network.qos_data.active);
+-      if (set_qos_param == 1)
+-              queue_work(priv->priv_wq, &priv->qos_activate);
+-
+-      return ret;
+-}
+-
+-
+-static int rtl8192_handle_assoc_response(struct ieee80211_device *ieee,
+-                                     struct ieee80211_assoc_response_frame *resp,
+-                                     struct ieee80211_network *network)
+-{
+-        struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-        rtl8192_qos_association_resp(priv, network);
+-        return 0;
+-}
+-
+-
+-/* updateRATRTabel for MCS only. Basic rate is not implemented. */
+-static void rtl8192_update_ratr_table(struct r8192_priv* priv)
+-{
+-      struct ieee80211_device* ieee = priv->ieee80211;
+-      u8* pMcsRate = ieee->dot11HTOperationalRateSet;
+-      u32 ratr_value = 0;
+-      u8 rate_index = 0;
+-
+-      rtl8192_config_rate(priv, (u16*)(&ratr_value));
+-      ratr_value |= (*(u16*)(pMcsRate)) << 12;
+-
+-      switch (ieee->mode)
+-      {
+-              case IEEE_A:
+-                      ratr_value &= 0x00000FF0;
+-                      break;
+-              case IEEE_B:
+-                      ratr_value &= 0x0000000F;
+-                      break;
+-              case IEEE_G:
+-                      ratr_value &= 0x00000FF7;
+-                      break;
+-              case IEEE_N_24G:
+-              case IEEE_N_5G:
+-                      if (ieee->pHTInfo->PeerMimoPs == 0) //MIMO_PS_STATIC
+-                              ratr_value &= 0x0007F007;
+-                      else{
+-                              if (priv->rf_type == RF_1T2R)
+-                                      ratr_value &= 0x000FF007;
+-                              else
+-                                      ratr_value &= 0x0F81F007;
+-                      }
+-                      break;
+-              default:
+-                      break;
+-      }
+-      ratr_value &= 0x0FFFFFFF;
+-      if(ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
+-              ratr_value |= 0x80000000;
+-      }else if(!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
+-              ratr_value |= 0x80000000;
+-      }
+-      write_nic_dword(priv, RATR0+rate_index*4, ratr_value);
+-      write_nic_byte(priv, UFWP, 1);
+-}
+-
+-static bool GetNmodeSupportBySecCfg8190Pci(struct ieee80211_device *ieee)
+-{
+-      return !(ieee->rtllib_ap_sec_type &&
+-               (ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_WEP|SEC_ALG_TKIP)));
+-}
+-
+-static void rtl8192_refresh_supportrate(struct r8192_priv* priv)
+-{
+-      struct ieee80211_device* ieee = priv->ieee80211;
+-      //we donot consider set support rate for ABG mode, only HT MCS rate is set here.
+-      if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G)
+-      {
+-              memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
+-      }
+-      else
+-              memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
+-}
+-
+-static u8 rtl8192_getSupportedWireleeMode(void)
+-{
+-      return (WIRELESS_MODE_N_24G|WIRELESS_MODE_G|WIRELESS_MODE_B);
+-}
+-
+-static void rtl8192_SetWirelessMode(struct ieee80211_device *ieee, u8 wireless_mode)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-      u8 bSupportMode = rtl8192_getSupportedWireleeMode();
+-
+-      if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode&bSupportMode)==0))
+-      {
+-              if(bSupportMode & WIRELESS_MODE_N_24G)
+-              {
+-                      wireless_mode = WIRELESS_MODE_N_24G;
+-              }
+-              else if(bSupportMode & WIRELESS_MODE_N_5G)
+-              {
+-                      wireless_mode = WIRELESS_MODE_N_5G;
+-              }
+-              else if((bSupportMode & WIRELESS_MODE_A))
+-              {
+-                      wireless_mode = WIRELESS_MODE_A;
+-              }
+-              else if((bSupportMode & WIRELESS_MODE_G))
+-              {
+-                      wireless_mode = WIRELESS_MODE_G;
+-              }
+-              else if((bSupportMode & WIRELESS_MODE_B))
+-              {
+-                      wireless_mode = WIRELESS_MODE_B;
+-              }
+-              else{
+-                      RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported, SupportedWirelessMode(%x)!!!\n", __FUNCTION__,bSupportMode);
+-                      wireless_mode = WIRELESS_MODE_B;
+-              }
+-      }
+-      priv->ieee80211->mode = wireless_mode;
+-
+-      if ((wireless_mode == WIRELESS_MODE_N_24G) ||  (wireless_mode == WIRELESS_MODE_N_5G))
+-              priv->ieee80211->pHTInfo->bEnableHT = 1;
+-      else
+-              priv->ieee80211->pHTInfo->bEnableHT = 0;
+-      RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
+-      rtl8192_refresh_supportrate(priv);
+-}
+-
+-static bool GetHalfNmodeSupportByAPs819xPci(struct ieee80211_device* ieee)
+-{
+-      return ieee->bHalfWirelessN24GMode;
+-}
+-
+-static short rtl8192_is_tx_queue_empty(struct ieee80211_device *ieee)
+-{
+-      int i=0;
+-      struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-
+-      for (i=0; i<=MGNT_QUEUE; i++)
+-      {
+-              if ((i== TXCMD_QUEUE) || (i == HCCA_QUEUE) )
+-                      continue;
+-              if (skb_queue_len(&(&priv->tx_ring[i])->queue) > 0){
+-                      printk("===>tx queue is not empty:%d, %d\n", i, skb_queue_len(&(&priv->tx_ring[i])->queue));
+-                      return 0;
+-              }
+-      }
+-      return 1;
+-}
+-
+-static void rtl8192_hw_sleep_down(struct r8192_priv *priv)
+-{
+-      MgntActSet_RF_State(priv, eRfSleep, RF_CHANGE_BY_PS);
+-}
+-
+-static void rtl8192_hw_wakeup(struct ieee80211_device *ieee)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-      MgntActSet_RF_State(priv, eRfOn, RF_CHANGE_BY_PS);
+-}
+-
+-static void rtl8192_hw_wakeup_wq (struct work_struct *work)
+-{
+-      struct delayed_work *dwork = container_of(work,struct delayed_work,work);
+-      struct ieee80211_device *ieee = container_of(dwork,struct ieee80211_device,hw_wakeup_wq);
+-
+-      rtl8192_hw_wakeup(ieee);
+-}
+-
+-#define MIN_SLEEP_TIME 50
+-#define MAX_SLEEP_TIME 10000
+-static void rtl8192_hw_to_sleep(struct ieee80211_device *ieee, u32 th, u32 tl)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee->dev);
+-      u32 tmp;
+-      u32 rb = jiffies;
+-
+-      // Writing HW register with 0 equals to disable
+-      // the timer, that is not really what we want
+-      //
+-      tl -= MSECS(8+16+7);
+-
+-      // If the interval in witch we are requested to sleep is too
+-      // short then give up and remain awake
+-      // when we sleep after send null frame, the timer will be too short to sleep.
+-      //
+-      if(((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
+-                      ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
+-              printk("too short to sleep::%x, %x, %lx\n",tl, rb,  MSECS(MIN_SLEEP_TIME));
+-              return;
+-      }
+-
+-      if(((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
+-                      ((tl < rb) && (tl>MSECS(69)) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))||
+-                      ((tl<rb)&&(tl<MSECS(69))&&((tl+0xffffffff-rb)>MSECS(MAX_SLEEP_TIME)))) {
+-              printk("========>too long to sleep:%x, %x, %lx\n", tl, rb,  MSECS(MAX_SLEEP_TIME));
+-              return;
+-      }
+-
+-      tmp = (tl>rb)?(tl-rb):(rb-tl);
+-      queue_delayed_work(priv->ieee80211->wq,
+-                         &priv->ieee80211->hw_wakeup_wq,tmp);
+-
+-        rtl8192_hw_sleep_down(priv);
+-}
+-
+-static void rtl8192_init_priv_variable(struct r8192_priv *priv)
+-{
+-      u8 i;
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-
+-      // Default Halt the NIC if RF is OFF.
+-      pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_HALT_NIC;
+-      pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_CLK_REQ;
+-      pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_ASPM;
+-      pPSC->RegRfPsLevel |= RT_RF_LPS_LEVEL_ASPM;
+-      pPSC->bLeisurePs = true;
+-      priv->ieee80211->RegMaxLPSAwakeIntvl = 5;
+-      priv->bHwRadioOff = false;
+-
+-      priv->being_init_adapter = false;
+-      priv->txringcount = 64;//32;
+-      priv->rxbuffersize = 9100;//2048;//1024;
+-      priv->rxringcount = MAX_RX_COUNT;//64;
+-      priv->chan = 1; //set to channel 1
+-      priv->RegWirelessMode = WIRELESS_MODE_AUTO;
+-      priv->RegChannelPlan = 0xf;
+-      priv->ieee80211->mode = WIRELESS_MODE_AUTO; //SET AUTO
+-      priv->ieee80211->iw_mode = IW_MODE_INFRA;
+-      priv->ieee80211->ieee_up=0;
+-      priv->retry_rts = DEFAULT_RETRY_RTS;
+-      priv->retry_data = DEFAULT_RETRY_DATA;
+-      priv->ieee80211->rts = DEFAULT_RTS_THRESHOLD;
+-      priv->ieee80211->rate = 110; //11 mbps
+-      priv->ieee80211->short_slot = 1;
+-      priv->promisc = (priv->ieee80211->dev->flags & IFF_PROMISC) ? 1:0;
+-      priv->bcck_in_ch14 = false;
+-      priv->CCKPresentAttentuation = 0;
+-      priv->rfa_txpowertrackingindex = 0;
+-      priv->rfc_txpowertrackingindex = 0;
+-      priv->CckPwEnl = 6;
+-      //added by amy for silent reset
+-      priv->ResetProgress = RESET_TYPE_NORESET;
+-      priv->bForcedSilentReset = 0;
+-      priv->bDisableNormalResetCheck = false;
+-      priv->force_reset = false;
+-      //added by amy for power save
+-      priv->RfOffReason = 0;
+-      priv->bHwRfOffAction = 0;
+-      priv->PowerSaveControl.bInactivePs = true;
+-      priv->PowerSaveControl.bIPSModeBackup = false;
+-
+-      priv->ieee80211->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
+-      priv->ieee80211->iw_mode = IW_MODE_INFRA;
+-      priv->ieee80211->softmac_features  = IEEE_SOFTMAC_SCAN |
+-              IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
+-              IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE;/* |
+-              IEEE_SOFTMAC_BEACONS;*///added by amy 080604 //|  //IEEE_SOFTMAC_SINGLE_QUEUE;
+-
+-      priv->ieee80211->active_scan = 1;
+-      priv->ieee80211->modulation = IEEE80211_CCK_MODULATION | IEEE80211_OFDM_MODULATION;
+-      priv->ieee80211->host_encrypt = 1;
+-      priv->ieee80211->host_decrypt = 1;
+-      priv->ieee80211->start_send_beacons = rtl8192_start_beacon;
+-      priv->ieee80211->stop_send_beacons = rtl8192_stop_beacon;
+-      priv->ieee80211->softmac_hard_start_xmit = rtl8192_hard_start_xmit;
+-      priv->ieee80211->set_chan = rtl8192_set_chan;
+-      priv->ieee80211->link_change = rtl8192_link_change;
+-      priv->ieee80211->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
+-      priv->ieee80211->data_hard_stop = rtl8192_data_hard_stop;
+-      priv->ieee80211->data_hard_resume = rtl8192_data_hard_resume;
+-      priv->ieee80211->init_wmmparam_flag = 0;
+-      priv->ieee80211->fts = DEFAULT_FRAG_THRESHOLD;
+-      priv->ieee80211->check_nic_enough_desc = check_nic_enough_desc;
+-      priv->ieee80211->tx_headroom = sizeof(TX_FWINFO_8190PCI);
+-      priv->ieee80211->qos_support = 1;
+-      priv->ieee80211->SetBWModeHandler = rtl8192_SetBWMode;
+-      priv->ieee80211->handle_assoc_response = rtl8192_handle_assoc_response;
+-      priv->ieee80211->handle_beacon = rtl8192_handle_beacon;
+-
+-      priv->ieee80211->sta_wake_up = rtl8192_hw_wakeup;
+-      priv->ieee80211->enter_sleep_state = rtl8192_hw_to_sleep;
+-      priv->ieee80211->ps_is_queue_empty = rtl8192_is_tx_queue_empty;
+-      priv->ieee80211->GetNmodeSupportBySecCfg = GetNmodeSupportBySecCfg8190Pci;
+-      priv->ieee80211->SetWirelessMode = rtl8192_SetWirelessMode;
+-      priv->ieee80211->GetHalfNmodeSupportByAPsHandler = GetHalfNmodeSupportByAPs819xPci;
+-
+-      priv->ieee80211->InitialGainHandler = InitialGain819xPci;
+-
+-#ifdef ENABLE_IPS
+-      priv->ieee80211->ieee80211_ips_leave_wq = ieee80211_ips_leave_wq;
+-      priv->ieee80211->ieee80211_ips_leave = ieee80211_ips_leave;
+-#endif
+-#ifdef ENABLE_LPS
+-        priv->ieee80211->LeisurePSLeave            = LeisurePSLeave;
+-#endif
+-
+-      priv->ieee80211->SetHwRegHandler = rtl8192e_SetHwReg;
+-      priv->ieee80211->rtllib_ap_sec_type = rtl8192e_ap_sec_type;
+-
+-      priv->ShortRetryLimit = 0x30;
+-      priv->LongRetryLimit = 0x30;
+-
+-      priv->ReceiveConfig = RCR_ADD3  |
+-              RCR_AMF | RCR_ADF |             //accept management/data
+-              RCR_AICV |                      //accept control frame for SW AP needs PS-poll, 2005.07.07, by rcnjko.
+-              RCR_AB | RCR_AM | RCR_APM |     //accept BC/MC/UC
+-              RCR_AAP | ((u32)7<<RCR_MXDMA_OFFSET) |
+-              ((u32)7 << RCR_FIFO_OFFSET) | RCR_ONLYERLPKT;
+-
+-      priv->pFirmware = vzalloc(sizeof(rt_firmware));
+-
+-      /* rx related queue */
+-      skb_queue_head_init(&priv->skb_queue);
+-
+-      /* Tx related queue */
+-      for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+-              skb_queue_head_init(&priv->ieee80211->skb_waitQ [i]);
+-      }
+-      for(i = 0; i < MAX_QUEUE_SIZE; i++) {
+-              skb_queue_head_init(&priv->ieee80211->skb_aggQ [i]);
+-      }
+-      priv->rf_set_chan = rtl8192_phy_SwChnl;
+-}
+-
+-static void rtl8192_init_priv_lock(struct r8192_priv* priv)
+-{
+-      spin_lock_init(&priv->irq_th_lock);
+-      spin_lock_init(&priv->rf_ps_lock);
+-      sema_init(&priv->wx_sem,1);
+-      sema_init(&priv->rf_sem,1);
+-      mutex_init(&priv->mutex);
+-}
+-
+-/* init tasklet and wait_queue here */
+-#define DRV_NAME "wlan0"
+-static void rtl8192_init_priv_task(struct r8192_priv *priv)
+-{
+-      priv->priv_wq = create_workqueue(DRV_NAME);
+-
+-#ifdef ENABLE_IPS
+-      INIT_WORK(&priv->ieee80211->ips_leave_wq, IPSLeave_wq);
+-#endif
+-
+-      INIT_WORK(&priv->reset_wq,  rtl8192_restart);
+-      INIT_DELAYED_WORK(&priv->watch_dog_wq, rtl819x_watchdog_wqcallback);
+-      INIT_DELAYED_WORK(&priv->txpower_tracking_wq,  dm_txpower_trackingcallback);
+-      INIT_DELAYED_WORK(&priv->rfpath_check_wq,  dm_rf_pathcheck_workitemcallback);
+-      INIT_DELAYED_WORK(&priv->update_beacon_wq, rtl8192_update_beacon);
+-      INIT_WORK(&priv->qos_activate, rtl8192_qos_activate);
+-      INIT_DELAYED_WORK(&priv->ieee80211->hw_wakeup_wq, rtl8192_hw_wakeup_wq);
+-
+-      tasklet_init(&priv->irq_rx_tasklet, rtl8192_irq_rx_tasklet,
+-                   (unsigned long) priv);
+-      tasklet_init(&priv->irq_tx_tasklet, rtl8192_irq_tx_tasklet,
+-                   (unsigned long) priv);
+-        tasklet_init(&priv->irq_prepare_beacon_tasklet, rtl8192_prepare_beacon,
+-                   (unsigned long) priv);
+-}
+-
+-static void rtl8192_get_eeprom_size(struct r8192_priv *priv)
+-{
+-      u16 curCR = 0;
+-      RT_TRACE(COMP_INIT, "===========>%s()\n", __FUNCTION__);
+-      curCR = read_nic_dword(priv, EPROM_CMD);
+-      RT_TRACE(COMP_INIT, "read from Reg Cmd9346CR(%x):%x\n", EPROM_CMD, curCR);
+-      //whether need I consider BIT5?
+-      priv->epromtype = (curCR & EPROM_CMD_9356SEL) ? EPROM_93c56 : EPROM_93c46;
+-      RT_TRACE(COMP_INIT, "<===========%s(), epromtype:%d\n", __FUNCTION__, priv->epromtype);
+-}
+-
+-/*
+- * Adapter->EEPROMAddressSize should be set before this function call.
+- *  EEPROM address size can be got through GetEEPROMSize8185()
+- */
+-static void rtl8192_read_eeprom_info(struct r8192_priv *priv)
+-{
+-      struct net_device *dev = priv->ieee80211->dev;
+-      u8                      tempval;
+-      u8                      ICVer8192, ICVer8256;
+-      u16                     i,usValue, IC_Version;
+-      u16                     EEPROMId;
+-      u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x01};
+-      RT_TRACE(COMP_INIT, "====> rtl8192_read_eeprom_info\n");
+-
+-
+-      // TODO: I don't know if we need to apply EF function to EEPROM read function
+-
+-      //2 Read EEPROM ID to make sure autoload is success
+-      EEPROMId = eprom_read(priv, 0);
+-      if( EEPROMId != RTL8190_EEPROM_ID )
+-      {
+-              RT_TRACE(COMP_ERR, "EEPROM ID is invalid:%x, %x\n", EEPROMId, RTL8190_EEPROM_ID);
+-              priv->AutoloadFailFlag=true;
+-      }
+-      else
+-      {
+-              priv->AutoloadFailFlag=false;
+-      }
+-
+-      //
+-      // Assign Chip Version ID
+-      //
+-      // Read IC Version && Channel Plan
+-      if(!priv->AutoloadFailFlag)
+-      {
+-              // VID, PID
+-              priv->eeprom_vid = eprom_read(priv, (EEPROM_VID >> 1));
+-              priv->eeprom_did = eprom_read(priv, (EEPROM_DID >> 1));
+-
+-              usValue = eprom_read(priv, (u16)(EEPROM_Customer_ID>>1)) >> 8 ;
+-              priv->eeprom_CustomerID = (u8)( usValue & 0xff);
+-              usValue = eprom_read(priv, (EEPROM_ICVersion_ChannelPlan>>1));
+-              priv->eeprom_ChannelPlan = usValue&0xff;
+-              IC_Version = ((usValue&0xff00)>>8);
+-
+-              ICVer8192 = (IC_Version&0xf);           //bit0~3; 1:A cut, 2:B cut, 3:C cut...
+-              ICVer8256 = ((IC_Version&0xf0)>>4);//bit4~6, bit7 reserved for other RF chip; 1:A cut, 2:B cut, 3:C cut...
+-              RT_TRACE(COMP_INIT, "ICVer8192 = 0x%x\n", ICVer8192);
+-              RT_TRACE(COMP_INIT, "ICVer8256 = 0x%x\n", ICVer8256);
+-              if(ICVer8192 == 0x2)    //B-cut
+-              {
+-                      if(ICVer8256 == 0x5) //E-cut
+-                              priv->card_8192_version= VERSION_8190_BE;
+-              }
+-
+-              switch(priv->card_8192_version)
+-              {
+-                      case VERSION_8190_BD:
+-                      case VERSION_8190_BE:
+-                              break;
+-                      default:
+-                              priv->card_8192_version = VERSION_8190_BD;
+-                              break;
+-              }
+-              RT_TRACE(COMP_INIT, "\nIC Version = 0x%x\n", priv->card_8192_version);
+-      }
+-      else
+-      {
+-              priv->card_8192_version = VERSION_8190_BD;
+-              priv->eeprom_vid = 0;
+-              priv->eeprom_did = 0;
+-              priv->eeprom_CustomerID = 0;
+-              priv->eeprom_ChannelPlan = 0;
+-              RT_TRACE(COMP_INIT, "IC Version = 0x%x\n", 0xff);
+-      }
+-
+-      RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
+-      RT_TRACE(COMP_INIT, "EEPROM DID = 0x%4x\n", priv->eeprom_did);
+-      RT_TRACE(COMP_INIT,"EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
+-
+-      //2 Read Permanent MAC address
+-      if(!priv->AutoloadFailFlag)
+-      {
+-              for(i = 0; i < 6; i += 2)
+-              {
+-                      usValue = eprom_read(priv, (u16) ((EEPROM_NODE_ADDRESS_BYTE_0+i)>>1));
+-                      *(u16*)(&dev->dev_addr[i]) = usValue;
+-              }
+-      } else {
+-              // when auto load failed,  the last address byte set to be a random one.
+-              // added by david woo.2007/11/7
+-              memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
+-      }
+-
+-      RT_TRACE(COMP_INIT, "Permanent Address = %pM\n", dev->dev_addr);
+-
+-              //2 TX Power Check EEPROM Fail or not
+-      if(priv->card_8192_version > VERSION_8190_BD) {
+-              priv->bTXPowerDataReadFromEEPORM = true;
+-      } else {
+-              priv->bTXPowerDataReadFromEEPORM = false;
+-      }
+-
+-      // 2007/11/15 MH 8190PCI Default=2T4R, 8192PCIE default=1T2R
+-      priv->rf_type = RTL819X_DEFAULT_RF_TYPE;
+-
+-      if(priv->card_8192_version > VERSION_8190_BD)
+-      {
+-              // Read RF-indication and Tx Power gain index diff of legacy to HT OFDM rate.
+-              if(!priv->AutoloadFailFlag)
+-              {
+-                      tempval = (eprom_read(priv, (EEPROM_RFInd_PowerDiff>>1))) & 0xff;
+-                      priv->EEPROMLegacyHTTxPowerDiff = tempval & 0xf;        // bit[3:0]
+-
+-                      if (tempval&0x80)       //RF-indication, bit[7]
+-                              priv->rf_type = RF_1T2R;
+-                      else
+-                              priv->rf_type = RF_2T4R;
+-              }
+-              else
+-              {
+-                      priv->EEPROMLegacyHTTxPowerDiff = EEPROM_Default_LegacyHTTxPowerDiff;
+-              }
+-              RT_TRACE(COMP_INIT, "EEPROMLegacyHTTxPowerDiff = %d\n",
+-                      priv->EEPROMLegacyHTTxPowerDiff);
+-
+-              // Read ThermalMeter from EEPROM
+-              if(!priv->AutoloadFailFlag)
+-              {
+-                      priv->EEPROMThermalMeter = (u8)(((eprom_read(priv, (EEPROM_ThermalMeter>>1))) & 0xff00)>>8);
+-              }
+-              else
+-              {
+-                      priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
+-              }
+-              RT_TRACE(COMP_INIT, "ThermalMeter = %d\n", priv->EEPROMThermalMeter);
+-              //vivi, for tx power track
+-              priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
+-
+-              if(priv->epromtype == EPROM_93c46)
+-              {
+-              // Read antenna tx power offset of B/C/D to A and CrystalCap from EEPROM
+-              if(!priv->AutoloadFailFlag)
+-              {
+-                              usValue = eprom_read(priv, (EEPROM_TxPwDiff_CrystalCap>>1));
+-                              priv->EEPROMAntPwDiff = (usValue&0x0fff);
+-                              priv->EEPROMCrystalCap = (u8)((usValue&0xf000)>>12);
+-              }
+-              else
+-              {
+-                              priv->EEPROMAntPwDiff = EEPROM_Default_AntTxPowerDiff;
+-                              priv->EEPROMCrystalCap = EEPROM_Default_TxPwDiff_CrystalCap;
+-              }
+-                      RT_TRACE(COMP_INIT, "EEPROMAntPwDiff = %d\n", priv->EEPROMAntPwDiff);
+-                      RT_TRACE(COMP_INIT, "EEPROMCrystalCap = %d\n", priv->EEPROMCrystalCap);
+-
+-              //
+-              // Get per-channel Tx Power Level
+-              //
+-              for(i=0; i<14; i+=2)
+-              {
+-                      if(!priv->AutoloadFailFlag)
+-                      {
+-                              usValue = eprom_read(priv, (u16) ((EEPROM_TxPwIndex_CCK+i)>>1) );
+-                      }
+-                      else
+-                      {
+-                              usValue = EEPROM_Default_TxPower;
+-                      }
+-                      *((u16*)(&priv->EEPROMTxPowerLevelCCK[i])) = usValue;
+-                      RT_TRACE(COMP_INIT,"CCK Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK[i]);
+-                      RT_TRACE(COMP_INIT, "CCK Tx Power Level, Index %d = 0x%02x\n", i+1, priv->EEPROMTxPowerLevelCCK[i+1]);
+-              }
+-              for(i=0; i<14; i+=2)
+-              {
+-                      if(!priv->AutoloadFailFlag)
+-                      {
+-                              usValue = eprom_read(priv, (u16) ((EEPROM_TxPwIndex_OFDM_24G+i)>>1) );
+-                      }
+-                      else
+-                      {
+-                              usValue = EEPROM_Default_TxPower;
+-                      }
+-                      *((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[i])) = usValue;
+-                      RT_TRACE(COMP_INIT, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelOFDM24G[i]);
+-                      RT_TRACE(COMP_INIT, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i+1, priv->EEPROMTxPowerLevelOFDM24G[i+1]);
+-              }
+-              }
+-
+-              //
+-              // Update HAL variables.
+-              //
+-              if(priv->epromtype == EPROM_93c46)
+-              {
+-                      for(i=0; i<14; i++)
+-                      {
+-                              priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK[i];
+-                              priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[i];
+-                      }
+-                      priv->LegacyHTTxPowerDiff = priv->EEPROMLegacyHTTxPowerDiff;
+-              // Antenna B gain offset to antenna A, bit0~3
+-                      priv->AntennaTxPwDiff[0] = (priv->EEPROMAntPwDiff & 0xf);
+-              // Antenna C gain offset to antenna A, bit4~7
+-                      priv->AntennaTxPwDiff[1] = ((priv->EEPROMAntPwDiff & 0xf0)>>4);
+-              // Antenna D gain offset to antenna A, bit8~11
+-                      priv->AntennaTxPwDiff[2] = ((priv->EEPROMAntPwDiff & 0xf00)>>8);
+-              // CrystalCap, bit12~15
+-                      priv->CrystalCap = priv->EEPROMCrystalCap;
+-              // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
+-                      priv->ThermalMeter[0] = (priv->EEPROMThermalMeter & 0xf);
+-                      priv->ThermalMeter[1] = ((priv->EEPROMThermalMeter & 0xf0)>>4);
+-              }
+-              else if(priv->epromtype == EPROM_93c56)
+-              {
+-                      for(i=0; i<3; i++)      // channel 1~3 use the same Tx Power Level.
+-                      {
+-                              priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[0];
+-                              priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[0];
+-                              priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[0];
+-                              priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[0];
+-                      }
+-                      for(i=3; i<9; i++)      // channel 4~9 use the same Tx Power Level
+-                      {
+-                              priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[1];
+-                              priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[1];
+-                              priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[1];
+-                              priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[1];
+-                      }
+-                      for(i=9; i<14; i++)     // channel 10~14 use the same Tx Power Level
+-                      {
+-                              priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[2];
+-                              priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[2];
+-                              priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[2];
+-                              priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[2];
+-                      }
+-                      for(i=0; i<14; i++)
+-                              RT_TRACE(COMP_INIT, "priv->TxPowerLevelCCK_A[%d] = 0x%x\n", i, priv->TxPowerLevelCCK_A[i]);
+-                      for(i=0; i<14; i++)
+-                              RT_TRACE(COMP_INIT,"priv->TxPowerLevelOFDM24G_A[%d] = 0x%x\n", i, priv->TxPowerLevelOFDM24G_A[i]);
+-                      for(i=0; i<14; i++)
+-                              RT_TRACE(COMP_INIT, "priv->TxPowerLevelCCK_C[%d] = 0x%x\n", i, priv->TxPowerLevelCCK_C[i]);
+-                      for(i=0; i<14; i++)
+-                              RT_TRACE(COMP_INIT, "priv->TxPowerLevelOFDM24G_C[%d] = 0x%x\n", i, priv->TxPowerLevelOFDM24G_C[i]);
+-                      priv->LegacyHTTxPowerDiff = priv->EEPROMLegacyHTTxPowerDiff;
+-                      priv->AntennaTxPwDiff[0] = 0;
+-                      priv->AntennaTxPwDiff[1] = 0;
+-                      priv->AntennaTxPwDiff[2] = 0;
+-                      priv->CrystalCap = priv->EEPROMCrystalCap;
+-                      // ThermalMeter, bit0~3 for RFIC1, bit4~7 for RFIC2
+-                      priv->ThermalMeter[0] = (priv->EEPROMThermalMeter & 0xf);
+-                      priv->ThermalMeter[1] = ((priv->EEPROMThermalMeter & 0xf0)>>4);
+-              }
+-      }
+-
+-      if(priv->rf_type == RF_1T2R)
+-      {
+-              RT_TRACE(COMP_INIT, "1T2R config\n");
+-      }
+-      else if (priv->rf_type == RF_2T4R)
+-      {
+-              RT_TRACE(COMP_INIT, "2T4R config\n");
+-      }
+-
+-      // 2008/01/16 MH We can only know RF type in the function. So we have to init
+-      // DIG RATR table again.
+-      init_rate_adaptive(priv);
+-
+-      //1 Make a copy for following variables and we can change them if we want
+-
+-      if(priv->RegChannelPlan == 0xf)
+-      {
+-              priv->ChannelPlan = priv->eeprom_ChannelPlan;
+-      }
+-      else
+-      {
+-              priv->ChannelPlan = priv->RegChannelPlan;
+-      }
+-
+-      //
+-      //  Used PID and DID to Set CustomerID
+-      //
+-      if( priv->eeprom_vid == 0x1186 &&  priv->eeprom_did == 0x3304 )
+-      {
+-              priv->CustomerID =  RT_CID_DLINK;
+-      }
+-
+-      switch(priv->eeprom_CustomerID)
+-      {
+-              case EEPROM_CID_DEFAULT:
+-                      priv->CustomerID = RT_CID_DEFAULT;
+-                      break;
+-              case EEPROM_CID_CAMEO:
+-                      priv->CustomerID = RT_CID_819x_CAMEO;
+-                      break;
+-              case  EEPROM_CID_RUNTOP:
+-                      priv->CustomerID = RT_CID_819x_RUNTOP;
+-                      break;
+-              case EEPROM_CID_NetCore:
+-                      priv->CustomerID = RT_CID_819x_Netcore;
+-                      break;
+-              case EEPROM_CID_TOSHIBA:        // Merge by Jacken, 2008/01/31
+-                      priv->CustomerID = RT_CID_TOSHIBA;
+-                      if(priv->eeprom_ChannelPlan&0x80)
+-                              priv->ChannelPlan = priv->eeprom_ChannelPlan&0x7f;
+-                      else
+-                              priv->ChannelPlan = 0x0;
+-                      RT_TRACE(COMP_INIT, "Toshiba ChannelPlan = 0x%x\n",
+-                              priv->ChannelPlan);
+-                      break;
+-              case EEPROM_CID_Nettronix:
+-                      priv->CustomerID = RT_CID_Nettronix;
+-                      break;
+-              case EEPROM_CID_Pronet:
+-                      priv->CustomerID = RT_CID_PRONET;
+-                      break;
+-              case EEPROM_CID_DLINK:
+-                      priv->CustomerID = RT_CID_DLINK;
+-                      break;
+-
+-              case EEPROM_CID_WHQL:
+-                      break;
+-              default:
+-                      // value from RegCustomerID
+-                      break;
+-      }
+-
+-      //Avoid the channel plan array overflow, by Bruce, 2007-08-27.
+-      if(priv->ChannelPlan > CHANNEL_PLAN_LEN - 1)
+-              priv->ChannelPlan = 0; //FCC
+-
+-      if( priv->eeprom_vid == 0x1186 &&  priv->eeprom_did == 0x3304)
+-              priv->ieee80211->bSupportRemoteWakeUp = true;
+-      else
+-              priv->ieee80211->bSupportRemoteWakeUp = false;
+-
+-
+-      RT_TRACE(COMP_INIT, "RegChannelPlan(%d)\n", priv->RegChannelPlan);
+-      RT_TRACE(COMP_INIT, "ChannelPlan = %d\n", priv->ChannelPlan);
+-      RT_TRACE(COMP_TRACE, "<==== ReadAdapterInfo\n");
+-}
+-
+-
+-static short rtl8192_get_channel_map(struct r8192_priv *priv)
+-{
+-#ifdef ENABLE_DOT11D
+-      if(priv->ChannelPlan> COUNTRY_CODE_GLOBAL_DOMAIN){
+-              printk("rtl8180_init:Error channel plan! Set to default.\n");
+-              priv->ChannelPlan= 0;
+-      }
+-      RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
+-
+-      rtl819x_set_channel_map(priv->ChannelPlan, priv);
+-#else
+-      int ch,i;
+-      //Set Default Channel Plan
+-      if(!channels){
+-              DMESG("No channels, aborting");
+-              return -1;
+-      }
+-      ch=channels;
+-      priv->ChannelPlan= 0;//hikaru
+-       // set channels 1..14 allowed in given locale
+-      for (i=1; i<=14; i++) {
+-              (priv->ieee80211->channel_map)[i] = (u8)(ch & 0x01);
+-              ch >>= 1;
+-      }
+-#endif
+-      return 0;
+-}
+-
+-static short rtl8192_init(struct r8192_priv *priv)
+-{
+-      struct net_device *dev = priv->ieee80211->dev;
+-
+-      memset(&(priv->stats),0,sizeof(struct Stats));
+-      rtl8192_init_priv_variable(priv);
+-      rtl8192_init_priv_lock(priv);
+-      rtl8192_init_priv_task(priv);
+-      rtl8192_get_eeprom_size(priv);
+-      rtl8192_read_eeprom_info(priv);
+-      rtl8192_get_channel_map(priv);
+-      init_hal_dm(priv);
+-      init_timer(&priv->watch_dog_timer);
+-      priv->watch_dog_timer.data = (unsigned long)priv;
+-      priv->watch_dog_timer.function = watch_dog_timer_callback;
+-        if (request_irq(dev->irq, rtl8192_interrupt, IRQF_SHARED, dev->name, priv)) {
+-              printk("Error allocating IRQ %d",dev->irq);
+-              return -1;
+-      }else{
+-              priv->irq=dev->irq;
+-              printk("IRQ %d",dev->irq);
+-      }
+-      if (rtl8192_pci_initdescring(priv) != 0){
+-              printk("Endopoints initialization failed");
+-              return -1;
+-      }
+-
+-      return 0;
+-}
+-
+-/*
+- * Actually only set RRSR, RATR and BW_OPMODE registers
+- *  not to do all the hw config as its name says
+- * This part need to modified according to the rate set we filtered
+- */
+-static void rtl8192_hwconfig(struct r8192_priv *priv)
+-{
+-      u32 regRATR = 0, regRRSR = 0;
+-      u8 regBwOpMode = 0, regTmp = 0;
+-
+-// Set RRSR, RATR, and BW_OPMODE registers
+-      //
+-      switch (priv->ieee80211->mode)
+-      {
+-      case WIRELESS_MODE_B:
+-              regBwOpMode = BW_OPMODE_20MHZ;
+-              regRATR = RATE_ALL_CCK;
+-              regRRSR = RATE_ALL_CCK;
+-              break;
+-      case WIRELESS_MODE_A:
+-              regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
+-              regRATR = RATE_ALL_OFDM_AG;
+-              regRRSR = RATE_ALL_OFDM_AG;
+-              break;
+-      case WIRELESS_MODE_G:
+-              regBwOpMode = BW_OPMODE_20MHZ;
+-              regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+-              regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+-              break;
+-      case WIRELESS_MODE_AUTO:
+-      case WIRELESS_MODE_N_24G:
+-              // It support CCK rate by default.
+-              // CCK rate will be filtered out only when associated AP does not support it.
+-              regBwOpMode = BW_OPMODE_20MHZ;
+-                      regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
+-                      regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+-              break;
+-      case WIRELESS_MODE_N_5G:
+-              regBwOpMode = BW_OPMODE_5G;
+-              regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
+-              regRRSR = RATE_ALL_OFDM_AG;
+-              break;
+-      }
+-
+-      write_nic_byte(priv, BW_OPMODE, regBwOpMode);
+-      {
+-              u32 ratr_value = 0;
+-              ratr_value = regRATR;
+-              if (priv->rf_type == RF_1T2R)
+-              {
+-                      ratr_value &= ~(RATE_ALL_OFDM_2SS);
+-              }
+-              write_nic_dword(priv, RATR0, ratr_value);
+-              write_nic_byte(priv, UFWP, 1);
+-      }
+-      regTmp = read_nic_byte(priv, 0x313);
+-      regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
+-      write_nic_dword(priv, RRSR, regRRSR);
+-
+-      //
+-      // Set Retry Limit here
+-      //
+-      write_nic_word(priv, RETRY_LIMIT,
+-                      priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT |
+-                      priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
+-      // Set Contention Window here
+-
+-      // Set Tx AGC
+-
+-      // Set Tx Antenna including Feedback control
+-
+-      // Set Auto Rate fallback control
+-
+-
+-}
+-
+-
+-static RT_STATUS rtl8192_adapter_start(struct r8192_priv *priv)
+-{
+-      struct net_device *dev = priv->ieee80211->dev;
+-      u32 ulRegRead;
+-      RT_STATUS rtStatus = RT_STATUS_SUCCESS;
+-      u8 tmpvalue;
+-      u8 ICVersion,SwitchingRegulatorOutput;
+-      bool bfirmwareok = true;
+-      u32     tmpRegA, tmpRegC, TempCCk;
+-      int     i =0;
+-
+-      RT_TRACE(COMP_INIT, "====>%s()\n", __FUNCTION__);
+-      priv->being_init_adapter = true;
+-        rtl8192_pci_resetdescring(priv);
+-      // 2007/11/02 MH Before initalizing RF. We can not use FW to do RF-R/W.
+-      priv->Rf_Mode = RF_OP_By_SW_3wire;
+-
+-        //dPLL on
+-        if(priv->ResetProgress == RESET_TYPE_NORESET)
+-        {
+-            write_nic_byte(priv, ANAPAR, 0x37);
+-            // Accordign to designer's explain, LBUS active will never > 10ms. We delay 10ms
+-            // Joseph increae the time to prevent firmware download fail
+-            mdelay(500);
+-        }
+-
+-      //PlatformSleepUs(10000);
+-      // For any kind of InitializeAdapter process, we shall use system now!!
+-      priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
+-
+-      //
+-      //3 //Config CPUReset Register
+-      //3//
+-      //3 Firmware Reset Or Not
+-      ulRegRead = read_nic_dword(priv, CPU_GEN);
+-      if(priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
+-      {       //called from MPInitialized. do nothing
+-              ulRegRead |= CPU_GEN_SYSTEM_RESET;
+-      }else if(priv->pFirmware->firmware_status == FW_STATUS_5_READY)
+-              ulRegRead |= CPU_GEN_FIRMWARE_RESET;    // Called from MPReset
+-      else
+-              RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __FUNCTION__,   priv->pFirmware->firmware_status);
+-
+-      write_nic_dword(priv, CPU_GEN, ulRegRead);
+-
+-      //3//
+-      //3 //Fix the issue of E-cut high temperature issue
+-      //3//
+-      // TODO: E cut only
+-      ICVersion = read_nic_byte(priv, IC_VERRSION);
+-      if(ICVersion >= 0x4) //E-cut only
+-      {
+-              // HW SD suggest that we should not wirte this register too often, so driver
+-              // should readback this register. This register will be modified only when
+-              // power on reset
+-              SwitchingRegulatorOutput = read_nic_byte(priv, SWREGULATOR);
+-              if(SwitchingRegulatorOutput  != 0xb8)
+-              {
+-                      write_nic_byte(priv, SWREGULATOR, 0xa8);
+-                      mdelay(1);
+-                      write_nic_byte(priv, SWREGULATOR, 0xb8);
+-              }
+-      }
+-
+-      //3//
+-      //3// Initialize BB before MAC
+-      //3//
+-      RT_TRACE(COMP_INIT, "BB Config Start!\n");
+-      rtStatus = rtl8192_BBConfig(priv);
+-      if(rtStatus != RT_STATUS_SUCCESS)
+-      {
+-              RT_TRACE(COMP_ERR, "BB Config failed\n");
+-              return rtStatus;
+-      }
+-      RT_TRACE(COMP_INIT,"BB Config Finished!\n");
+-
+-      //3//Set Loopback mode or Normal mode
+-      //3//
+-      //2006.12.13 by emily. Note!We should not merge these two CPU_GEN register writings
+-      //      because setting of System_Reset bit reset MAC to default transmission mode.
+-              //Loopback mode or not
+-      priv->LoopbackMode = RTL819X_NO_LOOPBACK;
+-      if(priv->ResetProgress == RESET_TYPE_NORESET)
+-      {
+-      ulRegRead = read_nic_dword(priv, CPU_GEN);
+-      if(priv->LoopbackMode == RTL819X_NO_LOOPBACK)
+-      {
+-              ulRegRead = ((ulRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
+-      }
+-      else if (priv->LoopbackMode == RTL819X_MAC_LOOPBACK )
+-      {
+-              ulRegRead |= CPU_CCK_LOOPBACK;
+-      }
+-      else
+-      {
+-              RT_TRACE(COMP_ERR,"Serious error: wrong loopback mode setting\n");
+-      }
+-
+-      //2008.06.03, for WOL
+-      //ulRegRead &= (~(CPU_GEN_GPIO_UART));
+-      write_nic_dword(priv, CPU_GEN, ulRegRead);
+-
+-      // 2006.11.29. After reset cpu, we sholud wait for a second, otherwise, it may fail to write registers. Emily
+-      udelay(500);
+-      }
+-      //3Set Hardware(Do nothing now)
+-      rtl8192_hwconfig(priv);
+-      //2=======================================================
+-      // Common Setting for all of the FPGA platform. (part 1)
+-      //2=======================================================
+-      // If there is changes, please make sure it applies to all of the FPGA version
+-      //3 Turn on Tx/Rx
+-      write_nic_byte(priv, CMDR, CR_RE|CR_TE);
+-
+-      //2Set Tx dma burst
+-      write_nic_byte(priv, PCIF, ((MXDMA2_NoLimit<<MXDMA2_RX_SHIFT) |
+-                                 (MXDMA2_NoLimit<<MXDMA2_TX_SHIFT) ));
+-
+-      //set IDR0 here
+-      write_nic_dword(priv, MAC0, ((u32*)dev->dev_addr)[0]);
+-      write_nic_word(priv, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
+-      //set RCR
+-      write_nic_dword(priv, RCR, priv->ReceiveConfig);
+-
+-      //3 Initialize Number of Reserved Pages in Firmware Queue
+-              write_nic_dword(priv, RQPN1,  NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |
+-                                      NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT |
+-                                      NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT |
+-                                      NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
+-              write_nic_dword(priv, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT);
+-              write_nic_dword(priv, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW|
+-                                      NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT|
+-                                      NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT);
+-
+-      rtl8192_tx_enable(priv);
+-      rtl8192_rx_enable(priv);
+-      //3Set Response Rate Setting Register
+-      // CCK rate is supported by default.
+-      // CCK rate will be filtered out only when associated AP does not support it.
+-      ulRegRead = (0xFFF00000 & read_nic_dword(priv, RRSR))  | RATE_ALL_OFDM_AG | RATE_ALL_CCK;
+-      write_nic_dword(priv, RRSR, ulRegRead);
+-      write_nic_dword(priv, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
+-
+-      //2Set AckTimeout
+-      // TODO: (it value is only for FPGA version). need to be changed!!2006.12.18, by Emily
+-      write_nic_byte(priv, ACK_TIMEOUT, 0x30);
+-
+-      if(priv->ResetProgress == RESET_TYPE_NORESET)
+-      rtl8192_SetWirelessMode(priv->ieee80211, priv->ieee80211->mode);
+-      //-----------------------------------------------------------------------------
+-      // Set up security related. 070106, by rcnjko:
+-      // 1. Clear all H/W keys.
+-      // 2. Enable H/W encryption/decryption.
+-      //-----------------------------------------------------------------------------
+-      CamResetAllEntry(priv);
+-      {
+-              u8 SECR_value = 0x0;
+-              SECR_value |= SCR_TxEncEnable;
+-              SECR_value |= SCR_RxDecEnable;
+-              SECR_value |= SCR_NoSKMC;
+-              write_nic_byte(priv, SECR, SECR_value);
+-      }
+-      //3Beacon related
+-      write_nic_word(priv, ATIMWND, 2);
+-      write_nic_word(priv, BCN_INTERVAL, 100);
+-      for (i=0; i<QOS_QUEUE_NUM; i++)
+-              write_nic_dword(priv, WDCAPARA_ADD[i], 0x005e4332);
+-      //
+-      // Switching regulator controller: This is set temporarily.
+-      // It's not sure if this can be removed in the future.
+-      // PJ advised to leave it by default.
+-      //
+-      write_nic_byte(priv, 0xbe, 0xc0);
+-
+-      //2=======================================================
+-      // Set PHY related configuration defined in MAC register bank
+-      //2=======================================================
+-      rtl8192_phy_configmac(priv);
+-
+-      if (priv->card_8192_version > (u8) VERSION_8190_BD) {
+-              rtl8192_phy_getTxPower(priv);
+-              rtl8192_phy_setTxPower(priv, priv->chan);
+-      }
+-
+-      //if D or C cut
+-              tmpvalue = read_nic_byte(priv, IC_VERRSION);
+-              priv->IC_Cut = tmpvalue;
+-              RT_TRACE(COMP_INIT, "priv->IC_Cut = 0x%x\n", priv->IC_Cut);
+-              if(priv->IC_Cut >= IC_VersionCut_D)
+-              {
+-                      //pHalData->bDcut = TRUE;
+-                      if(priv->IC_Cut == IC_VersionCut_D)
+-                              RT_TRACE(COMP_INIT, "D-cut\n");
+-                      if(priv->IC_Cut == IC_VersionCut_E)
+-                      {
+-                              RT_TRACE(COMP_INIT, "E-cut\n");
+-                              // HW SD suggest that we should not wirte this register too often, so driver
+-                              // should readback this register. This register will be modified only when
+-                              // power on reset
+-                      }
+-              }
+-              else
+-              {
+-                      //pHalData->bDcut = FALSE;
+-                      RT_TRACE(COMP_INIT, "Before C-cut\n");
+-              }
+-
+-      //Firmware download
+-      RT_TRACE(COMP_INIT, "Load Firmware!\n");
+-      bfirmwareok = init_firmware(priv);
+-      if(bfirmwareok != true) {
+-              rtStatus = RT_STATUS_FAILURE;
+-              return rtStatus;
+-      }
+-      RT_TRACE(COMP_INIT, "Load Firmware finished!\n");
+-
+-      //RF config
+-      if(priv->ResetProgress == RESET_TYPE_NORESET)
+-      {
+-      RT_TRACE(COMP_INIT, "RF Config Started!\n");
+-      rtStatus = rtl8192_phy_RFConfig(priv);
+-      if(rtStatus != RT_STATUS_SUCCESS)
+-      {
+-              RT_TRACE(COMP_ERR, "RF Config failed\n");
+-                      return rtStatus;
+-      }
+-      RT_TRACE(COMP_INIT, "RF Config Finished!\n");
+-      }
+-      rtl8192_phy_updateInitGain(priv);
+-
+-      /*---- Set CCK and OFDM Block "ON"----*/
+-      rtl8192_setBBreg(priv, rFPGA0_RFMOD, bCCKEn, 0x1);
+-      rtl8192_setBBreg(priv, rFPGA0_RFMOD, bOFDMEn, 0x1);
+-
+-      //Enable Led
+-      write_nic_byte(priv, 0x87, 0x0);
+-
+-      //2=======================================================
+-      // RF Power Save
+-      //2=======================================================
+-#ifdef ENABLE_IPS
+-
+-{
+-      if(priv->RfOffReason > RF_CHANGE_BY_PS)
+-      { // H/W or S/W RF OFF before sleep.
+-              RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RfOffReason(%d)\n", __FUNCTION__,priv->RfOffReason);
+-              MgntActSet_RF_State(priv, eRfOff, priv->RfOffReason);
+-      }
+-      else if(priv->RfOffReason >= RF_CHANGE_BY_IPS)
+-      { // H/W or S/W RF OFF before sleep.
+-              RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RfOffReason(%d)\n",  __FUNCTION__, priv->RfOffReason);
+-              MgntActSet_RF_State(priv, eRfOff, priv->RfOffReason);
+-      }
+-      else
+-      {
+-              RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): RF-ON \n",__FUNCTION__);
+-              priv->eRFPowerState = eRfOn;
+-              priv->RfOffReason = 0;
+-      }
+-}
+-#endif
+-      // We can force firmware to do RF-R/W
+-      if(priv->ieee80211->FwRWRF)
+-              priv->Rf_Mode = RF_OP_By_FW;
+-      else
+-              priv->Rf_Mode = RF_OP_By_SW_3wire;
+-
+-      if(priv->ResetProgress == RESET_TYPE_NORESET)
+-      {
+-              dm_initialize_txpower_tracking(priv);
+-
+-              if(priv->IC_Cut >= IC_VersionCut_D)
+-              {
+-                      tmpRegA = rtl8192_QueryBBReg(priv, rOFDM0_XATxIQImbalance, bMaskDWord);
+-                      tmpRegC = rtl8192_QueryBBReg(priv, rOFDM0_XCTxIQImbalance, bMaskDWord);
+-                      for(i = 0; i<TxBBGainTableLength; i++)
+-                      {
+-                              if(tmpRegA == priv->txbbgain_table[i].txbbgain_value)
+-                              {
+-                                      priv->rfa_txpowertrackingindex= (u8)i;
+-                                      priv->rfa_txpowertrackingindex_real= (u8)i;
+-                                      priv->rfa_txpowertracking_default = priv->rfa_txpowertrackingindex;
+-                                      break;
+-                              }
+-                      }
+-
+-              TempCCk = rtl8192_QueryBBReg(priv, rCCK0_TxFilter1, bMaskByte2);
+-
+-              for(i=0 ; i<CCKTxBBGainTableLength ; i++)
+-              {
+-                      if(TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0])
+-                      {
+-                              priv->CCKPresentAttentuation_20Mdefault =(u8) i;
+-                              break;
+-                      }
+-              }
+-              priv->CCKPresentAttentuation_40Mdefault = 0;
+-              priv->CCKPresentAttentuation_difference = 0;
+-              priv->CCKPresentAttentuation = priv->CCKPresentAttentuation_20Mdefault;
+-                      RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_initial = %d\n", priv->rfa_txpowertrackingindex);
+-                      RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real__initial = %d\n", priv->rfa_txpowertrackingindex_real);
+-                      RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_difference_initial = %d\n", priv->CCKPresentAttentuation_difference);
+-                      RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_initial = %d\n", priv->CCKPresentAttentuation);
+-                      priv->btxpower_tracking = FALSE;//TEMPLY DISABLE
+-              }
+-      }
+-
+-      rtl8192_irq_enable(priv);
+-      priv->being_init_adapter = false;
+-      return rtStatus;
+-
+-}
+-
+-static void rtl8192_prepare_beacon(unsigned long arg)
+-{
+-      struct r8192_priv *priv = (struct r8192_priv*) arg;
+-      struct sk_buff *skb;
+-      cb_desc *tcb_desc;
+-
+-      skb = ieee80211_get_beacon(priv->ieee80211);
+-      tcb_desc = (cb_desc *)(skb->cb + 8);
+-      /* prepare misc info for the beacon xmit */
+-      tcb_desc->queue_index = BEACON_QUEUE;
+-      /* IBSS does not support HT yet, use 1M defaultly */
+-      tcb_desc->data_rate = 2;
+-      tcb_desc->RATRIndex = 7;
+-      tcb_desc->bTxDisableRateFallBack = 1;
+-      tcb_desc->bTxUseDriverAssingedRate = 1;
+-
+-      skb_push(skb, priv->ieee80211->tx_headroom);
+-      if(skb){
+-              rtl8192_tx(priv, skb);
+-      }
+-}
+-
+-
+-/*
+- * configure registers for beacon tx and enables it via
+- * rtl8192_beacon_tx_enable(). rtl8192_beacon_tx_disable() might
+- * be used to stop beacon transmission
+- */
+-static void rtl8192_start_beacon(struct ieee80211_device *ieee80211)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      struct ieee80211_network *net = &priv->ieee80211->current_network;
+-      u16 BcnTimeCfg = 0;
+-        u16 BcnCW = 6;
+-        u16 BcnIFS = 0xf;
+-
+-      DMESG("Enabling beacon TX");
+-      rtl8192_irq_disable(priv);
+-      //rtl8192_beacon_tx_enable(dev);
+-
+-      /* ATIM window */
+-      write_nic_word(priv, ATIMWND, 2);
+-
+-      /* Beacon interval (in unit of TU) */
+-      write_nic_word(priv, BCN_INTERVAL, net->beacon_interval);
+-
+-      /*
+-       * DrvErlyInt (in unit of TU).
+-       * (Time to send interrupt to notify driver to c
+-       * hange beacon content)
+-       * */
+-      write_nic_word(priv, BCN_DRV_EARLY_INT, 10);
+-
+-      /*
+-       * BcnDMATIM(in unit of us).
+-       * Indicates the time before TBTT to perform beacon queue DMA
+-       * */
+-      write_nic_word(priv, BCN_DMATIME, 256);
+-
+-      /*
+-       * Force beacon frame transmission even after receiving
+-       * beacon frame from other ad hoc STA
+-       * */
+-      write_nic_byte(priv, BCN_ERR_THRESH, 100);
+-
+-      /* Set CW and IFS */
+-      BcnTimeCfg |= BcnCW<<BCN_TCFG_CW_SHIFT;
+-      BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
+-      write_nic_word(priv, BCN_TCFG, BcnTimeCfg);
+-
+-
+-      /* enable the interrupt for ad-hoc process */
+-      rtl8192_irq_enable(priv);
+-}
+-
+-static bool HalRxCheckStuck8190Pci(struct r8192_priv *priv)
+-{
+-      u16 RegRxCounter = read_nic_word(priv, 0x130);
+-      bool                            bStuck = FALSE;
+-
+-      RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",__FUNCTION__,RegRxCounter,priv->RxCounter);
+-      // If rssi is small, we should check rx for long time because of bad rx.
+-      // or maybe it will continuous silent reset every 2 seconds.
+-      priv->rx_chk_cnt++;
+-      if(priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
+-      {
+-              priv->rx_chk_cnt = 0;   /* high rssi, check rx stuck right now. */
+-      }
+-      else if(priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5) &&
+-              ((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_40M) ||
+-              (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)) )
+-
+-      {
+-              if(priv->rx_chk_cnt < 2)
+-              {
+-                      return bStuck;
+-              }
+-              else
+-              {
+-                      priv->rx_chk_cnt = 0;
+-              }
+-      }
+-      else if(((priv->CurrentChannelBW!=HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_40M) ||
+-              (priv->CurrentChannelBW==HT_CHANNEL_WIDTH_20&&priv->undecorated_smoothed_pwdb<RateAdaptiveTH_Low_20M)) &&
+-              priv->undecorated_smoothed_pwdb >= VeryLowRSSI)
+-      {
+-              if(priv->rx_chk_cnt < 4)
+-              {
+-                      return bStuck;
+-              }
+-              else
+-              {
+-                      priv->rx_chk_cnt = 0;
+-              }
+-      }
+-      else
+-      {
+-              if(priv->rx_chk_cnt < 8)
+-              {
+-                      return bStuck;
+-              }
+-              else
+-              {
+-                      priv->rx_chk_cnt = 0;
+-              }
+-      }
+-      if(priv->RxCounter==RegRxCounter)
+-              bStuck = TRUE;
+-
+-      priv->RxCounter = RegRxCounter;
+-
+-      return bStuck;
+-}
+-
+-static RESET_TYPE RxCheckStuck(struct r8192_priv *priv)
+-{
+-
+-      if(HalRxCheckStuck8190Pci(priv))
+-      {
+-              RT_TRACE(COMP_RESET, "RxStuck Condition\n");
+-              return RESET_TYPE_SILENT;
+-      }
+-
+-      return RESET_TYPE_NORESET;
+-}
+-
+-static RESET_TYPE rtl819x_check_reset(struct r8192_priv *priv)
+-{
+-      RESET_TYPE RxResetType = RESET_TYPE_NORESET;
+-      RT_RF_POWER_STATE rfState;
+-
+-      rfState = priv->eRFPowerState;
+-
+-      if (rfState != eRfOff && (priv->ieee80211->iw_mode != IW_MODE_ADHOC)) {
+-              /*
+-               * If driver is in the status of firmware download failure,
+-               * driver skips RF initialization and RF is in turned off state.
+-               * Driver should check whether Rx stuck and do silent reset. And
+-               * if driver is in firmware download failure status, driver
+-               * should initialize RF in the following silent reset procedure
+-               *
+-               * Driver should not check RX stuck in IBSS mode because it is
+-               * required to set Check BSSID in order to send beacon, however,
+-               * if check BSSID is set, STA cannot hear any packet a all.
+-               */
+-              RxResetType = RxCheckStuck(priv);
+-      }
+-
+-      RT_TRACE(COMP_RESET, "%s():  RxResetType is %d\n", __FUNCTION__, RxResetType);
+-
+-      return RxResetType;
+-}
+-
+-#ifdef ENABLE_IPS
+-static void InactivePsWorkItemCallback(struct r8192_priv *priv)
+-{
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-
+-      RT_TRACE(COMP_POWER, "InactivePsWorkItemCallback() --------->\n");
+-      //
+-      // This flag "bSwRfProcessing", indicates the status of IPS procedure, should be set if the IPS workitem
+-      // is really scheduled.
+-      // The old code, sets this flag before scheduling the IPS workitem and however, at the same time the
+-      // previous IPS workitem did not end yet, fails to schedule the current workitem. Thus, bSwRfProcessing
+-      // blocks the IPS procedure of switching RF.
+-      // By Bruce, 2007-12-25.
+-      //
+-      pPSC->bSwRfProcessing = TRUE;
+-
+-      RT_TRACE(COMP_RF, "InactivePsWorkItemCallback(): Set RF to %s.\n",
+-                      pPSC->eInactivePowerState == eRfOff?"OFF":"ON");
+-
+-
+-      MgntActSet_RF_State(priv, pPSC->eInactivePowerState, RF_CHANGE_BY_IPS);
+-
+-      //
+-      // To solve CAM values miss in RF OFF, rewrite CAM values after RF ON. By Bruce, 2007-09-20.
+-      //
+-      pPSC->bSwRfProcessing = FALSE;
+-      RT_TRACE(COMP_POWER, "InactivePsWorkItemCallback() <---------\n");
+-}
+-
+-#ifdef ENABLE_LPS
+-/* Change current and default preamble mode. */
+-bool MgntActSet_802_11_PowerSaveMode(struct r8192_priv *priv, u8 rtPsMode)
+-{
+-
+-      // Currently, we do not change power save mode on IBSS mode.
+-      if(priv->ieee80211->iw_mode == IW_MODE_ADHOC)
+-      {
+-              return false;
+-      }
+-
+-      //
+-      // <RJ_NOTE> If we make HW to fill up the PwrMgt bit for us,
+-      // some AP will not response to our mgnt frames with PwrMgt bit set,
+-      // e.g. cannot associate the AP.
+-      // So I commented out it. 2005.02.16, by rcnjko.
+-      //
+-//    // Change device's power save mode.
+-//    Adapter->HalFunc.SetPSModeHandler( Adapter, rtPsMode );
+-
+-      // Update power save mode configured.
+-      //RT_TRACE(COMP_LPS,"%s(): set ieee->ps = %x\n",__FUNCTION__,rtPsMode);
+-      if(!priv->ps_force) {
+-              priv->ieee80211->ps = rtPsMode;
+-      }
+-
+-      // Awake immediately
+-      if(priv->ieee80211->sta_sleep != 0 && rtPsMode == IEEE80211_PS_DISABLED)
+-      {
+-              // Notify the AP we awke.
+-              rtl8192_hw_wakeup(priv->ieee80211);
+-              priv->ieee80211->sta_sleep = 0;
+-
+-                spin_lock(&priv->ieee80211->mgmt_tx_lock);
+-              printk("LPS leave: notify AP we are awaked ++++++++++ SendNullFunctionData\n");
+-              ieee80211_sta_ps_send_null_frame(priv->ieee80211, 0);
+-                spin_unlock(&priv->ieee80211->mgmt_tx_lock);
+-      }
+-
+-      return true;
+-}
+-
+-/* Enter the leisure power save mode. */
+-void LeisurePSEnter(struct ieee80211_device *ieee80211)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-
+-      if(!((priv->ieee80211->iw_mode == IW_MODE_INFRA) &&
+-              (priv->ieee80211->state == IEEE80211_LINKED)) ||
+-              (priv->ieee80211->iw_mode == IW_MODE_ADHOC) ||
+-              (priv->ieee80211->iw_mode == IW_MODE_MASTER))
+-              return;
+-
+-      if (pPSC->bLeisurePs)
+-      {
+-              // Idle for a while if we connect to AP a while ago.
+-              if(pPSC->LpsIdleCount >= RT_CHECK_FOR_HANG_PERIOD) //  4 Sec
+-              {
+-
+-                      if(priv->ieee80211->ps == IEEE80211_PS_DISABLED)
+-                      {
+-                              MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_MBCAST|IEEE80211_PS_UNICAST);
+-
+-                      }
+-              }
+-              else
+-                      pPSC->LpsIdleCount++;
+-      }
+-}
+-
+-
+-/* Leave leisure power save mode. */
+-void LeisurePSLeave(struct ieee80211_device *ieee80211)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-
+-      if (pPSC->bLeisurePs)
+-      {
+-              if(priv->ieee80211->ps != IEEE80211_PS_DISABLED)
+-              {
+-                      // move to lps_wakecomplete()
+-                      MgntActSet_802_11_PowerSaveMode(priv, IEEE80211_PS_DISABLED);
+-
+-              }
+-      }
+-}
+-#endif
+-
+-
+-/* Enter the inactive power save mode. RF will be off */
+-void IPSEnter(struct r8192_priv *priv)
+-{
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-      RT_RF_POWER_STATE                       rtState;
+-
+-      if (pPSC->bInactivePs)
+-      {
+-              rtState = priv->eRFPowerState;
+-              //
+-              // Added by Bruce, 2007-12-25.
+-              // Do not enter IPS in the following conditions:
+-              // (1) RF is already OFF or Sleep
+-              // (2) bSwRfProcessing (indicates the IPS is still under going)
+-              // (3) Connectted (only disconnected can trigger IPS)
+-              // (4) IBSS (send Beacon)
+-              // (5) AP mode (send Beacon)
+-              //
+-              if (rtState == eRfOn && !pPSC->bSwRfProcessing
+-                      && (priv->ieee80211->state != IEEE80211_LINKED) )
+-              {
+-                      RT_TRACE(COMP_RF,"IPSEnter(): Turn off RF.\n");
+-                      pPSC->eInactivePowerState = eRfOff;
+-//                    queue_work(priv->priv_wq,&(pPSC->InactivePsWorkItem));
+-                      InactivePsWorkItemCallback(priv);
+-              }
+-      }
+-}
+-
+-//
+-//    Description:
+-//            Leave the inactive power save mode, RF will be on.
+-//    2007.08.17, by shien chang.
+-//
+-void IPSLeave(struct r8192_priv *priv)
+-{
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-      RT_RF_POWER_STATE       rtState;
+-
+-      if (pPSC->bInactivePs)
+-      {
+-              rtState = priv->eRFPowerState;
+-              if (rtState != eRfOn && !pPSC->bSwRfProcessing && priv->RfOffReason <= RF_CHANGE_BY_IPS)
+-              {
+-                      RT_TRACE(COMP_POWER, "IPSLeave(): Turn on RF.\n");
+-                      pPSC->eInactivePowerState = eRfOn;
+-                      InactivePsWorkItemCallback(priv);
+-              }
+-      }
+-}
+-
+-void IPSLeave_wq(struct work_struct *work)
+-{
+-      struct ieee80211_device *ieee = container_of(work, struct ieee80211_device, ips_leave_wq);
+-      struct net_device *dev = ieee->dev;
+-
+-      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
+-      down(&priv->ieee80211->ips_sem);
+-      IPSLeave(priv);
+-      up(&priv->ieee80211->ips_sem);
+-}
+-
+-void ieee80211_ips_leave_wq(struct ieee80211_device *ieee80211)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      RT_RF_POWER_STATE       rtState;
+-      rtState = priv->eRFPowerState;
+-
+-      if (priv->PowerSaveControl.bInactivePs){
+-              if(rtState == eRfOff){
+-                      if(priv->RfOffReason > RF_CHANGE_BY_IPS)
+-                      {
+-                              RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
+-                              return;
+-                      }
+-                      else{
+-                              printk("=========>%s(): IPSLeave\n",__FUNCTION__);
+-                              queue_work(priv->ieee80211->wq,&priv->ieee80211->ips_leave_wq);
+-                      }
+-              }
+-      }
+-}
+-//added by amy 090331 end
+-void ieee80211_ips_leave(struct ieee80211_device *ieee80211)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(ieee80211->dev);
+-      down(&ieee80211->ips_sem);
+-      IPSLeave(priv);
+-      up(&ieee80211->ips_sem);
+-}
+-#endif
+-
+-static void rtl819x_update_rxcounts(
+-      struct r8192_priv *priv,
+-      u32* TotalRxBcnNum,
+-      u32* TotalRxDataNum
+-)
+-{
+-      u16                     SlotIndex;
+-      u8                      i;
+-
+-      *TotalRxBcnNum = 0;
+-      *TotalRxDataNum = 0;
+-
+-      SlotIndex = (priv->ieee80211->LinkDetectInfo.SlotIndex++)%(priv->ieee80211->LinkDetectInfo.SlotNum);
+-      priv->ieee80211->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvBcnInPeriod;
+-      priv->ieee80211->LinkDetectInfo.RxDataNum[SlotIndex] = priv->ieee80211->LinkDetectInfo.NumRecvDataInPeriod;
+-      for( i=0; i<priv->ieee80211->LinkDetectInfo.SlotNum; i++ ){
+-              *TotalRxBcnNum += priv->ieee80211->LinkDetectInfo.RxBcnNum[i];
+-              *TotalRxDataNum += priv->ieee80211->LinkDetectInfo.RxDataNum[i];
+-      }
+-}
+-
+-
+-static void rtl819x_watchdog_wqcallback(struct work_struct *work)
+-{
+-      struct delayed_work *dwork = container_of(work,struct delayed_work,work);
+-       struct r8192_priv *priv = container_of(dwork,struct r8192_priv,watch_dog_wq);
+-      struct ieee80211_device* ieee = priv->ieee80211;
+-      RESET_TYPE      ResetType = RESET_TYPE_NORESET;
+-      bool bBusyTraffic = false;
+-      bool bEnterPS = false;
+-
+-      if ((!priv->up) || priv->bHwRadioOff)
+-              return;
+-
+-      if(!priv->up)
+-              return;
+-      hal_dm_watchdog(priv);
+-#ifdef ENABLE_IPS
+-      if(ieee->actscanning == false){
+-              if((ieee->iw_mode == IW_MODE_INFRA) && (ieee->state == IEEE80211_NOLINK) &&
+-                  (priv->eRFPowerState == eRfOn) && !ieee->is_set_key &&
+-                  (!ieee->proto_stoppping) && !ieee->wx_set_enc){
+-                      if (priv->PowerSaveControl.ReturnPoint == IPS_CALLBACK_NONE){
+-                              IPSEnter(priv);
+-                      }
+-              }
+-      }
+-#endif
+-      {//to get busy traffic condition
+-              if(ieee->state == IEEE80211_LINKED)
+-              {
+-                      if(     ieee->LinkDetectInfo.NumRxOkInPeriod> 100 ||
+-                              ieee->LinkDetectInfo.NumTxOkInPeriod> 100 ) {
+-                              bBusyTraffic = true;
+-                      }
+-
+-#ifdef ENABLE_LPS
+-                      //added by amy for Leisure PS
+-                      if(     ((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod + ieee->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
+-                              (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
+-                      {
+-                              bEnterPS= false;
+-                      }
+-                      else
+-                      {
+-                              bEnterPS= true;
+-                      }
+-
+-                      // LeisurePS only work in infra mode.
+-                      if(bEnterPS)
+-                      {
+-                              LeisurePSEnter(priv->ieee80211);
+-                      }
+-                      else
+-                      {
+-                              LeisurePSLeave(priv->ieee80211);
+-                      }
+-#endif
+-
+-              }
+-              else
+-              {
+-#ifdef ENABLE_LPS
+-                      LeisurePSLeave(priv->ieee80211);
+-#endif
+-              }
+-
+-              ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
+-              ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
+-              ieee->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
+-              ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
+-      }
+-
+-
+-      //added by amy for AP roaming
+-              if(ieee->state == IEEE80211_LINKED && ieee->iw_mode == IW_MODE_INFRA)
+-              {
+-                      u32     TotalRxBcnNum = 0;
+-                      u32     TotalRxDataNum = 0;
+-
+-                      rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
+-                      if((TotalRxBcnNum+TotalRxDataNum) == 0)
+-                      {
+-                              if (priv->eRFPowerState == eRfOff)
+-                                      RT_TRACE(COMP_ERR,"========>%s()\n",__FUNCTION__);
+-                              printk("===>%s(): AP is power off,connect another one\n",__FUNCTION__);
+-                              //              Dot11d_Reset(dev);
+-                              ieee->state = IEEE80211_ASSOCIATING;
+-                              notify_wx_assoc_event(priv->ieee80211);
+-                              RemovePeerTS(priv->ieee80211,priv->ieee80211->current_network.bssid);
+-                              ieee->is_roaming = true;
+-                              ieee->is_set_key = false;
+-                              ieee->link_change(ieee);
+-                              queue_work(ieee->wq, &ieee->associate_procedure_wq);
+-                      }
+-              }
+-            ieee->LinkDetectInfo.NumRecvBcnInPeriod=0;
+-              ieee->LinkDetectInfo.NumRecvDataInPeriod=0;
+-
+-      //check if reset the driver
+-      if (priv->watchdog_check_reset_cnt++ >= 3 && !ieee->is_roaming && 
+-          priv->watchdog_last_time != 1)
+-      {
+-              ResetType = rtl819x_check_reset(priv);
+-              priv->watchdog_check_reset_cnt = 3;
+-      }
+-      if(!priv->bDisableNormalResetCheck && ResetType == RESET_TYPE_NORMAL)
+-      {
+-              priv->ResetProgress = RESET_TYPE_NORMAL;
+-              RT_TRACE(COMP_RESET,"%s(): NOMAL RESET\n",__FUNCTION__);
+-              return;
+-      }
+-      /* disable silent reset temply 2008.9.11*/
+-
+-      if( ((priv->force_reset) || (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT))) // This is control by OID set in Pomelo
+-      {
+-              priv->watchdog_last_time = 1;
+-      }
+-      else
+-              priv->watchdog_last_time = 0;
+-
+-      priv->force_reset = false;
+-      priv->bForcedSilentReset = false;
+-      priv->bResetInProgress = false;
+-      RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
+-
+-}
+-
+-void watch_dog_timer_callback(unsigned long data)
+-{
+-      struct r8192_priv *priv = (struct r8192_priv *) data;
+-      queue_delayed_work(priv->priv_wq,&priv->watch_dog_wq,0);
+-      mod_timer(&priv->watch_dog_timer, jiffies + MSECS(IEEE80211_WATCH_DOG_TIME));
+-
+-}
+-
+-static int _rtl8192_up(struct r8192_priv *priv)
+-{
+-      RT_STATUS init_status = RT_STATUS_SUCCESS;
+-      struct net_device *dev = priv->ieee80211->dev;
+-
+-      priv->up=1;
+-      priv->ieee80211->ieee_up=1;
+-      priv->bdisable_nic = false;  //YJ,add,091111
+-      RT_TRACE(COMP_INIT, "Bringing up iface\n");
+-
+-      init_status = rtl8192_adapter_start(priv);
+-      if(init_status != RT_STATUS_SUCCESS)
+-      {
+-              RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n",__FUNCTION__);
+-              return -1;
+-      }
+-      RT_TRACE(COMP_INIT, "start adapter finished\n");
+-
+-      if (priv->eRFPowerState != eRfOn)
+-              MgntActSet_RF_State(priv, eRfOn, priv->RfOffReason);
+-
+-      if(priv->ieee80211->state != IEEE80211_LINKED)
+-      ieee80211_softmac_start_protocol(priv->ieee80211);
+-      ieee80211_reset_queue(priv->ieee80211);
+-      watch_dog_timer_callback((unsigned long) priv);
+-      if(!netif_queue_stopped(dev))
+-              netif_start_queue(dev);
+-      else
+-              netif_wake_queue(dev);
+-
+-      return 0;
+-}
+-
+-
+-static int rtl8192_open(struct net_device *dev)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-      int ret;
+-
+-      down(&priv->wx_sem);
+-      ret = rtl8192_up(dev);
+-      up(&priv->wx_sem);
+-      return ret;
+-
+-}
+-
+-
+-int rtl8192_up(struct net_device *dev)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-
+-      if (priv->up == 1) return -1;
+-
+-      return _rtl8192_up(priv);
+-}
+-
+-
+-static int rtl8192_close(struct net_device *dev)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-      int ret;
+-
+-      down(&priv->wx_sem);
+-
+-      ret = rtl8192_down(dev);
+-
+-      up(&priv->wx_sem);
+-
+-      return ret;
+-
+-}
+-
+-int rtl8192_down(struct net_device *dev)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-
+-      if (priv->up == 0) return -1;
+-
+-#ifdef ENABLE_LPS
+-      //LZM for PS-Poll AID issue. 090429
+-      if(priv->ieee80211->state == IEEE80211_LINKED)
+-              LeisurePSLeave(priv->ieee80211);
+-#endif
+-
+-      priv->up=0;
+-      priv->ieee80211->ieee_up = 0;
+-      RT_TRACE(COMP_DOWN, "==========>%s()\n", __FUNCTION__);
+-/* FIXME */
+-      if (!netif_queue_stopped(dev))
+-              netif_stop_queue(dev);
+-
+-      rtl8192_irq_disable(priv);
+-      rtl8192_cancel_deferred_work(priv);
+-      deinit_hal_dm(priv);
+-      del_timer_sync(&priv->watch_dog_timer);
+-
+-      ieee80211_softmac_stop_protocol(priv->ieee80211,true);
+-
+-      rtl8192_halt_adapter(priv, false);
+-      memset(&priv->ieee80211->current_network, 0 , offsetof(struct ieee80211_network, list));
+-
+-      RT_TRACE(COMP_DOWN, "<==========%s()\n", __FUNCTION__);
+-
+-      return 0;
+-}
+-
+-
+-void rtl8192_commit(struct r8192_priv *priv)
+-{
+-      if (priv->up == 0) return ;
+-
+-
+-      ieee80211_softmac_stop_protocol(priv->ieee80211,true);
+-
+-      rtl8192_irq_disable(priv);
+-      rtl8192_halt_adapter(priv, true);
+-      _rtl8192_up(priv);
+-}
+-
+-static void rtl8192_restart(struct work_struct *work)
+-{
+-        struct r8192_priv *priv = container_of(work, struct r8192_priv, reset_wq);
+-
+-      down(&priv->wx_sem);
+-
+-      rtl8192_commit(priv);
+-
+-      up(&priv->wx_sem);
+-}
+-
+-static void r8192_set_multicast(struct net_device *dev)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-
+-      priv->promisc = (dev->flags & IFF_PROMISC) ? 1 : 0;
+-}
+-
+-
+-static int r8192_set_mac_adr(struct net_device *dev, void *mac)
+-{
+-      struct r8192_priv *priv = ieee80211_priv(dev);
+-      struct sockaddr *addr = mac;
+-
+-      down(&priv->wx_sem);
+-
+-      memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+-
+-      schedule_work(&priv->reset_wq);
+-      up(&priv->wx_sem);
+-
+-      return 0;
+-}
+-
+-static void r8192e_set_hw_key(struct r8192_priv *priv, struct ieee_param *ipw)
+-{
+-      struct ieee80211_device *ieee = priv->ieee80211;
+-      u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
+-      u32 key[4];
+-
+-      if (ipw->u.crypt.set_tx) {
+-              if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
+-                      ieee->pairwise_key_type = KEY_TYPE_CCMP;
+-              else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
+-                      ieee->pairwise_key_type = KEY_TYPE_TKIP;
+-              else if (strcmp(ipw->u.crypt.alg, "WEP") == 0) {
+-                      if (ipw->u.crypt.key_len == 13)
+-                              ieee->pairwise_key_type = KEY_TYPE_WEP104;
+-                      else if (ipw->u.crypt.key_len == 5)
+-                              ieee->pairwise_key_type = KEY_TYPE_WEP40;
+-              } else
+-                      ieee->pairwise_key_type = KEY_TYPE_NA;
+-
+-              if (ieee->pairwise_key_type) {
+-                      memcpy(key, ipw->u.crypt.key, 16);
+-                      EnableHWSecurityConfig8192(priv);
+-                      /*
+-                       * We fill both index entry and 4th entry for pairwise
+-                       * key as in IPW interface, adhoc will only get here,
+-                       * so we need index entry for its default key serching!
+-                       */
+-                      setKey(priv, 4, ipw->u.crypt.idx,
+-                             ieee->pairwise_key_type,
+-                             (u8*)ieee->ap_mac_addr, 0, key);
+-
+-                      /* LEAP WEP will never set this. */
+-                      if (ieee->auth_mode != 2)
+-                              setKey(priv, ipw->u.crypt.idx, ipw->u.crypt.idx,
+-                                     ieee->pairwise_key_type,
+-                                     (u8*)ieee->ap_mac_addr, 0, key);
+-              }
+-              if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) &&
+-                  ieee->pHTInfo->bCurrentHTSupport) {
+-                      write_nic_byte(priv, 0x173, 1); /* fix aes bug */
+-              }
+-      } else {
+-              memcpy(key, ipw->u.crypt.key, 16);
+-              if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
+-                      ieee->group_key_type= KEY_TYPE_CCMP;
+-              else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
+-                      ieee->group_key_type = KEY_TYPE_TKIP;
+-              else if (strcmp(ipw->u.crypt.alg, "WEP") == 0) {
+-                      if (ipw->u.crypt.key_len == 13)
+-                              ieee->group_key_type = KEY_TYPE_WEP104;
+-                      else if (ipw->u.crypt.key_len == 5)
+-                              ieee->group_key_type = KEY_TYPE_WEP40;
+-              } else
+-                      ieee->group_key_type = KEY_TYPE_NA;
+-
+-              if (ieee->group_key_type) {
+-                      setKey(priv, ipw->u.crypt.idx, ipw->u.crypt.idx,
+-                             ieee->group_key_type, broadcast_addr, 0, key);
+-              }
+-      }
+-}
+-
+-/* based on ipw2200 driver */
+-static int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+-{
+-      struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
+-      struct iwreq *wrq = (struct iwreq *)rq;
+-      int ret=-1;
+-      struct iw_point *p = &wrq->u.data;
+-      struct ieee_param *ipw = NULL;//(struct ieee_param *)wrq->u.data.pointer;
+-
+-      down(&priv->wx_sem);
+-
+-
+-     if (p->length < sizeof(struct ieee_param) || !p->pointer){
+-             ret = -EINVAL;
+-             goto out;
+-     }
+-
+-     ipw = kmalloc(p->length, GFP_KERNEL);
+-     if (ipw == NULL){
+-             ret = -ENOMEM;
+-             goto out;
+-     }
+-     if (copy_from_user(ipw, p->pointer, p->length)) {
+-            kfree(ipw);
+-            ret = -EFAULT;
+-            goto out;
+-     }
+-
+-      switch (cmd) {
+-      case RTL_IOCTL_WPA_SUPPLICANT:
+-              /* parse here for HW security */
+-              if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
+-                      r8192e_set_hw_key(priv, ipw);
+-              ret = ieee80211_wpa_supplicant_ioctl(priv->ieee80211, &wrq->u.data);
+-              break;
+-
+-      default:
+-              ret = -EOPNOTSUPP;
+-              break;
+-      }
+-
+-      kfree(ipw);
+-out:
+-      up(&priv->wx_sem);
+-
+-      return ret;
+-}
+-
+-static u8 HwRateToMRate90(bool bIsHT, u8 rate)
+-{
+-      u8  ret_rate = 0x02;
+-
+-      if(!bIsHT) {
+-              switch(rate) {
+-                      case DESC90_RATE1M:   ret_rate = MGN_1M;         break;
+-                      case DESC90_RATE2M:   ret_rate = MGN_2M;         break;
+-                      case DESC90_RATE5_5M: ret_rate = MGN_5_5M;       break;
+-                      case DESC90_RATE11M:  ret_rate = MGN_11M;        break;
+-                      case DESC90_RATE6M:   ret_rate = MGN_6M;         break;
+-                      case DESC90_RATE9M:   ret_rate = MGN_9M;         break;
+-                      case DESC90_RATE12M:  ret_rate = MGN_12M;        break;
+-                      case DESC90_RATE18M:  ret_rate = MGN_18M;        break;
+-                      case DESC90_RATE24M:  ret_rate = MGN_24M;        break;
+-                      case DESC90_RATE36M:  ret_rate = MGN_36M;        break;
+-                      case DESC90_RATE48M:  ret_rate = MGN_48M;        break;
+-                      case DESC90_RATE54M:  ret_rate = MGN_54M;        break;
+-
+-                      default:
+-                                            RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
+-                                            break;
+-              }
+-
+-      } else {
+-              switch(rate) {
+-                      case DESC90_RATEMCS0:   ret_rate = MGN_MCS0;    break;
+-                      case DESC90_RATEMCS1:   ret_rate = MGN_MCS1;    break;
+-                      case DESC90_RATEMCS2:   ret_rate = MGN_MCS2;    break;
+-                      case DESC90_RATEMCS3:   ret_rate = MGN_MCS3;    break;
+-                      case DESC90_RATEMCS4:   ret_rate = MGN_MCS4;    break;
+-                      case DESC90_RATEMCS5:   ret_rate = MGN_MCS5;    break;
+-                      case DESC90_RATEMCS6:   ret_rate = MGN_MCS6;    break;
+-                      case DESC90_RATEMCS7:   ret_rate = MGN_MCS7;    break;
+-                      case DESC90_RATEMCS8:   ret_rate = MGN_MCS8;    break;
+-                      case DESC90_RATEMCS9:   ret_rate = MGN_MCS9;    break;
+-                      case DESC90_RATEMCS10:  ret_rate = MGN_MCS10;   break;
+-                      case DESC90_RATEMCS11:  ret_rate = MGN_MCS11;   break;
+-                      case DESC90_RATEMCS12:  ret_rate = MGN_MCS12;   break;
+-                      case DESC90_RATEMCS13:  ret_rate = MGN_MCS13;   break;
+-                      case DESC90_RATEMCS14:  ret_rate = MGN_MCS14;   break;
+-                      case DESC90_RATEMCS15:  ret_rate = MGN_MCS15;   break;
+-                      case DESC90_RATEMCS32:  ret_rate = (0x80|0x20); break;
+-
+-                      default:
+-                                              RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
+-                                              break;
+-              }
+-      }
+-
+-      return ret_rate;
+-}
+-
+-/* Record the TSF time stamp when receiving a packet */
+-static void UpdateRxPktTimeStamp8190(struct r8192_priv *priv, struct ieee80211_rx_stats *stats)
+-{
+-
+-      if(stats->bIsAMPDU && !stats->bFirstMPDU) {
+-              stats->mac_time[0] = priv->LastRxDescTSFLow;
+-              stats->mac_time[1] = priv->LastRxDescTSFHigh;
+-      } else {
+-              priv->LastRxDescTSFLow = stats->mac_time[0];
+-              priv->LastRxDescTSFHigh = stats->mac_time[1];
+-      }
+-}
+-
+-static long rtl819x_translate_todbm(u8 signal_strength_index)// 0-100 index.
+-{
+-      long    signal_power; // in dBm.
+-
+-      // Translate to dBm (x=0.5y-95).
+-      signal_power = (long)((signal_strength_index + 1) >> 1);
+-      signal_power -= 95;
+-
+-      return signal_power;
+-}
+-
+-/* 2008/01/22 MH We can not delcare RSSI/EVM total value of sliding window to
+-      be a local static. Otherwise, it may increase when we return from S3/S4. The
+-      value will be kept in memory or disk. We must delcare the value in adapter
+-      and it will be reinitialized when return from S3/S4. */
+-static void rtl8192_process_phyinfo(struct r8192_priv * priv, u8* buffer,struct ieee80211_rx_stats * pprevious_stats, struct ieee80211_rx_stats * pcurrent_stats)
+-{
+-      bool bcheck = false;
+-      u8      rfpath;
+-      u32 nspatial_stream, tmp_val;
+-      static u32 slide_rssi_index=0, slide_rssi_statistics=0;
+-      static u32 slide_evm_index=0, slide_evm_statistics=0;
+-      static u32 last_rssi=0, last_evm=0;
+-      //cosa add for beacon rssi smoothing
+-      static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
+-      static u32 last_beacon_adc_pwdb=0;
+-
+-      struct ieee80211_hdr_3addr *hdr;
+-      u16 sc ;
+-      unsigned int frag,seq;
+-      hdr = (struct ieee80211_hdr_3addr *)buffer;
+-      sc = le16_to_cpu(hdr->seq_ctl);
+-      frag = WLAN_GET_SEQ_FRAG(sc);
+-      seq = WLAN_GET_SEQ_SEQ(sc);
+-
+-      //
+-      // Check whether we should take the previous packet into accounting
+-      //
+-      if(!pprevious_stats->bIsAMPDU)
+-      {
+-              // if previous packet is not aggregated packet
+-              bcheck = true;
+-      }
+-
+-      if(slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
+-      {
+-              slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
+-              last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
+-              priv->stats.slide_rssi_total -= last_rssi;
+-      }
+-      priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
+-
+-      priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
+-      if(slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
+-              slide_rssi_index = 0;
+-
+-      // <1> Showed on UI for user, in dbm
+-      tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
+-      priv->stats.signal_strength = rtl819x_translate_todbm((u8)tmp_val);
+-      pcurrent_stats->rssi = priv->stats.signal_strength;
+-      //
+-      // If the previous packet does not match the criteria, neglect it
+-      //
+-      if(!pprevious_stats->bPacketMatchBSSID)
+-      {
+-              if(!pprevious_stats->bToSelfBA)
+-                      return;
+-      }
+-
+-      if(!bcheck)
+-              return;
+-
+-      // <2> Showed on UI for engineering
+-      // hardware does not provide rssi information for each rf path in CCK
+-      if(!pprevious_stats->bIsCCK && pprevious_stats->bPacketToSelf)
+-      {
+-              for (rfpath = RF90_PATH_A; rfpath < RF90_PATH_C; rfpath++)
+-              {
+-                      if (!rtl8192_phy_CheckIsLegalRFPath(priv, rfpath))
+-                              continue;
+-                      RT_TRACE(COMP_DBG, "pPreviousstats->RxMIMOSignalStrength[rfpath] = %d\n", pprevious_stats->RxMIMOSignalStrength[rfpath]);
+-                      //Fixed by Jacken 2008-03-20
+-                      if(priv->stats.rx_rssi_percentage[rfpath] == 0)
+-                      {
+-                              priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
+-                      }
+-                      if(pprevious_stats->RxMIMOSignalStrength[rfpath]  > priv->stats.rx_rssi_percentage[rfpath])
+-                      {
+-                              priv->stats.rx_rssi_percentage[rfpath] =
+-                                      ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
+-                                      (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
+-                              priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath]  + 1;
+-                      }
+-                      else
+-                      {
+-                              priv->stats.rx_rssi_percentage[rfpath] =
+-                                      ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
+-                                      (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
+-                      }
+-                      RT_TRACE(COMP_DBG, "priv->RxStats.RxRSSIPercentage[rfPath] = %d \n" , priv->stats.rx_rssi_percentage[rfpath]);
+-              }
+-      }
+-
+-
+-      //
+-      // Check PWDB.
+-      //
+-      //cosa add for beacon rssi smoothing by average.
+-      if(pprevious_stats->bPacketBeacon)
+-      {
+-              /* record the beacon pwdb to the sliding window. */
+-              if(slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
+-              {
+-                      slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
+-                      last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
+-                      priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
+-                      //      slide_beacon_adc_pwdb_index, last_beacon_adc_pwdb, Adapter->RxStats.Slide_Beacon_Total);
+-              }
+-              priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
+-              priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
+-              slide_beacon_adc_pwdb_index++;
+-              if(slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
+-                      slide_beacon_adc_pwdb_index = 0;
+-              pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
+-              if(pprevious_stats->RxPWDBAll >= 3)
+-                      pprevious_stats->RxPWDBAll -= 3;
+-      }
+-
+-      RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
+-                              pprevious_stats->bIsCCK? "CCK": "OFDM",
+-                              pprevious_stats->RxPWDBAll);
+-
+-      if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
+-      {
+-              if(priv->undecorated_smoothed_pwdb < 0) // initialize
+-              {
+-                      priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
+-              }
+-
+-              if(pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
+-              {
+-                      priv->undecorated_smoothed_pwdb =
+-                                      ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
+-                                      (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
+-                      priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
+-              }
+-              else
+-              {
+-                      priv->undecorated_smoothed_pwdb =
+-                                      ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
+-                                      (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
+-              }
+-      }
+-
+-      //
+-      // Check EVM
+-      //
+-      /* record the general EVM to the sliding window. */
+-      if(pprevious_stats->SignalQuality == 0)
+-      {
+-      }
+-      else
+-      {
+-              if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
+-                      if(slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
+-                              slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
+-                              last_evm = priv->stats.slide_evm[slide_evm_index];
+-                              priv->stats.slide_evm_total -= last_evm;
+-                      }
+-
+-                      priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
+-
+-                      priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
+-                      if(slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
+-                              slide_evm_index = 0;
+-
+-                      // <1> Showed on UI for user, in percentage.
+-                      tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
+-                      //cosa add 10/11/2007, Showed on UI for user in Windows Vista, for Link quality.
+-              }
+-
+-              // <2> Showed on UI for engineering
+-              if(pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
+-              {
+-                      for(nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++) // 2 spatial stream
+-                      {
+-                              if(pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
+-                              {
+-                                      if(priv->stats.rx_evm_percentage[nspatial_stream] == 0) // initialize
+-                                      {
+-                                              priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
+-                                      }
+-                                      priv->stats.rx_evm_percentage[nspatial_stream] =
+-                                              ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
+-                                              (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
+-                              }
+-                      }
+-              }
+-      }
+-
+-}
+-
+-static u8 rtl819x_query_rxpwrpercentage(
+-      char            antpower
+-      )
+-{
+-      if ((antpower <= -100) || (antpower >= 20))
+-      {
+-              return  0;
+-      }
+-      else if (antpower >= 0)
+-      {
+-              return  100;
+-      }
+-      else
+-      {
+-              return  (100+antpower);
+-      }
+-
+-}
+-
+-static u8
+-rtl819x_evm_dbtopercentage(
+-      char value
+-      )
+-{
+-      char ret_val;
+-
+-      ret_val = value;
+-
+-      if(ret_val >= 0)
+-              ret_val = 0;
+-      if(ret_val <= -33)
+-              ret_val = -33;
+-      ret_val = 0 - ret_val;
+-      ret_val*=3;
+-      if(ret_val == 99)
+-              ret_val = 100;
+-      return ret_val;
+-}
+-
+-/* We want good-looking for signal strength/quality */
+-static long rtl819x_signal_scale_mapping(long currsig)
+-{
+-      long retsig;
+-
+-      // Step 1. Scale mapping.
+-      if(currsig >= 61 && currsig <= 100)
+-      {
+-              retsig = 90 + ((currsig - 60) / 4);
+-      }
+-      else if(currsig >= 41 && currsig <= 60)
+-      {
+-              retsig = 78 + ((currsig - 40) / 2);
+-      }
+-      else if(currsig >= 31 && currsig <= 40)
+-      {
+-              retsig = 66 + (currsig - 30);
+-      }
+-      else if(currsig >= 21 && currsig <= 30)
+-      {
+-              retsig = 54 + (currsig - 20);
+-      }
+-      else if(currsig >= 5 && currsig <= 20)
+-      {
+-              retsig = 42 + (((currsig - 5) * 2) / 3);
+-      }
+-      else if(currsig == 4)
+-      {
+-              retsig = 36;
+-      }
+-      else if(currsig == 3)
+-      {
+-              retsig = 27;
+-      }
+-      else if(currsig == 2)
+-      {
+-              retsig = 18;
+-      }
+-      else if(currsig == 1)
+-      {
+-              retsig = 9;
+-      }
+-      else
+-      {
+-              retsig = currsig;
+-      }
+-
+-      return retsig;
+-}
+-
+-static void rtl8192_query_rxphystatus(
+-      struct r8192_priv * priv,
+-      struct ieee80211_rx_stats * pstats,
+-      prx_desc_819x_pci  pdesc,
+-      prx_fwinfo_819x_pci   pdrvinfo,
+-      struct ieee80211_rx_stats * precord_stats,
+-      bool bpacket_match_bssid,
+-      bool bpacket_toself,
+-      bool bPacketBeacon,
+-      bool bToSelfBA
+-      )
+-{
+-      //PRT_RFD_STATUS                pRtRfdStatus = &(pRfd->Status);
+-      phy_sts_ofdm_819xpci_t* pofdm_buf;
+-      phy_sts_cck_819xpci_t   *       pcck_buf;
+-      phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
+-      u8                              *prxpkt;
+-      u8                              i,max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
+-      char                            rx_pwr[4], rx_pwr_all=0;
+-      //long                          rx_avg_pwr = 0;
+-      char                            rx_snrX, rx_evmX;
+-      u8                              evm, pwdb_all;
+-      u32                     RSSI, total_rssi=0;//, total_evm=0;
+-//    long                            signal_strength_index = 0;
+-      u8                              is_cck_rate=0;
+-      u8                              rf_rx_num = 0;
+-
+-      is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
+-
+-      // Record it for next packet processing
+-      memset(precord_stats, 0, sizeof(struct ieee80211_rx_stats));
+-      pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
+-      pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
+-      pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;//RX_HAL_IS_CCK_RATE(pDrvInfo);
+-      pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
+-      pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
+-      /*2007.08.30 requested by SD3 Jerry */
+-      if (priv->phy_check_reg824 == 0)
+-      {
+-              priv->phy_reg824_bit9 = rtl8192_QueryBBReg(priv, rFPGA0_XA_HSSIParameter2, 0x200);
+-              priv->phy_check_reg824 = 1;
+-      }
+-
+-
+-      prxpkt = (u8*)pdrvinfo;
+-
+-      /* Move pointer to the 16th bytes. Phy status start address. */
+-      prxpkt += sizeof(rx_fwinfo_819x_pci);
+-
+-      /* Initial the cck and ofdm buffer pointer */
+-      pcck_buf = (phy_sts_cck_819xpci_t *)prxpkt;
+-      pofdm_buf = (phy_sts_ofdm_819xpci_t *)prxpkt;
+-
+-      pstats->RxMIMOSignalQuality[0] = -1;
+-      pstats->RxMIMOSignalQuality[1] = -1;
+-      precord_stats->RxMIMOSignalQuality[0] = -1;
+-      precord_stats->RxMIMOSignalQuality[1] = -1;
+-
+-      if(is_cck_rate)
+-      {
+-              //
+-              // (1)Hardware does not provide RSSI for CCK
+-              //
+-
+-              //
+-              // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
+-              //
+-              u8 report;//, cck_agc_rpt;
+-
+-              if (!priv->phy_reg824_bit9)
+-              {
+-                      report = pcck_buf->cck_agc_rpt & 0xc0;
+-                      report = report>>6;
+-                      switch(report)
+-                      {
+-                              //Fixed by Jacken from Bryant 2008-03-20
+-                              //Original value is -38 , -26 , -14 , -2
+-                              //Fixed value is -35 , -23 , -11 , 6
+-                              case 0x3:
+-                                      rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
+-                                      break;
+-                              case 0x2:
+-                                      rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
+-                                      break;
+-                              case 0x1:
+-                                      rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
+-                                      break;
+-                              case 0x0:
+-                                      rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);
+-                                      break;
+-                      }
+-              }
+-              else
+-              {
+-                      report = pcck_buf->cck_agc_rpt & 0x60;
+-                      report = report>>5;
+-                      switch(report)
+-                      {
+-                              case 0x3:
+-                                      rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+-                                      break;
+-                              case 0x2:
+-                                      rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
+-                                      break;
+-                              case 0x1:
+-                                      rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+-                                      break;
+-                              case 0x0:
+-                                      rx_pwr_all = -8 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+-                                      break;
+-                      }
+-              }
+-
+-              pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
+-              pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
+-              pstats->RecvSignalPower = rx_pwr_all;
+-
+-              //
+-              // (3) Get Signal Quality (EVM)
+-              //
+-              if(bpacket_match_bssid)
+-              {
+-                      u8      sq;
+-
+-                      if(pstats->RxPWDBAll > 40)
+-                      {
+-                              sq = 100;
+-                      }else
+-                      {
+-                              sq = pcck_buf->sq_rpt;
+-
+-                              if(pcck_buf->sq_rpt > 64)
+-                                      sq = 0;
+-                              else if (pcck_buf->sq_rpt < 20)
+-                                      sq = 100;
+-                              else
+-                                      sq = ((64-sq) * 100) / 44;
+-                      }
+-                      pstats->SignalQuality = precord_stats->SignalQuality = sq;
+-                      pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
+-                      pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
+-              }
+-      }
+-      else
+-      {
+-              //
+-              // (1)Get RSSI for HT rate
+-              //
+-              for(i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+-              {
+-                      // 2008/01/30 MH we will judge RF RX path now.
+-                      if (priv->brfpath_rxenable[i])
+-                              rf_rx_num++;
+-                      //else
+-                              //continue;
+-
+-                      //Fixed by Jacken from Bryant 2008-03-20
+-                      //Original value is 106
+-                      rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 110;
+-
+-                      //Get Rx snr value in DB
+-                      tmp_rxsnr = pofdm_buf->rxsnr_X[i];
+-                      rx_snrX = (char)(tmp_rxsnr);
+-                      rx_snrX /= 2;
+-
+-                      /* Translate DBM to percentage. */
+-                      RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
+-                      if (priv->brfpath_rxenable[i])
+-                              total_rssi += RSSI;
+-
+-                      /* Record Signal Strength for next packet */
+-                      if(bpacket_match_bssid)
+-                      {
+-                              pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
+-                              precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
+-                      }
+-              }
+-
+-
+-              //
+-              // (2)PWDB, Average PWDB cacluated by hardware (for rate adaptive)
+-              //
+-              //Fixed by Jacken from Bryant 2008-03-20
+-              //Original value is 106
+-              rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
+-              pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
+-
+-              pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
+-              pstats->RxPower = precord_stats->RxPower =      rx_pwr_all;
+-              pstats->RecvSignalPower = rx_pwr_all;
+-              //
+-              // (3)EVM of HT rate
+-              //
+-              if(pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
+-                      pdrvinfo->RxRate<=DESC90_RATEMCS15)
+-                      max_spatial_stream = 2; //both spatial stream make sense
+-              else
+-                      max_spatial_stream = 1; //only spatial stream 1 makes sense
+-
+-              for(i=0; i<max_spatial_stream; i++)
+-              {
+-                      tmp_rxevm = pofdm_buf->rxevm_X[i];
+-                      rx_evmX = (char)(tmp_rxevm);
+-
+-                      // Do not use shift operation like "rx_evmX >>= 1" because the compilor of free build environment
+-                      // fill most significant bit to "zero" when doing shifting operation which may change a negative
+-                      // value to positive one, then the dbm value (which is supposed to be negative)  is not correct anymore.
+-                      rx_evmX /= 2;   //dbm
+-
+-                      evm = rtl819x_evm_dbtopercentage(rx_evmX);
+-                      if(bpacket_match_bssid)
+-                      {
+-                              if(i==0) // Fill value in RFD, Get the first spatial stream only
+-                                      pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
+-                              pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
+-                      }
+-              }
+-
+-
+-              /* record rx statistics for debug */
+-              rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
+-              prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
+-      }
+-
+-      //UI BSS List signal strength(in percentage), make it good looking, from 0~100.
+-      //It is assigned to the BSS List in GetValueFromBeaconOrProbeRsp().
+-      if(is_cck_rate)
+-      {
+-              pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)pwdb_all));//PWDB_ALL;
+-
+-      }
+-      else
+-      {
+-              //pRfd->Status.SignalStrength = pRecordRfd->Status.SignalStrength = (u1Byte)(SignalScaleMapping(total_rssi/=RF90_PATH_MAX));//(u1Byte)(total_rssi/=RF90_PATH_MAX);
+-              // We can judge RX path number now.
+-              if (rf_rx_num != 0)
+-                      pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl819x_signal_scale_mapping((long)(total_rssi/=rf_rx_num)));
+-      }
+-}
+-
+-static void
+-rtl8192_record_rxdesc_forlateruse(
+-      struct ieee80211_rx_stats * psrc_stats,
+-      struct ieee80211_rx_stats * ptarget_stats
+-)
+-{
+-      ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
+-      ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
+-}
+-
+-
+-
+-static void TranslateRxSignalStuff819xpci(struct r8192_priv *priv,
+-        struct sk_buff *skb,
+-        struct ieee80211_rx_stats * pstats,
+-        prx_desc_819x_pci pdesc,
+-        prx_fwinfo_819x_pci pdrvinfo)
+-{
+-    // TODO: We must only check packet for current MAC address. Not finish
+-    bool bpacket_match_bssid, bpacket_toself;
+-    bool bPacketBeacon=false, bToSelfBA=false;
+-    struct ieee80211_hdr_3addr *hdr;
+-    u16 fc,type;
+-
+-    // Get Signal Quality for only RX data queue (but not command queue)
+-
+-    u8* tmp_buf;
+-    u8        *praddr;
+-
+-    /* Get MAC frame start address. */
+-    tmp_buf = skb->data;
+-
+-    hdr = (struct ieee80211_hdr_3addr *)tmp_buf;
+-    fc = le16_to_cpu(hdr->frame_ctl);
+-    type = WLAN_FC_GET_TYPE(fc);
+-    praddr = hdr->addr1;
+-
+-    /* Check if the received packet is acceptabe. */
+-    bpacket_match_bssid = ((IEEE80211_FTYPE_CTL != type) &&
+-            (!compare_ether_addr(priv->ieee80211->current_network.bssid,      (fc & IEEE80211_FCTL_TODS)? hdr->addr1 : (fc & IEEE80211_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
+-            && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
+-    bpacket_toself =  bpacket_match_bssid & (!compare_ether_addr(praddr, priv->ieee80211->dev->dev_addr));
+-
+-    if(WLAN_FC_GET_FRAMETYPE(fc)== IEEE80211_STYPE_BEACON)
+-    {
+-        bPacketBeacon = true;
+-    }
+-    if(WLAN_FC_GET_FRAMETYPE(fc) == IEEE80211_STYPE_BLOCKACK)
+-    {
+-        if (!compare_ether_addr(praddr, priv->ieee80211->dev->dev_addr))
+-            bToSelfBA = true;
+-    }
+-
+-    //
+-    // Process PHY information for previous packet (RSSI/PWDB/EVM)
+-    //
+-    // Because phy information is contained in the last packet of AMPDU only, so driver
+-    // should process phy information of previous packet
+-    rtl8192_process_phyinfo(priv, tmp_buf, &priv->previous_stats, pstats);
+-    rtl8192_query_rxphystatus(priv, pstats, pdesc, pdrvinfo, &priv->previous_stats, bpacket_match_bssid,
+-            bpacket_toself ,bPacketBeacon, bToSelfBA);
+-    rtl8192_record_rxdesc_forlateruse(pstats, &priv->previous_stats);
+-
+-}
+-
+-
+-static void rtl8192_tx_resume(struct r8192_priv *priv)
+-{
+-      struct ieee80211_device *ieee = priv->ieee80211;
+-      struct sk_buff *skb;
+-      int i;
+-
+-      for (i = BK_QUEUE; i < TXCMD_QUEUE; i++) {
+-              while ((!skb_queue_empty(&ieee->skb_waitQ[i])) &&
+-                     (priv->ieee80211->check_nic_enough_desc(ieee, i) > 0)) {
+-                      /* 1. dequeue the packet from the wait queue */
+-                      skb = skb_dequeue(&ieee->skb_waitQ[i]);
+-                      /* 2. tx the packet directly */
+-                      ieee->softmac_data_hard_start_xmit(skb, ieee, 0);
+-              }
+-      }
+-}
+-
+-static void rtl8192_irq_tx_tasklet(unsigned long arg)
+-{
+-      struct r8192_priv *priv = (struct r8192_priv*) arg;
+-      struct rtl8192_tx_ring *mgnt_ring = &priv->tx_ring[MGNT_QUEUE];
+-      unsigned long flags;
+-
+-      /* check if we need to report that the management queue is drained */
+-      spin_lock_irqsave(&priv->irq_th_lock, flags);
+-
+-      if (!skb_queue_len(&mgnt_ring->queue) &&
+-          priv->ieee80211->ack_tx_to_ieee &&
+-          rtl8192_is_tx_queue_empty(priv->ieee80211)) {
+-              priv->ieee80211->ack_tx_to_ieee = 0;
+-              ieee80211_ps_tx_ack(priv->ieee80211, 1);
+-      }
+-
+-      spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+-
+-      rtl8192_tx_resume(priv);
+-}
+-
+-/* Record the received data rate */
+-static void UpdateReceivedRateHistogramStatistics8190(
+-      struct r8192_priv *priv,
+-      struct ieee80211_rx_stats* pstats
+-      )
+-{
+-      u32 rcvType=1;   //0: Total, 1:OK, 2:CRC, 3:ICV
+-      u32 rateIndex;
+-      u32 preamble_guardinterval;  //1: short preamble/GI, 0: long preamble/GI
+-
+-      if(pstats->bCRC)
+-              rcvType = 2;
+-      else if(pstats->bICV)
+-              rcvType = 3;
+-
+-      if(pstats->bShortPreamble)
+-              preamble_guardinterval = 1;// short
+-      else
+-              preamble_guardinterval = 0;// long
+-
+-      switch(pstats->rate)
+-      {
+-              //
+-              // CCK rate
+-              //
+-              case MGN_1M:    rateIndex = 0;  break;
+-              case MGN_2M:    rateIndex = 1;  break;
+-              case MGN_5_5M:  rateIndex = 2;  break;
+-              case MGN_11M:   rateIndex = 3;  break;
+-              //
+-              // Legacy OFDM rate
+-              //
+-              case MGN_6M:    rateIndex = 4;  break;
+-              case MGN_9M:    rateIndex = 5;  break;
+-              case MGN_12M:   rateIndex = 6;  break;
+-              case MGN_18M:   rateIndex = 7;  break;
+-              case MGN_24M:   rateIndex = 8;  break;
+-              case MGN_36M:   rateIndex = 9;  break;
+-              case MGN_48M:   rateIndex = 10; break;
+-              case MGN_54M:   rateIndex = 11; break;
+-              //
+-              // 11n High throughput rate
+-              //
+-              case MGN_MCS0:  rateIndex = 12; break;
+-              case MGN_MCS1:  rateIndex = 13; break;
+-              case MGN_MCS2:  rateIndex = 14; break;
+-              case MGN_MCS3:  rateIndex = 15; break;
+-              case MGN_MCS4:  rateIndex = 16; break;
+-              case MGN_MCS5:  rateIndex = 17; break;
+-              case MGN_MCS6:  rateIndex = 18; break;
+-              case MGN_MCS7:  rateIndex = 19; break;
+-              case MGN_MCS8:  rateIndex = 20; break;
+-              case MGN_MCS9:  rateIndex = 21; break;
+-              case MGN_MCS10: rateIndex = 22; break;
+-              case MGN_MCS11: rateIndex = 23; break;
+-              case MGN_MCS12: rateIndex = 24; break;
+-              case MGN_MCS13: rateIndex = 25; break;
+-              case MGN_MCS14: rateIndex = 26; break;
+-              case MGN_MCS15: rateIndex = 27; break;
+-              default:        rateIndex = 28; break;
+-      }
+-      priv->stats.received_rate_histogram[0][rateIndex]++; //total
+-      priv->stats.received_rate_histogram[rcvType][rateIndex]++;
+-}
+-
+-static void rtl8192_rx(struct r8192_priv *priv)
+-{
+-    struct ieee80211_hdr_1addr *ieee80211_hdr = NULL;
+-    bool unicast_packet = false;
+-    struct ieee80211_rx_stats stats = {
+-        .signal = 0,
+-        .noise = -98,
+-        .rate = 0,
+-        .freq = IEEE80211_24GHZ_BAND,
+-    };
+-    unsigned int count = priv->rxringcount;
+-    prx_fwinfo_819x_pci pDrvInfo = NULL;
+-    struct sk_buff *new_skb;
+-
+-    while (count--) {
+-        rx_desc_819x_pci *pdesc = &priv->rx_ring[priv->rx_idx];//rx descriptor
+-        struct sk_buff *skb = priv->rx_buf[priv->rx_idx];//rx pkt
+-
+-        if (pdesc->OWN)
+-            /* wait data to be filled by hardware */
+-            return;
+-
+-            stats.bICV = pdesc->ICV;
+-            stats.bCRC = pdesc->CRC32;
+-            stats.bHwError = pdesc->CRC32 | pdesc->ICV;
+-
+-            stats.Length = pdesc->Length;
+-            if(stats.Length < 24)
+-                stats.bHwError |= 1;
+-
+-            if(stats.bHwError) {
+-                stats.bShift = false;
+-                goto done;
+-            }
+-                pDrvInfo = NULL;
+-                new_skb = dev_alloc_skb(priv->rxbuffersize);
+-
+-                if (unlikely(!new_skb))
+-                    goto done;
+-
+-                stats.RxDrvInfoSize = pdesc->RxDrvInfoSize;
+-                stats.RxBufShift = ((pdesc->Shift)&0x03);
+-                stats.Decrypted = !pdesc->SWDec;
+-
+-                pci_dma_sync_single_for_cpu(priv->pdev,
+-                     *((dma_addr_t *)skb->cb),
+-                     priv->rxbuffersize,
+-                     PCI_DMA_FROMDEVICE);
+-                skb_put(skb, pdesc->Length);
+-                pDrvInfo = (rx_fwinfo_819x_pci *)(skb->data + stats.RxBufShift);
+-                skb_reserve(skb, stats.RxDrvInfoSize + stats.RxBufShift);
+-
+-                stats.rate = HwRateToMRate90((bool)pDrvInfo->RxHT, (u8)pDrvInfo->RxRate);
+-                stats.bShortPreamble = pDrvInfo->SPLCP;
+-
+-                /* it is debug only. It should be disabled in released driver.
+-                 * 2007.1.11 by Emily
+-                 * */
+-                UpdateReceivedRateHistogramStatistics8190(priv, &stats);
+-
+-                stats.bIsAMPDU = (pDrvInfo->PartAggr==1);
+-                stats.bFirstMPDU = (pDrvInfo->PartAggr==1) && (pDrvInfo->FirstAGGR==1);
+-
+-                stats.TimeStampLow = pDrvInfo->TSFL;
+-                stats.TimeStampHigh = read_nic_dword(priv, TSFR+4);
+-
+-                UpdateRxPktTimeStamp8190(priv, &stats);
+-
+-                //
+-                // Get Total offset of MPDU Frame Body
+-                //
+-                if((stats.RxBufShift + stats.RxDrvInfoSize) > 0)
+-                    stats.bShift = 1;
+-
+-                /* ???? */
+-                TranslateRxSignalStuff819xpci(priv, skb, &stats, pdesc, pDrvInfo);
+-
+-                /* Rx A-MPDU */
+-                if(pDrvInfo->FirstAGGR==1 || pDrvInfo->PartAggr == 1)
+-                    RT_TRACE(COMP_RXDESC, "pDrvInfo->FirstAGGR = %d, pDrvInfo->PartAggr = %d\n",
+-                            pDrvInfo->FirstAGGR, pDrvInfo->PartAggr);
+-                 skb_trim(skb, skb->len - 4/*sCrcLng*/);
+-                /* rx packets statistics */
+-                ieee80211_hdr = (struct ieee80211_hdr_1addr *)skb->data;
+-                unicast_packet = false;
+-
+-                if(is_broadcast_ether_addr(ieee80211_hdr->addr1)) {
+-                    //TODO
+-                }else if(is_multicast_ether_addr(ieee80211_hdr->addr1)){
+-                    //TODO
+-                }else {
+-                    /* unicast packet */
+-                    unicast_packet = true;
+-                }
+-
+-                if(!ieee80211_rtl_rx(priv->ieee80211, skb, &stats)){
+-                    dev_kfree_skb_any(skb);
+-                } else {
+-                    priv->stats.rxok++;
+-                    if(unicast_packet) {
+-                        priv->stats.rxbytesunicast += skb->len;
+-                    }
+-                }
+-
+-              pci_unmap_single(priv->pdev, *((dma_addr_t *) skb->cb),
+-                      priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+-
+-                skb = new_skb;
+-                priv->rx_buf[priv->rx_idx] = skb;
+-                *((dma_addr_t *) skb->cb) = pci_map_single(priv->pdev, skb_tail_pointer(skb), priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+-
+-done:
+-        pdesc->BufferAddress = cpu_to_le32(*((dma_addr_t *)skb->cb));
+-        pdesc->OWN = 1;
+-        pdesc->Length = priv->rxbuffersize;
+-        if (priv->rx_idx == priv->rxringcount-1)
+-            pdesc->EOR = 1;
+-        priv->rx_idx = (priv->rx_idx + 1) % priv->rxringcount;
+-    }
+-
+-}
+-
+-static void rtl8192_irq_rx_tasklet(unsigned long arg)
+-{
+-      struct r8192_priv *priv = (struct r8192_priv*) arg;
+-      rtl8192_rx(priv);
+-      /* unmask RDU */
+-       write_nic_dword(priv, INTA_MASK, read_nic_dword(priv, INTA_MASK) | IMR_RDU);
+-}
+-
+-static const struct net_device_ops rtl8192_netdev_ops = {
+-      .ndo_open =                     rtl8192_open,
+-      .ndo_stop =                     rtl8192_close,
+-      .ndo_tx_timeout =               tx_timeout,
+-      .ndo_do_ioctl =                 rtl8192_ioctl,
+-      .ndo_set_multicast_list =       r8192_set_multicast,
+-      .ndo_set_mac_address =          r8192_set_mac_adr,
+-      .ndo_start_xmit =               ieee80211_rtl_xmit,
+-};
+-
+-static int __devinit rtl8192_pci_probe(struct pci_dev *pdev,
+-                       const struct pci_device_id *id)
+-{
+-      struct net_device *dev = NULL;
+-      struct r8192_priv *priv= NULL;
+-      u8 unit = 0;
+-      int ret = -ENODEV;
+-      unsigned long pmem_start, pmem_len, pmem_flags;
+-
+-      RT_TRACE(COMP_INIT,"Configuring chip resources\n");
+-
+-      if( pci_enable_device (pdev) ){
+-              RT_TRACE(COMP_ERR,"Failed to enable PCI device");
+-              return -EIO;
+-      }
+-
+-      pci_set_master(pdev);
+-      //pci_set_wmi(pdev);
+-      pci_set_dma_mask(pdev, 0xffffff00ULL);
+-      pci_set_consistent_dma_mask(pdev,0xffffff00ULL);
+-      dev = alloc_ieee80211(sizeof(struct r8192_priv));
+-      if (!dev) {
+-              ret = -ENOMEM;
+-              goto fail_free;
+-      }
+-
+-      pci_set_drvdata(pdev, dev);
+-      SET_NETDEV_DEV(dev, &pdev->dev);
+-      priv = ieee80211_priv(dev);
+-      priv->ieee80211 = netdev_priv(dev);
+-      priv->pdev=pdev;
+-      if((pdev->subsystem_vendor == PCI_VENDOR_ID_DLINK)&&(pdev->subsystem_device == 0x3304)){
+-              priv->ieee80211->bSupportRemoteWakeUp = 1;
+-      } else
+-      {
+-              priv->ieee80211->bSupportRemoteWakeUp = 0;
+-      }
+-
+-      pmem_start = pci_resource_start(pdev, 1);
+-      pmem_len = pci_resource_len(pdev, 1);
+-      pmem_flags = pci_resource_flags (pdev, 1);
+-
+-      if (!(pmem_flags & IORESOURCE_MEM)) {
+-              RT_TRACE(COMP_ERR, "region #1 not a MMIO resource, aborting\n");
+-              goto fail;
+-      }
+-
+-      //DMESG("Memory mapped space @ 0x%08lx ", pmem_start);
+-      if( ! request_mem_region(pmem_start, pmem_len, RTL819xE_MODULE_NAME)) {
+-              RT_TRACE(COMP_ERR,"request_mem_region failed!\n");
+-              goto fail;
+-      }
+-
+-      priv->mem_start = ioremap_nocache(pmem_start, pmem_len);
+-      if (!priv->mem_start) {
+-              RT_TRACE(COMP_ERR,"ioremap failed!\n");
+-              goto fail1;
+-      }
+-
+-      dev->mem_start = (unsigned long) priv->mem_start;
+-      dev->mem_end = (unsigned long) (priv->mem_start +
+-                                      pci_resource_len(pdev, 0));
+-
+-        /* We disable the RETRY_TIMEOUT register (0x41) to keep
+-         * PCI Tx retries from interfering with C3 CPU state */
+-         pci_write_config_byte(pdev, 0x41, 0x00);
+-
+-
+-      pci_read_config_byte(pdev, 0x05, &unit);
+-      pci_write_config_byte(pdev, 0x05, unit & (~0x04));
+-
+-      dev->irq = pdev->irq;
+-      priv->irq = 0;
+-
+-      dev->netdev_ops = &rtl8192_netdev_ops;
+-
+-      dev->wireless_handlers = &r8192_wx_handlers_def;
+-      dev->type=ARPHRD_ETHER;
+-
+-      dev->watchdog_timeo = HZ*3;
+-
+-      if (dev_alloc_name(dev, ifname) < 0){
+-                RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
+-              strcpy(ifname, "wlan%d");
+-              dev_alloc_name(dev, ifname);
+-        }
+-
+-      RT_TRACE(COMP_INIT, "Driver probe completed1\n");
+-      if (rtl8192_init(priv)!=0) {
+-              RT_TRACE(COMP_ERR, "Initialization failed\n");
+-              goto fail;
+-      }
+-
+-      register_netdev(dev);
+-      RT_TRACE(COMP_INIT, "dev name=======> %s\n",dev->name);
+-      rtl8192_proc_init_one(priv);
+-
+-
+-      RT_TRACE(COMP_INIT, "Driver probe completed\n");
+-      return 0;
+-
+-fail1:
+-
+-      if (priv->mem_start) {
+-              iounmap(priv->mem_start);
+-              release_mem_region( pci_resource_start(pdev, 1),
+-                                  pci_resource_len(pdev, 1) );
+-      }
+-
+-fail:
+-      if(dev){
+-
+-              if (priv->irq) {
+-                      free_irq(priv->irq, priv);
+-                      priv->irq = 0;
+-              }
+-              free_ieee80211(dev);
+-      }
+-
+-fail_free:
+-      pci_disable_device(pdev);
+-
+-      DMESG("wlan driver load failed\n");
+-      pci_set_drvdata(pdev, NULL);
+-      return ret;
+-
+-}
+-
+-/* detach all the work and timer structure declared or inititialized
+- * in r8192_init function.
+- * */
+-static void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
+-{
+-      /* call cancel_work_sync instead of cancel_delayed_work if and only if Linux_version_code
+-         * is  or is newer than 2.6.20 and work structure is defined to be struct work_struct.
+-         * Otherwise call cancel_delayed_work is enough.
+-         * FIXME (2.6.20 should 2.6.22, work_struct should not cancel)
+-         * */
+-      cancel_delayed_work(&priv->watch_dog_wq);
+-      cancel_delayed_work(&priv->update_beacon_wq);
+-      cancel_delayed_work(&priv->ieee80211->hw_wakeup_wq);
+-      cancel_delayed_work(&priv->gpio_change_rf_wq);
+-      cancel_work_sync(&priv->reset_wq);
+-      cancel_work_sync(&priv->qos_activate);
+-}
+-
+-
+-static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev)
+-{
+-      struct net_device *dev = pci_get_drvdata(pdev);
+-      struct r8192_priv *priv ;
+-      u32 i;
+-
+-      if (dev) {
+-
+-              unregister_netdev(dev);
+-
+-              priv = ieee80211_priv(dev);
+-
+-              rtl8192_proc_remove_one(priv);
+-
+-              rtl8192_down(dev);
+-              if (priv->pFirmware)
+-              {
+-                      vfree(priv->pFirmware);
+-                      priv->pFirmware = NULL;
+-              }
+-              destroy_workqueue(priv->priv_wq);
+-
+-              /* free tx/rx rings */
+-              rtl8192_free_rx_ring(priv);
+-              for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+-                      rtl8192_free_tx_ring(priv, i);
+-
+-              if (priv->irq) {
+-                      printk("Freeing irq %d\n", priv->irq);
+-                      free_irq(priv->irq, priv);
+-                      priv->irq = 0;
+-              }
+-
+-              if (priv->mem_start) {
+-                      iounmap(priv->mem_start);
+-                      release_mem_region( pci_resource_start(pdev, 1),
+-                                          pci_resource_len(pdev, 1) );
+-              }
+-
+-              free_ieee80211(dev);
+-      }
+-
+-      pci_disable_device(pdev);
+-      RT_TRACE(COMP_DOWN, "wlan driver removed\n");
+-}
+-
+-extern int ieee80211_rtl_init(void);
+-extern void ieee80211_rtl_exit(void);
+-
+-static int __init rtl8192_pci_module_init(void)
+-{
+-      int retval;
+-
+-      retval = ieee80211_rtl_init();
+-      if (retval)
+-              return retval;
+-
+-      printk(KERN_INFO "\nLinux kernel driver for RTL8192 based WLAN cards\n");
+-      printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan\n");
+-      RT_TRACE(COMP_INIT, "Initializing module\n");
+-      rtl8192_proc_module_init();
+-      if(0!=pci_register_driver(&rtl8192_pci_driver))
+-      {
+-              DMESG("No device found");
+-              /*pci_unregister_driver (&rtl8192_pci_driver);*/
+-              return -ENODEV;
+-      }
+-      return 0;
+-}
+-
+-
+-static void __exit rtl8192_pci_module_exit(void)
+-{
+-      pci_unregister_driver(&rtl8192_pci_driver);
+-
+-      RT_TRACE(COMP_DOWN, "Exiting\n");
+-      rtl8192_proc_module_remove();
+-      ieee80211_rtl_exit();
+-}
+-
+-static irqreturn_t rtl8192_interrupt(int irq, void *param)
+-{
+-      struct r8192_priv *priv = param;
+-      struct net_device *dev = priv->ieee80211->dev;
+-      unsigned long flags;
+-      u32 inta;
+-      irqreturn_t ret = IRQ_HANDLED;
+-
+-      spin_lock_irqsave(&priv->irq_th_lock, flags);
+-
+-      /* ISR: 4bytes */
+-
+-      inta = read_nic_dword(priv, ISR); /* & priv->IntrMask; */
+-      write_nic_dword(priv, ISR, inta); /* reset int situation */
+-
+-      if (!inta) {
+-              /*
+-               * most probably we can safely return IRQ_NONE,
+-               * but for now is better to avoid problems
+-               */
+-              goto out_unlock;
+-      }
+-
+-      if (inta == 0xffff) {
+-              /* HW disappared */
+-              goto out_unlock;
+-      }
+-
+-      if (!netif_running(dev))
+-              goto out_unlock;
+-
+-      if (inta & IMR_TBDOK) {
+-              RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+-              rtl8192_tx_isr(priv, BEACON_QUEUE);
+-              priv->stats.txbeaconokint++;
+-      }
+-
+-      if (inta & IMR_TBDER) {
+-              RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+-              rtl8192_tx_isr(priv, BEACON_QUEUE);
+-              priv->stats.txbeaconerr++;
+-      }
+-
+-      if (inta & IMR_MGNTDOK ) {
+-              RT_TRACE(COMP_INTR, "Manage ok interrupt!\n");
+-              priv->stats.txmanageokint++;
+-              rtl8192_tx_isr(priv, MGNT_QUEUE);
+-      }
+-
+-      if (inta & IMR_COMDOK)
+-      {
+-              priv->stats.txcmdpktokint++;
+-              rtl8192_tx_isr(priv, TXCMD_QUEUE);
+-      }
+-
+-      if (inta & IMR_ROK) {
+-              priv->stats.rxint++;
+-              tasklet_schedule(&priv->irq_rx_tasklet);
+-      }
+-
+-      if (inta & IMR_BcnInt) {
+-              RT_TRACE(COMP_INTR, "prepare beacon for interrupt!\n");
+-              tasklet_schedule(&priv->irq_prepare_beacon_tasklet);
+-      }
+-
+-      if (inta & IMR_RDU) {
+-              RT_TRACE(COMP_INTR, "rx descriptor unavailable!\n");
+-              priv->stats.rxrdu++;
+-              /* reset int situation */
+-              write_nic_dword(priv, INTA_MASK, read_nic_dword(priv, INTA_MASK) & ~IMR_RDU);
+-              tasklet_schedule(&priv->irq_rx_tasklet);
+-      }
+-
+-      if (inta & IMR_RXFOVW) {
+-              RT_TRACE(COMP_INTR, "rx overflow !\n");
+-              priv->stats.rxoverflow++;
+-              tasklet_schedule(&priv->irq_rx_tasklet);
+-      }
+-
+-      if (inta & IMR_TXFOVW)
+-              priv->stats.txoverflow++;
+-
+-      if (inta & IMR_BKDOK) {
+-              RT_TRACE(COMP_INTR, "BK Tx OK interrupt!\n");
+-              priv->stats.txbkokint++;
+-              priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+-              rtl8192_tx_isr(priv, BK_QUEUE);
+-      }
+-
+-      if (inta & IMR_BEDOK) {
+-              RT_TRACE(COMP_INTR, "BE TX OK interrupt!\n");
+-              priv->stats.txbeokint++;
+-              priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+-              rtl8192_tx_isr(priv, BE_QUEUE);
+-      }
+-
+-      if (inta & IMR_VIDOK) {
+-              RT_TRACE(COMP_INTR, "VI TX OK interrupt!\n");
+-              priv->stats.txviokint++;
+-              priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+-              rtl8192_tx_isr(priv, VI_QUEUE);
+-      }
+-
+-      if (inta & IMR_VODOK) {
+-              priv->stats.txvookint++;
+-              priv->ieee80211->LinkDetectInfo.NumTxOkInPeriod++;
+-              rtl8192_tx_isr(priv, VO_QUEUE);
+-      }
+-
+-out_unlock:
+-      spin_unlock_irqrestore(&priv->irq_th_lock, flags);
+-
+-      return ret;
+-}
+-
+-void EnableHWSecurityConfig8192(struct r8192_priv *priv)
+-{
+-        u8 SECR_value = 0x0;
+-      struct ieee80211_device* ieee = priv->ieee80211;
+-
+-      SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
+-
+-      if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->ieee80211->auth_mode != 2))
+-      {
+-              SECR_value |= SCR_RxUseDK;
+-              SECR_value |= SCR_TxUseDK;
+-      }
+-      else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
+-      {
+-              SECR_value |= SCR_RxUseDK;
+-              SECR_value |= SCR_TxUseDK;
+-      }
+-
+-        //add HWSec active enable here.
+-//default using hwsec. when peer AP is in N mode only and pairwise_key_type is none_aes(which HT_IOT_ACT_PURE_N_MODE indicates it), use software security. when peer AP is in b,g,n mode mixed and pairwise_key_type is none_aes, use g mode hw security. WB on 2008.7.4
+-      ieee->hwsec_active = 1;
+-
+-      if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep)//!ieee->hwsec_support) //add hwsec_support flag to totol control hw_sec on/off
+-      {
+-              ieee->hwsec_active = 0;
+-              SECR_value &= ~SCR_RxDecEnable;
+-      }
+-
+-      RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __FUNCTION__,
+-                      ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
+-      {
+-                write_nic_byte(priv, SECR,  SECR_value);//SECR_value |  SCR_UseDK );
+-        }
+-
+-}
+-#define TOTAL_CAM_ENTRY 32
+-//#define CAM_CONTENT_COUNT 8
+-void setKey(struct r8192_priv *priv, u8 EntryNo, u8 KeyIndex, u16 KeyType,
+-          const u8 *MacAddr, u8 DefaultKey, u32 *KeyContent)
+-{
+-      u32 TargetCommand = 0;
+-      u32 TargetContent = 0;
+-      u16 usConfig = 0;
+-      u8 i;
+-#ifdef ENABLE_IPS
+-      RT_RF_POWER_STATE       rtState;
+-
+-      rtState = priv->eRFPowerState;
+-      if (priv->PowerSaveControl.bInactivePs){
+-              if(rtState == eRfOff){
+-                      if(priv->RfOffReason > RF_CHANGE_BY_IPS)
+-                      {
+-                              RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__FUNCTION__);
+-                              //up(&priv->wx_sem);
+-                              return ;
+-                      }
+-                      else{
+-                              down(&priv->ieee80211->ips_sem);
+-                              IPSLeave(priv);
+-                              up(&priv->ieee80211->ips_sem);
+-                      }
+-              }
+-      }
+-      priv->ieee80211->is_set_key = true;
+-#endif
+-      if (EntryNo >= TOTAL_CAM_ENTRY)
+-              RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
+-
+-      RT_TRACE(COMP_SEC, "====>to setKey(), priv:%p, EntryNo:%d, KeyIndex:%d, KeyType:%d, MacAddr%pM\n", priv, EntryNo, KeyIndex, KeyType, MacAddr);
+-
+-      if (DefaultKey)
+-              usConfig |= BIT15 | (KeyType<<2);
+-      else
+-              usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
+-//    usConfig |= BIT15 | (KeyType<<2) | (DefaultKey<<5) | KeyIndex;
+-
+-
+-      for(i=0 ; i<CAM_CONTENT_COUNT; i++){
+-              TargetCommand  = i+CAM_CONTENT_COUNT*EntryNo;
+-              TargetCommand |= BIT31|BIT16;
+-
+-              if(i==0){//MAC|Config
+-                      TargetContent = (u32)(*(MacAddr+0)) << 16|
+-                                      (u32)(*(MacAddr+1)) << 24|
+-                                      (u32)usConfig;
+-
+-                      write_nic_dword(priv, WCAMI, TargetContent);
+-                      write_nic_dword(priv, RWCAM, TargetCommand);
+-              }
+-              else if(i==1){//MAC
+-                        TargetContent = (u32)(*(MacAddr+2))    |
+-                                        (u32)(*(MacAddr+3)) <<  8|
+-                                        (u32)(*(MacAddr+4)) << 16|
+-                                        (u32)(*(MacAddr+5)) << 24;
+-                      write_nic_dword(priv, WCAMI, TargetContent);
+-                      write_nic_dword(priv, RWCAM, TargetCommand);
+-              }
+-              else {  //Key Material
+-                      if(KeyContent != NULL)
+-                      {
+-                      write_nic_dword(priv, WCAMI, (u32)(*(KeyContent+i-2)) );
+-                      write_nic_dword(priv, RWCAM, TargetCommand);
+-              }
+-      }
+-      }
+-      RT_TRACE(COMP_SEC,"=========>after set key, usconfig:%x\n", usConfig);
+-}
+-
+-bool NicIFEnableNIC(struct r8192_priv *priv)
+-{
+-      RT_STATUS init_status = RT_STATUS_SUCCESS;
+-      PRT_POWER_SAVE_CONTROL pPSC = &priv->PowerSaveControl;
+-
+-      //YJ,add,091109
+-      if (priv->up == 0){
+-              RT_TRACE(COMP_ERR, "ERR!!! %s(): Driver is already down!\n",__FUNCTION__);
+-              priv->bdisable_nic = false;  //YJ,add,091111
+-              return false;
+-      }
+-      // <1> Reset memory: descriptor, buffer,..
+-      //NicIFResetMemory(Adapter);
+-
+-      // <2> Enable Adapter
+-      //priv->bfirst_init = true;
+-      init_status = rtl8192_adapter_start(priv);
+-      if (init_status != RT_STATUS_SUCCESS) {
+-              RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n",__FUNCTION__);
+-              priv->bdisable_nic = false;  //YJ,add,091111
+-              return -1;
+-      }
+-      RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+-      //priv->bfirst_init = false;
+-
+-      // <3> Enable Interrupt
+-      rtl8192_irq_enable(priv);
+-      priv->bdisable_nic = false;
+-
+-      return (init_status == RT_STATUS_SUCCESS);
+-}
+-
+-bool NicIFDisableNIC(struct r8192_priv *priv)
+-{
+-      bool    status = true;
+-      u8 tmp_state = 0;
+-      // <1> Disable Interrupt
+-
+-      priv->bdisable_nic = true;      //YJ,move,091109
+-      tmp_state = priv->ieee80211->state;
+-
+-      ieee80211_softmac_stop_protocol(priv->ieee80211, false);
+-
+-      priv->ieee80211->state = tmp_state;
+-      rtl8192_cancel_deferred_work(priv);
+-      rtl8192_irq_disable(priv);
+-      // <2> Stop all timer
+-
+-      // <3> Disable Adapter
+-      rtl8192_halt_adapter(priv, false);
+-//    priv->bdisable_nic = true;
+-
+-      return status;
+-}
+-
+-module_init(rtl8192_pci_module_init);
+-module_exit(rtl8192_pci_module_exit);
diff --git a/drivers/staging/rtl8192e/r8192E_dev.c b/drivers/staging/rtl8192e/r8192E_dev.c
new file mode 100644 (file)
index 0000000..ba988f0
--- /dev/null
@@ -0,0 +1,2670 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtl_core.h"
+#include "r8192E_phy.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h"
+#include "r8192E_cmdpkt.h"
+#include "rtl_dm.h"
+#include "rtl_wx.h"
+
+extern int WDCAPARA_ADD[];
+
+void rtl8192e_start_beacon(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct rtllib_network *net = &priv->rtllib->current_network;
+       u16 BcnTimeCfg = 0;
+        u16 BcnCW = 6;
+        u16 BcnIFS = 0xf;
+
+       DMESG("Enabling beacon TX");
+       rtl8192_irq_disable(dev);
+
+       write_nic_word(dev, ATIMWND, 2);
+
+       write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
+       write_nic_word(dev, BCN_DRV_EARLY_INT, 10);
+       write_nic_word(dev, BCN_DMATIME, 256);
+
+       write_nic_byte(dev, BCN_ERR_THRESH, 100);
+
+       BcnTimeCfg |= BcnCW<<BCN_TCFG_CW_SHIFT;
+       BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
+       write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
+       rtl8192_irq_enable(dev);
+}
+
+void rtl8192e_update_msr(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 msr;
+       LED_CTL_MODE    LedAction = LED_CTL_NO_LINK;
+       msr  = read_nic_byte(dev, MSR);
+       msr &= ~ MSR_LINK_MASK;
+
+       switch (priv->rtllib->iw_mode) {
+       case IW_MODE_INFRA:
+               if (priv->rtllib->state == RTLLIB_LINKED)
+                       msr |= (MSR_LINK_MANAGED << MSR_LINK_SHIFT);
+               else
+                       msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
+               LedAction = LED_CTL_LINK;
+               break;
+       case IW_MODE_ADHOC:
+               if (priv->rtllib->state == RTLLIB_LINKED)
+                       msr |= (MSR_LINK_ADHOC << MSR_LINK_SHIFT);
+               else
+                       msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
+               break;
+       case IW_MODE_MASTER:
+               if (priv->rtllib->state == RTLLIB_LINKED)
+                       msr |= (MSR_LINK_MASTER << MSR_LINK_SHIFT);
+               else
+                       msr |= (MSR_LINK_NONE << MSR_LINK_SHIFT);
+               break;
+       default:
+               break;
+       }
+
+       write_nic_byte(dev, MSR, msr);
+       if (priv->rtllib->LedControlHandler)
+               priv->rtllib->LedControlHandler(dev, LedAction);
+}
+
+void
+rtl8192e_SetHwReg(struct net_device *dev,u8 variable,u8* val)
+{
+       struct r8192_priv* priv = rtllib_priv(dev);
+
+       switch (variable)
+       {
+
+               case HW_VAR_BSSID:
+                       write_nic_dword(dev, BSSIDR, ((u32*)(val))[0]);
+                       write_nic_word(dev, BSSIDR+2, ((u16*)(val+2))[0]);
+               break;
+
+               case HW_VAR_MEDIA_STATUS:
+               {
+                       RT_OP_MODE      OpMode = *((RT_OP_MODE *)(val));
+                       LED_CTL_MODE    LedAction = LED_CTL_NO_LINK;
+                       u8              btMsr = read_nic_byte(dev, MSR);
+
+                       btMsr &= 0xfc;
+
+                       switch (OpMode)
+                       {
+                       case RT_OP_MODE_INFRASTRUCTURE:
+                               btMsr |= MSR_INFRA;
+                               LedAction = LED_CTL_LINK;
+                               break;
+
+                       case RT_OP_MODE_IBSS:
+                               btMsr |= MSR_ADHOC;
+                               break;
+
+                       case RT_OP_MODE_AP:
+                               btMsr |= MSR_AP;
+                               LedAction = LED_CTL_LINK;
+                               break;
+
+                       default:
+                               btMsr |= MSR_NOLINK;
+                               break;
+                       }
+
+                       write_nic_byte(dev, MSR, btMsr);
+
+               }
+               break;
+
+               case HW_VAR_CECHK_BSSID:
+               {
+                       u32     RegRCR, Type;
+
+                       Type = ((u8*)(val))[0];
+                       RegRCR = read_nic_dword(dev,RCR);
+                       priv->ReceiveConfig = RegRCR;
+
+                       if (Type == true)
+                               RegRCR |= (RCR_CBSSID);
+                       else if (Type == false)
+                               RegRCR &= (~RCR_CBSSID);
+
+                       write_nic_dword(dev, RCR,RegRCR);
+                       priv->ReceiveConfig = RegRCR;
+
+               }
+               break;
+
+               case HW_VAR_SLOT_TIME:
+               {
+
+                       priv->slot_time = val[0];
+                       write_nic_byte(dev, SLOT_TIME, val[0]);
+
+#ifdef MERGE_TO_DO
+                       if (priv->rtllib->current_network.qos_data.supported !=0)
+                       {
+                               for (eACI = 0; eACI < AC_MAX; eACI++)
+                               {
+                                       priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM, (u8*)(&eACI));
+                               }
+                       }
+                       else
+                       {
+                               u8      u1bAIFS = aSifsTime + (2 * priv->slot_time);
+
+                               write_nic_byte(dev, EDCAPARA_VO, u1bAIFS);
+                               write_nic_byte(dev, EDCAPARA_VI, u1bAIFS);
+                               write_nic_byte(dev, EDCAPARA_BE, u1bAIFS);
+                               write_nic_byte(dev, EDCAPARA_BK, u1bAIFS);
+                       }
+#endif
+               }
+               break;
+
+               case HW_VAR_ACK_PREAMBLE:
+               {
+                       u32 regTmp = 0;
+                       priv->short_preamble = (bool)(*(u8*)val );
+                       regTmp = priv->basic_rate;
+                       if (priv->short_preamble)
+                               regTmp |= BRSR_AckShortPmb;
+                       write_nic_dword(dev, RRSR, regTmp);
+               }
+               break;
+
+               case HW_VAR_CPU_RST:
+                       write_nic_dword(dev, CPU_GEN, ((u32*)(val))[0]);
+               break;
+
+               case HW_VAR_AC_PARAM:
+               {
+                       u8      pAcParam = *((u8*)val);
+#ifdef MERGE_TO_DO
+                       u32     eACI = GET_WMM_AC_PARAM_ACI(pAcParam);
+#else
+                       u32     eACI = pAcParam;
+#endif
+                       u8              u1bAIFS;
+                       u32             u4bAcParam;
+                       u8 mode = priv->rtllib->mode;
+                       struct rtllib_qos_parameters *qos_parameters = &priv->rtllib->current_network.qos_data.parameters;
+
+
+                       u1bAIFS = qos_parameters->aifs[pAcParam] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
+
+                       dm_init_edca_turbo(dev);
+
+                       u4bAcParam = (  (((u32)(qos_parameters->tx_op_limit[pAcParam])) << AC_PARAM_TXOP_LIMIT_OFFSET)  |
+                                                       (((u32)(qos_parameters->cw_max[pAcParam])) << AC_PARAM_ECW_MAX_OFFSET)  |
+                                                       (((u32)(qos_parameters->cw_min[pAcParam])) << AC_PARAM_ECW_MIN_OFFSET)  |
+                                                       (((u32)u1bAIFS) << AC_PARAM_AIFS_OFFSET)        );
+
+                       RT_TRACE(COMP_DBG, "%s():HW_VAR_AC_PARAM eACI:%x:%x\n", __func__,eACI, u4bAcParam);
+                       switch (eACI)
+                       {
+                       case AC1_BK:
+                               write_nic_dword(dev, EDCAPARA_BK, u4bAcParam);
+                               break;
+
+                       case AC0_BE:
+                               write_nic_dword(dev, EDCAPARA_BE, u4bAcParam);
+                               break;
+
+                       case AC2_VI:
+                               write_nic_dword(dev, EDCAPARA_VI, u4bAcParam);
+                               break;
+
+                       case AC3_VO:
+                               write_nic_dword(dev, EDCAPARA_VO, u4bAcParam);
+                               break;
+
+                       default:
+                               printk("SetHwReg8185(): invalid ACI: %d !\n", eACI);
+                               break;
+                       }
+                               priv->rtllib->SetHwRegHandler(dev, HW_VAR_ACM_CTRL, (u8*)(&pAcParam));
+               }
+               break;
+
+               case HW_VAR_ACM_CTRL:
+               {
+                       struct rtllib_qos_parameters *qos_parameters = &priv->rtllib->current_network.qos_data.parameters;
+                       u8      pAcParam = *((u8*)val);
+#ifdef MERGE_TO_DO
+                       u32     eACI = GET_WMM_AC_PARAM_ACI(pAciAifsn);
+#else
+                       u32     eACI = pAcParam;
+#endif
+                       PACI_AIFSN      pAciAifsn = (PACI_AIFSN)&(qos_parameters->aifs[0]);
+                       u8              ACM = pAciAifsn->f.ACM;
+                       u8              AcmCtrl = read_nic_byte( dev, AcmHwCtrl);
+
+                       RT_TRACE(COMP_DBG, "===========>%s():HW_VAR_ACM_CTRL:%x\n", __func__,eACI);
+                       AcmCtrl = AcmCtrl | ((priv->AcmMethod == 2)?0x0:0x1);
+
+                       if ( ACM )
+                       {
+                               switch (eACI)
+                               {
+                               case AC0_BE:
+                                       AcmCtrl |= AcmHw_BeqEn;
+                                       break;
+
+                               case AC2_VI:
+                                       AcmCtrl |= AcmHw_ViqEn;
+                                       break;
+
+                               case AC3_VO:
+                                       AcmCtrl |= AcmHw_VoqEn;
+                                       break;
+
+                               default:
+                                       RT_TRACE( COMP_QOS, "SetHwReg8185(): [HW_VAR_ACM_CTRL] ACM set failed: eACI is %d\n", eACI );
+                                       break;
+                               }
+                       }
+                       else
+                       {
+                               switch (eACI)
+                               {
+                               case AC0_BE:
+                                       AcmCtrl &= (~AcmHw_BeqEn);
+                                       break;
+
+                               case AC2_VI:
+                                       AcmCtrl &= (~AcmHw_ViqEn);
+                                       break;
+
+                               case AC3_VO:
+                                       AcmCtrl &= (~AcmHw_BeqEn);
+                                       break;
+
+                               default:
+                                       break;
+                               }
+                       }
+
+                       RT_TRACE( COMP_QOS, "SetHwReg8190pci(): [HW_VAR_ACM_CTRL] Write 0x%X\n", AcmCtrl );
+                       write_nic_byte(dev, AcmHwCtrl, AcmCtrl );
+               }
+               break;
+
+               case HW_VAR_SIFS:
+                       write_nic_byte(dev, SIFS, val[0]);
+                       write_nic_byte(dev, SIFS+1, val[0]);
+               break;
+
+                case HW_VAR_RF_TIMING:
+               {
+#ifdef RTL8192E
+                       u8 Rf_Timing = *((u8*)val);
+                       write_nic_byte(dev, rFPGA0_RFTiming1, Rf_Timing);
+#endif
+               }
+               break;
+
+               default:
+               break;
+       }
+
+}
+
+static void rtl8192_read_eeprom_info(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       u8                      tempval;
+#ifdef RTL8192E
+       u8                      ICVer8192, ICVer8256;
+#endif
+       u16                     i,usValue, IC_Version;
+       u16                     EEPROMId;
+#ifdef RTL8190P
+       u8                      offset;
+       u8                      EepromTxPower[100];
+#endif
+       u8 bMac_Tmp_Addr[6] = {0x00, 0xe0, 0x4c, 0x00, 0x00, 0x01};
+       RT_TRACE(COMP_INIT, "====> rtl8192_read_eeprom_info\n");
+
+
+
+       EEPROMId = eprom_read(dev, 0);
+       if ( EEPROMId != RTL8190_EEPROM_ID )
+       {
+               RT_TRACE(COMP_ERR, "EEPROM ID is invalid:%x, %x\n", EEPROMId, RTL8190_EEPROM_ID);
+               priv->AutoloadFailFlag=true;
+       }
+       else
+       {
+               priv->AutoloadFailFlag=false;
+       }
+
+       if (!priv->AutoloadFailFlag)
+       {
+               priv->eeprom_vid = eprom_read(dev, (EEPROM_VID >> 1));
+               priv->eeprom_did = eprom_read(dev, (EEPROM_DID >> 1));
+
+               usValue = eprom_read(dev, (u16)(EEPROM_Customer_ID>>1)) >> 8 ;
+               priv->eeprom_CustomerID = (u8)( usValue & 0xff);
+               usValue = eprom_read(dev, (EEPROM_ICVersion_ChannelPlan>>1));
+               priv->eeprom_ChannelPlan = usValue&0xff;
+               IC_Version = ((usValue&0xff00)>>8);
+
+#ifdef RTL8190P
+               priv->card_8192_version = (VERSION_8190)(IC_Version);
+#elif defined  RTL8192E
+               ICVer8192 = (IC_Version&0xf);
+               ICVer8256 = ((IC_Version&0xf0)>>4);
+               RT_TRACE(COMP_INIT, "\nICVer8192 = 0x%x\n", ICVer8192);
+               RT_TRACE(COMP_INIT, "\nICVer8256 = 0x%x\n", ICVer8256);
+               if (ICVer8192 == 0x2)
+               {
+                       if (ICVer8256 == 0x5)
+                               priv->card_8192_version= VERSION_8190_BE;
+               }
+#endif
+               switch (priv->card_8192_version)
+               {
+                       case VERSION_8190_BD:
+                       case VERSION_8190_BE:
+                               break;
+                       default:
+                               priv->card_8192_version = VERSION_8190_BD;
+                               break;
+               }
+               RT_TRACE(COMP_INIT, "\nIC Version = 0x%x\n", priv->card_8192_version);
+       }
+       else
+       {
+               priv->card_8192_version = VERSION_8190_BD;
+               priv->eeprom_vid = 0;
+               priv->eeprom_did = 0;
+               priv->eeprom_CustomerID = 0;
+               priv->eeprom_ChannelPlan = 0;
+               RT_TRACE(COMP_INIT, "\nIC Version = 0x%x\n", 0xff);
+       }
+
+       RT_TRACE(COMP_INIT, "EEPROM VID = 0x%4x\n", priv->eeprom_vid);
+       RT_TRACE(COMP_INIT, "EEPROM DID = 0x%4x\n", priv->eeprom_did);
+       RT_TRACE(COMP_INIT,"EEPROM Customer ID: 0x%2x\n", priv->eeprom_CustomerID);
+
+       if (!priv->AutoloadFailFlag)
+       {
+               for (i = 0; i < 6; i += 2)
+               {
+                       usValue = eprom_read(dev, (u16) ((EEPROM_NODE_ADDRESS_BYTE_0+i)>>1));
+                       *(u16*)(&dev->dev_addr[i]) = usValue;
+               }
+       } else {
+               memcpy(dev->dev_addr, bMac_Tmp_Addr, 6);
+       }
+
+       RT_TRACE(COMP_INIT, "Permanent Address = %02x-%02x-%02x-%02x-%02x-%02x\n",
+                       dev->dev_addr[0], dev->dev_addr[1],
+                       dev->dev_addr[2], dev->dev_addr[3],
+                       dev->dev_addr[4], dev->dev_addr[5]);
+
+       if (priv->card_8192_version > VERSION_8190_BD) {
+               priv->bTXPowerDataReadFromEEPORM = true;
+       } else {
+               priv->bTXPowerDataReadFromEEPORM = false;
+       }
+
+       priv->rf_type = RTL819X_DEFAULT_RF_TYPE;
+
+       if (priv->card_8192_version > VERSION_8190_BD)
+       {
+               if (!priv->AutoloadFailFlag)
+               {
+                       tempval = (eprom_read(dev, (EEPROM_RFInd_PowerDiff>>1))) & 0xff;
+                       priv->EEPROMLegacyHTTxPowerDiff = tempval & 0xf;
+
+                       if (tempval&0x80)
+                               priv->rf_type = RF_1T2R;
+                       else
+                               priv->rf_type = RF_2T4R;
+               }
+               else
+               {
+                       priv->EEPROMLegacyHTTxPowerDiff = 0x04;
+               }
+               RT_TRACE(COMP_INIT, "EEPROMLegacyHTTxPowerDiff = %d\n",
+                       priv->EEPROMLegacyHTTxPowerDiff);
+
+               if (!priv->AutoloadFailFlag)
+               {
+                       priv->EEPROMThermalMeter = (u8)(((eprom_read(dev, (EEPROM_ThermalMeter>>1))) & 0xff00)>>8);
+               }
+               else
+               {
+                       priv->EEPROMThermalMeter = EEPROM_Default_ThermalMeter;
+               }
+               RT_TRACE(COMP_INIT, "ThermalMeter = %d\n", priv->EEPROMThermalMeter);
+               priv->TSSI_13dBm = priv->EEPROMThermalMeter *100;
+
+               if (priv->epromtype == EEPROM_93C46)
+               {
+               if (!priv->AutoloadFailFlag)
+               {
+                               usValue = eprom_read(dev, (EEPROM_TxPwDiff_CrystalCap>>1));
+                               priv->EEPROMAntPwDiff = (usValue&0x0fff);
+                               priv->EEPROMCrystalCap = (u8)((usValue&0xf000)>>12);
+               }
+               else
+               {
+                               priv->EEPROMAntPwDiff = EEPROM_Default_AntTxPowerDiff;
+                               priv->EEPROMCrystalCap = EEPROM_Default_TxPwDiff_CrystalCap;
+               }
+                       RT_TRACE(COMP_INIT, "EEPROMAntPwDiff = %d\n", priv->EEPROMAntPwDiff);
+                       RT_TRACE(COMP_INIT, "EEPROMCrystalCap = %d\n", priv->EEPROMCrystalCap);
+
+               for (i=0; i<14; i+=2)
+               {
+                       if (!priv->AutoloadFailFlag)
+                       {
+                               usValue = eprom_read(dev, (u16) ((EEPROM_TxPwIndex_CCK+i)>>1) );
+                       }
+                       else
+                       {
+                               usValue = EEPROM_Default_TxPower;
+                       }
+                       *((u16*)(&priv->EEPROMTxPowerLevelCCK[i])) = usValue;
+                       RT_TRACE(COMP_INIT,"CCK Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelCCK[i]);
+                       RT_TRACE(COMP_INIT, "CCK Tx Power Level, Index %d = 0x%02x\n", i+1, priv->EEPROMTxPowerLevelCCK[i+1]);
+               }
+               for (i=0; i<14; i+=2)
+               {
+                       if (!priv->AutoloadFailFlag)
+                       {
+                               usValue = eprom_read(dev, (u16) ((EEPROM_TxPwIndex_OFDM_24G+i)>>1) );
+                       }
+                       else
+                       {
+                               usValue = EEPROM_Default_TxPower;
+                       }
+                       *((u16*)(&priv->EEPROMTxPowerLevelOFDM24G[i])) = usValue;
+                       RT_TRACE(COMP_INIT, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i, priv->EEPROMTxPowerLevelOFDM24G[i]);
+                       RT_TRACE(COMP_INIT, "OFDM 2.4G Tx Power Level, Index %d = 0x%02x\n", i+1, priv->EEPROMTxPowerLevelOFDM24G[i+1]);
+               }
+               }
+               else if (priv->epromtype== EEPROM_93C56)
+               {
+#ifdef RTL8190P
+                       if (!priv->AutoloadFailFlag)
+                       {
+                               priv->EEPROMAntPwDiff = EEPROM_Default_AntTxPowerDiff;
+                               priv->EEPROMCrystalCap = (u8)(((eprom_read(dev, (EEPROM_C56_CrystalCap>>1))) & 0xf000)>>12);
+                       }
+                       else
+                       {
+                               priv->EEPROMAntPwDiff = EEPROM_Default_AntTxPowerDiff;
+                               priv->EEPROMCrystalCap = EEPROM_Default_TxPwDiff_CrystalCap;
+                       }
+                       RT_TRACE(COMP_INIT,"EEPROMAntPwDiff = %d\n", priv->EEPROMAntPwDiff);
+                       RT_TRACE(COMP_INIT, "EEPROMCrystalCap = %d\n", priv->EEPROMCrystalCap);
+
+                       if (!priv->AutoloadFailFlag)
+                       {
+                               for (i = 0; i < 12; i+=2)
+                               {
+                                       if (i <6)
+                                               offset = EEPROM_C56_RfA_CCK_Chnl1_TxPwIndex + i;
+                                       else
+                                               offset = EEPROM_C56_RfC_CCK_Chnl1_TxPwIndex + i - 6;
+                                       usValue = eprom_read(dev, (offset>>1));
+                                       *((u16*)(&EepromTxPower[i])) = usValue;
+                               }
+
+                               for (i = 0; i < 12; i++)
+                               {
+                                       if (i <= 2)
+                                               priv->EEPROMRfACCKChnl1TxPwLevel[i] = EepromTxPower[i];
+                                       else if ((i >=3 )&&(i <= 5))
+                                               priv->EEPROMRfAOfdmChnlTxPwLevel[i-3] = EepromTxPower[i];
+                                       else if ((i >=6 )&&(i <= 8))
+                                               priv->EEPROMRfCCCKChnl1TxPwLevel[i-6] = EepromTxPower[i];
+                                       else
+                                               priv->EEPROMRfCOfdmChnlTxPwLevel[i-9] = EepromTxPower[i];
+                               }
+                       }
+                       else
+                       {
+                               priv->EEPROMRfACCKChnl1TxPwLevel[0] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfACCKChnl1TxPwLevel[1] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfACCKChnl1TxPwLevel[2] = EEPROM_Default_TxPowerLevel;
+
+                               priv->EEPROMRfAOfdmChnlTxPwLevel[0] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfAOfdmChnlTxPwLevel[1] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfAOfdmChnlTxPwLevel[2] = EEPROM_Default_TxPowerLevel;
+
+                               priv->EEPROMRfCCCKChnl1TxPwLevel[0] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfCCCKChnl1TxPwLevel[1] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfCCCKChnl1TxPwLevel[2] = EEPROM_Default_TxPowerLevel;
+
+                               priv->EEPROMRfCOfdmChnlTxPwLevel[0] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfCOfdmChnlTxPwLevel[1] = EEPROM_Default_TxPowerLevel;
+                               priv->EEPROMRfCOfdmChnlTxPwLevel[2] = EEPROM_Default_TxPowerLevel;
+                       }
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfACCKChnl1TxPwLevel[0] = 0x%x\n", priv->EEPROMRfACCKChnl1TxPwLevel[0]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfACCKChnl1TxPwLevel[1] = 0x%x\n", priv->EEPROMRfACCKChnl1TxPwLevel[1]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfACCKChnl1TxPwLevel[2] = 0x%x\n", priv->EEPROMRfACCKChnl1TxPwLevel[2]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfAOfdmChnlTxPwLevel[0] = 0x%x\n", priv->EEPROMRfAOfdmChnlTxPwLevel[0]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfAOfdmChnlTxPwLevel[1] = 0x%x\n", priv->EEPROMRfAOfdmChnlTxPwLevel[1]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfAOfdmChnlTxPwLevel[2] = 0x%x\n", priv->EEPROMRfAOfdmChnlTxPwLevel[2]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfCCCKChnl1TxPwLevel[0] = 0x%x\n", priv->EEPROMRfCCCKChnl1TxPwLevel[0]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfCCCKChnl1TxPwLevel[1] = 0x%x\n", priv->EEPROMRfCCCKChnl1TxPwLevel[1]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfCCCKChnl1TxPwLevel[2] = 0x%x\n", priv->EEPROMRfCCCKChnl1TxPwLevel[2]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfCOfdmChnlTxPwLevel[0] = 0x%x\n", priv->EEPROMRfCOfdmChnlTxPwLevel[0]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfCOfdmChnlTxPwLevel[1] = 0x%x\n", priv->EEPROMRfCOfdmChnlTxPwLevel[1]);
+                       RT_TRACE(COMP_INIT, "priv->EEPROMRfCOfdmChnlTxPwLevel[2] = 0x%x\n", priv->EEPROMRfCOfdmChnlTxPwLevel[2]);
+#endif
+
+               }
+               if (priv->epromtype == EEPROM_93C46)
+               {
+                       for (i=0; i<14; i++)
+                       {
+                               priv->TxPowerLevelCCK[i] = priv->EEPROMTxPowerLevelCCK[i];
+                               priv->TxPowerLevelOFDM24G[i] = priv->EEPROMTxPowerLevelOFDM24G[i];
+                       }
+                       priv->LegacyHTTxPowerDiff = priv->EEPROMLegacyHTTxPowerDiff;
+                       priv->AntennaTxPwDiff[0] = (priv->EEPROMAntPwDiff & 0xf);
+                       priv->AntennaTxPwDiff[1] = ((priv->EEPROMAntPwDiff & 0xf0)>>4);
+                       priv->AntennaTxPwDiff[2] = ((priv->EEPROMAntPwDiff & 0xf00)>>8);
+                       priv->CrystalCap = priv->EEPROMCrystalCap;
+                       priv->ThermalMeter[0] = (priv->EEPROMThermalMeter & 0xf);
+                       priv->ThermalMeter[1] = ((priv->EEPROMThermalMeter & 0xf0)>>4);
+               }
+               else if (priv->epromtype == EEPROM_93C56)
+               {
+
+                       for (i=0; i<3; i++)
+                       {
+                               priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[0];
+                               priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[0];
+                               priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[0];
+                               priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[0];
+                       }
+                       for (i=3; i<9; i++)
+                       {
+                               priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[1];
+                               priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[1];
+                               priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[1];
+                               priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[1];
+                       }
+                       for (i=9; i<14; i++)
+                       {
+                               priv->TxPowerLevelCCK_A[i]  = priv->EEPROMRfACCKChnl1TxPwLevel[2];
+                               priv->TxPowerLevelOFDM24G_A[i] = priv->EEPROMRfAOfdmChnlTxPwLevel[2];
+                               priv->TxPowerLevelCCK_C[i] =  priv->EEPROMRfCCCKChnl1TxPwLevel[2];
+                               priv->TxPowerLevelOFDM24G_C[i] = priv->EEPROMRfCOfdmChnlTxPwLevel[2];
+                       }
+                       for (i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT, "priv->TxPowerLevelCCK_A[%d] = 0x%x\n", i, priv->TxPowerLevelCCK_A[i]);
+                       for (i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT,"priv->TxPowerLevelOFDM24G_A[%d] = 0x%x\n", i, priv->TxPowerLevelOFDM24G_A[i]);
+                       for (i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT, "priv->TxPowerLevelCCK_C[%d] = 0x%x\n", i, priv->TxPowerLevelCCK_C[i]);
+                       for (i=0; i<14; i++)
+                               RT_TRACE(COMP_INIT, "priv->TxPowerLevelOFDM24G_C[%d] = 0x%x\n", i, priv->TxPowerLevelOFDM24G_C[i]);
+                       priv->LegacyHTTxPowerDiff = priv->EEPROMLegacyHTTxPowerDiff;
+                       priv->AntennaTxPwDiff[0] = 0;
+                       priv->AntennaTxPwDiff[1] = 0;
+                       priv->AntennaTxPwDiff[2] = 0;
+                       priv->CrystalCap = priv->EEPROMCrystalCap;
+                       priv->ThermalMeter[0] = (priv->EEPROMThermalMeter & 0xf);
+                       priv->ThermalMeter[1] = ((priv->EEPROMThermalMeter & 0xf0)>>4);
+               }
+       }
+
+       if (priv->rf_type == RF_1T2R)
+       {
+               RT_TRACE(COMP_INIT, "\n1T2R config\n");
+       }
+       else if (priv->rf_type == RF_2T4R)
+       {
+               RT_TRACE(COMP_INIT, "\n2T4R config\n");
+       }
+
+       init_rate_adaptive(dev);
+
+
+       priv->rf_chip= RF_8256;
+
+       if (priv->RegChannelPlan == 0xf)
+       {
+               priv->ChannelPlan = priv->eeprom_ChannelPlan;
+       }
+       else
+       {
+               priv->ChannelPlan = priv->RegChannelPlan;
+       }
+
+       if ( priv->eeprom_vid == 0x1186 &&  priv->eeprom_did == 0x3304 )
+       {
+               priv->CustomerID =  RT_CID_DLINK;
+       }
+
+       switch (priv->eeprom_CustomerID)
+       {
+               case EEPROM_CID_DEFAULT:
+                       priv->CustomerID = RT_CID_DEFAULT;
+                       break;
+               case EEPROM_CID_CAMEO:
+                       priv->CustomerID = RT_CID_819x_CAMEO;
+                       break;
+               case  EEPROM_CID_RUNTOP:
+                       priv->CustomerID = RT_CID_819x_RUNTOP;
+                       break;
+               case EEPROM_CID_NetCore:
+                       priv->CustomerID = RT_CID_819x_Netcore;
+                       break;
+               case EEPROM_CID_TOSHIBA:
+                       priv->CustomerID = RT_CID_TOSHIBA;
+                       if (priv->eeprom_ChannelPlan&0x80)
+                               priv->ChannelPlan = priv->eeprom_ChannelPlan&0x7f;
+                       else
+                               priv->ChannelPlan = 0x0;
+                       RT_TRACE(COMP_INIT, "Toshiba ChannelPlan = 0x%x\n",
+                               priv->ChannelPlan);
+                       break;
+               case EEPROM_CID_Nettronix:
+                       priv->ScanDelay = 100;
+                       priv->CustomerID = RT_CID_Nettronix;
+                       break;
+               case EEPROM_CID_Pronet:
+                       priv->CustomerID = RT_CID_PRONET;
+                       break;
+               case EEPROM_CID_DLINK:
+                       priv->CustomerID = RT_CID_DLINK;
+                       break;
+
+               case EEPROM_CID_WHQL:
+
+
+
+                       break;
+               default:
+                       break;
+       }
+
+       if (priv->ChannelPlan > CHANNEL_PLAN_LEN - 1)
+               priv->ChannelPlan = 0;
+#ifdef ENABLE_DOT11D
+       priv->ChannelPlan = COUNTRY_CODE_WORLD_WIDE_13;
+#endif
+
+#ifdef TO_DO_LIST
+       switch (priv->CustomerID)
+       {
+               case RT_CID_DEFAULT:
+#ifdef RTL8190P
+                       priv->LedStrategy = HW_LED;
+#elif defined RTL8192E
+                       priv->LedStrategy = SW_LED_MODE1;
+#endif
+                       break;
+
+               case RT_CID_819x_CAMEO:
+                       priv->LedStrategy = SW_LED_MODE2;
+                       break;
+
+               case RT_CID_819x_RUNTOP:
+                       priv->LedStrategy = SW_LED_MODE3;
+                       break;
+
+               case RT_CID_819x_Netcore:
+                       priv->LedStrategy = SW_LED_MODE4;
+                       break;
+
+               case RT_CID_Nettronix:
+                       priv->LedStrategy = SW_LED_MODE5;
+                       break;
+
+               case RT_CID_PRONET:
+                       priv->LedStrategy = SW_LED_MODE6;
+                       break;
+
+               case RT_CID_TOSHIBA:
+
+               default:
+#ifdef RTL8190P
+                       priv->LedStrategy = HW_LED;
+#elif defined RTL8192E
+                       priv->LedStrategy = SW_LED_MODE1;
+#endif
+                       break;
+       }
+       RT_TRACE(COMP_INIT, "LedStrategy = %d \n", priv->LedStrategy);
+#endif
+
+       if ( priv->eeprom_vid == 0x1186 &&  priv->eeprom_did == 0x3304)
+               priv->rtllib->bSupportRemoteWakeUp = true;
+       else
+               priv->rtllib->bSupportRemoteWakeUp = false;
+
+       RT_TRACE(COMP_INIT, "RegChannelPlan(%d)\n", priv->RegChannelPlan);
+       RT_TRACE(COMP_INIT, "ChannelPlan = %d \n", priv->ChannelPlan);
+       RT_TRACE(COMP_TRACE, "<==== ReadAdapterInfo\n");
+
+       return ;
+}
+
+void rtl8192_get_eeprom_size(struct net_device* dev)
+{
+       u16 curCR = 0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       RT_TRACE(COMP_INIT, "===========>%s()\n", __func__);
+       curCR = read_nic_dword(dev, EPROM_CMD);
+       RT_TRACE(COMP_INIT, "read from Reg Cmd9346CR(%x):%x\n", EPROM_CMD, curCR);
+       priv->epromtype = (curCR & EPROM_CMD_9356SEL) ? EEPROM_93C56 : EEPROM_93C46;
+       RT_TRACE(COMP_INIT, "<===========%s(), epromtype:%d\n", __func__, priv->epromtype);
+       rtl8192_read_eeprom_info(dev);
+}
+
+static void rtl8192_hwconfig(struct net_device* dev)
+{
+       u32 regRATR = 0, regRRSR = 0;
+       u8 regBwOpMode = 0, regTmp = 0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       switch (priv->rtllib->mode)
+       {
+       case WIRELESS_MODE_B:
+               regBwOpMode = BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_CCK;
+               regRRSR = RATE_ALL_CCK;
+               break;
+       case WIRELESS_MODE_A:
+               regBwOpMode = BW_OPMODE_5G |BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_OFDM_AG;
+               regRRSR = RATE_ALL_OFDM_AG;
+               break;
+       case WIRELESS_MODE_G:
+               regBwOpMode = BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               break;
+       case WIRELESS_MODE_AUTO:
+       case WIRELESS_MODE_N_24G:
+               regBwOpMode = BW_OPMODE_20MHZ;
+                       regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
+                       regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               break;
+       case WIRELESS_MODE_N_5G:
+               regBwOpMode = BW_OPMODE_5G;
+               regRATR = RATE_ALL_OFDM_AG | RATE_ALL_OFDM_1SS | RATE_ALL_OFDM_2SS;
+               regRRSR = RATE_ALL_OFDM_AG;
+               break;
+       default:
+               regBwOpMode = BW_OPMODE_20MHZ;
+               regRATR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               regRRSR = RATE_ALL_CCK | RATE_ALL_OFDM_AG;
+               break;
+       }
+
+       write_nic_byte(dev, BW_OPMODE, regBwOpMode);
+       {
+               u32 ratr_value = 0;
+               ratr_value = regRATR;
+               if (priv->rf_type == RF_1T2R)
+               {
+                       ratr_value &= ~(RATE_ALL_OFDM_2SS);
+               }
+               write_nic_dword(dev, RATR0, ratr_value);
+               write_nic_byte(dev, UFWP, 1);
+       }
+       regTmp = read_nic_byte(dev, 0x313);
+       regRRSR = ((regTmp) << 24) | (regRRSR & 0x00ffffff);
+       write_nic_dword(dev, RRSR, regRRSR);
+
+       write_nic_word(dev, RETRY_LIMIT,
+                       priv->ShortRetryLimit << RETRY_LIMIT_SHORT_SHIFT | \
+                       priv->LongRetryLimit << RETRY_LIMIT_LONG_SHIFT);
+
+
+
+}
+
+bool rtl8192_adapter_start(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 ulRegRead;
+       bool rtStatus = true;
+       u8 tmpvalue;
+#ifdef RTL8192E
+       u8 ICVersion,SwitchingRegulatorOutput;
+#endif
+       bool bfirmwareok = true;
+#ifdef RTL8190P
+       u8 ucRegRead;
+#endif
+       u32 tmpRegA, tmpRegC, TempCCk;
+       int i = 0;
+       u32 retry_times = 0;
+
+       RT_TRACE(COMP_INIT, "====>%s()\n", __func__);
+       priv->being_init_adapter = true;
+
+#ifdef CONFIG_ASPM_OR_D3
+       RT_DISABLE_ASPM(dev);
+#endif
+
+start:
+        rtl8192_pci_resetdescring(dev);
+       priv->Rf_Mode = RF_OP_By_SW_3wire;
+#ifdef RTL8192E
+        if (priv->ResetProgress == RESET_TYPE_NORESET)
+        {
+            write_nic_byte(dev, ANAPAR, 0x37);
+            mdelay(500);
+        }
+#endif
+       priv->pFirmware->firmware_status = FW_STATUS_0_INIT;
+
+       if (priv->RegRfOff == true)
+               priv->rtllib->eRFPowerState = eRfOff;
+
+       ulRegRead = read_nic_dword(dev, CPU_GEN);
+       if (priv->pFirmware->firmware_status == FW_STATUS_0_INIT)
+       {
+               ulRegRead |= CPU_GEN_SYSTEM_RESET;
+       }else if (priv->pFirmware->firmware_status == FW_STATUS_5_READY)
+               ulRegRead |= CPU_GEN_FIRMWARE_RESET;
+       else
+               RT_TRACE(COMP_ERR, "ERROR in %s(): undefined firmware state(%d)\n", __func__,   priv->pFirmware->firmware_status);
+
+#ifdef RTL8190P
+       ulRegRead &= (~(CPU_GEN_GPIO_UART));
+#endif
+
+       write_nic_dword(dev, CPU_GEN, ulRegRead);
+
+#ifdef RTL8192E
+
+       ICVersion = read_nic_byte(dev, IC_VERRSION);
+       if (ICVersion >= 0x4)
+       {
+               SwitchingRegulatorOutput = read_nic_byte(dev, SWREGULATOR);
+               if (SwitchingRegulatorOutput  != 0xb8)
+               {
+                       write_nic_byte(dev, SWREGULATOR, 0xa8);
+                       mdelay(1);
+                       write_nic_byte(dev, SWREGULATOR, 0xb8);
+               }
+       }
+#endif
+       RT_TRACE(COMP_INIT, "BB Config Start!\n");
+       rtStatus = rtl8192_BBConfig(dev);
+       if (rtStatus != true)
+       {
+               RT_TRACE(COMP_ERR, "BB Config failed\n");
+               return rtStatus;
+       }
+       RT_TRACE(COMP_INIT,"BB Config Finished!\n");
+
+       priv->LoopbackMode = RTL819X_NO_LOOPBACK;
+       if (priv->ResetProgress == RESET_TYPE_NORESET)
+       {
+       ulRegRead = read_nic_dword(dev, CPU_GEN);
+       if (priv->LoopbackMode == RTL819X_NO_LOOPBACK)
+       {
+               ulRegRead = ((ulRegRead & CPU_GEN_NO_LOOPBACK_MSK) | CPU_GEN_NO_LOOPBACK_SET);
+       }
+       else if (priv->LoopbackMode == RTL819X_MAC_LOOPBACK )
+       {
+               ulRegRead |= CPU_CCK_LOOPBACK;
+       }
+       else
+       {
+               RT_TRACE(COMP_ERR,"Serious error: wrong loopback mode setting\n");
+       }
+
+       write_nic_dword(dev, CPU_GEN, ulRegRead);
+
+       udelay(500);
+       }
+       rtl8192_hwconfig(dev);
+       write_nic_byte(dev, CMDR, CR_RE|CR_TE);
+
+#ifdef RTL8190P
+       write_nic_byte(dev, PCIF, ((MXDMA2_NoLimit<<MXDMA2_RX_SHIFT) | \
+                               (MXDMA2_NoLimit<<MXDMA2_TX_SHIFT) | \
+                               (1<<MULRW_SHIFT)));
+#elif defined RTL8192E
+       write_nic_byte(dev, PCIF, ((MXDMA2_NoLimit<<MXDMA2_RX_SHIFT) |\
+                               (MXDMA2_NoLimit<<MXDMA2_TX_SHIFT) ));
+#endif
+       write_nic_dword(dev, MAC0, ((u32*)dev->dev_addr)[0]);
+       write_nic_word(dev, MAC4, ((u16*)(dev->dev_addr + 4))[0]);
+       write_nic_dword(dev, RCR, priv->ReceiveConfig);
+
+#ifdef TO_DO_LIST
+       if (priv->bInHctTest)
+       {
+               write_nic_dword(dev, RQPN1,  NUM_OF_PAGE_IN_FW_QUEUE_BK_DTM << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
+                               NUM_OF_PAGE_IN_FW_QUEUE_BE_DTM << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
+                               NUM_OF_PAGE_IN_FW_QUEUE_VI_DTM << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
+                               NUM_OF_PAGE_IN_FW_QUEUE_VO_DTM <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
+               write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT);
+               write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
+                               NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT|\
+                               NUM_OF_PAGE_IN_FW_QUEUE_PUB_DTM<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT);
+       }
+       else
+#endif
+       {
+               write_nic_dword(dev, RQPN1,  NUM_OF_PAGE_IN_FW_QUEUE_BK << RSVD_FW_QUEUE_PAGE_BK_SHIFT |\
+                                       NUM_OF_PAGE_IN_FW_QUEUE_BE << RSVD_FW_QUEUE_PAGE_BE_SHIFT | \
+                                       NUM_OF_PAGE_IN_FW_QUEUE_VI << RSVD_FW_QUEUE_PAGE_VI_SHIFT | \
+                                       NUM_OF_PAGE_IN_FW_QUEUE_VO <<RSVD_FW_QUEUE_PAGE_VO_SHIFT);
+               write_nic_dword(dev, RQPN2, NUM_OF_PAGE_IN_FW_QUEUE_MGNT << RSVD_FW_QUEUE_PAGE_MGNT_SHIFT);
+               write_nic_dword(dev, RQPN3, APPLIED_RESERVED_QUEUE_IN_FW| \
+                                       NUM_OF_PAGE_IN_FW_QUEUE_BCN<<RSVD_FW_QUEUE_PAGE_BCN_SHIFT|\
+                                       NUM_OF_PAGE_IN_FW_QUEUE_PUB<<RSVD_FW_QUEUE_PAGE_PUB_SHIFT);
+       }
+
+       rtl8192_tx_enable(dev);
+       rtl8192_rx_enable(dev);
+       ulRegRead = (0xFFF00000 & read_nic_dword(dev, RRSR))  | RATE_ALL_OFDM_AG | RATE_ALL_CCK;
+       write_nic_dword(dev, RRSR, ulRegRead);
+       write_nic_dword(dev, RATR0+4*7, (RATE_ALL_OFDM_AG | RATE_ALL_CCK));
+
+       write_nic_byte(dev, ACK_TIMEOUT, 0x30);
+
+       if (priv->ResetProgress == RESET_TYPE_NORESET)
+       rtl8192_SetWirelessMode(dev, priv->rtllib->mode);
+       CamResetAllEntry(dev);
+       {
+               u8 SECR_value = 0x0;
+               SECR_value |= SCR_TxEncEnable;
+               SECR_value |= SCR_RxDecEnable;
+               SECR_value |= SCR_NoSKMC;
+               write_nic_byte(dev, SECR, SECR_value);
+       }
+       write_nic_word(dev, ATIMWND, 2);
+       write_nic_word(dev, BCN_INTERVAL, 100);
+       {
+               int i;
+               for (i=0; i<QOS_QUEUE_NUM; i++)
+               write_nic_dword(dev, WDCAPARA_ADD[i], 0x005e4332);
+       }
+       write_nic_byte(dev, 0xbe, 0xc0);
+
+       rtl8192_phy_configmac(dev);
+
+       if (priv->card_8192_version > (u8) VERSION_8190_BD) {
+               rtl8192_phy_getTxPower(dev);
+               rtl8192_phy_setTxPower(dev, priv->chan);
+       }
+
+       tmpvalue = read_nic_byte(dev, IC_VERRSION);
+       priv->IC_Cut= tmpvalue;
+       RT_TRACE(COMP_INIT, "priv->IC_Cut= 0x%x\n", priv->IC_Cut);
+       if (priv->IC_Cut>= IC_VersionCut_D)
+       {
+               if (priv->IC_Cut== IC_VersionCut_D) {
+                       RT_TRACE(COMP_INIT, "D-cut\n");
+               } else if (priv->IC_Cut== IC_VersionCut_E) {
+                       RT_TRACE(COMP_INIT, "E-cut\n");
+               }
+       } else {
+               RT_TRACE(COMP_INIT, "Before C-cut\n");
+       }
+
+       RT_TRACE(COMP_INIT, "Load Firmware!\n");
+       bfirmwareok = init_firmware(dev);
+       if (!bfirmwareok) {
+               if (retry_times < 10) {
+                       retry_times++;
+                       goto start;
+               } else {
+                       rtStatus = false;
+                       goto end;
+               }
+       }
+       RT_TRACE(COMP_INIT, "Load Firmware finished!\n");
+       if (priv->ResetProgress == RESET_TYPE_NORESET) {
+               RT_TRACE(COMP_INIT, "RF Config Started!\n");
+               rtStatus = rtl8192_phy_RFConfig(dev);
+               if (rtStatus != true) {
+                       RT_TRACE(COMP_ERR, "RF Config failed\n");
+                       return rtStatus;
+               }
+               RT_TRACE(COMP_INIT, "RF Config Finished!\n");
+       }
+       rtl8192_phy_updateInitGain(dev);
+
+       rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn, 0x1);
+       rtl8192_setBBreg(dev, rFPGA0_RFMOD, bOFDMEn, 0x1);
+
+#ifdef RTL8192E
+       write_nic_byte(dev, 0x87, 0x0);
+#endif
+#ifdef RTL8190P
+       ucRegRead = read_nic_byte(dev, GPE);
+       ucRegRead |= BIT0;
+       write_nic_byte(dev, GPE, ucRegRead);
+
+       ucRegRead = read_nic_byte(dev, GPO);
+       ucRegRead &= ~BIT0;
+       write_nic_byte(dev, GPO, ucRegRead);
+#endif
+
+       if (priv->RegRfOff == true) {
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RegRfOff ----------\n",__func__);
+               MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_SW,true);
+       } else if (priv->rtllib->RfOffReason > RF_CHANGE_BY_PS) {
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RfOffReason(%d) ----------\n", __func__,priv->rtllib->RfOffReason);
+               MgntActSet_RF_State(dev, eRfOff, priv->rtllib->RfOffReason,true);
+       } else if (priv->rtllib->RfOffReason >= RF_CHANGE_BY_IPS) {
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): Turn off RF for RfOffReason(%d) ----------\n", __func__,priv->rtllib->RfOffReason);
+               MgntActSet_RF_State(dev, eRfOff, priv->rtllib->RfOffReason,true);
+       } else {
+               RT_TRACE((COMP_INIT|COMP_RF|COMP_POWER), "%s(): RF-ON \n",__func__);
+               priv->rtllib->eRFPowerState = eRfOn;
+               priv->rtllib->RfOffReason = 0;
+
+
+       }
+
+       if (priv->rtllib->FwRWRF)
+               priv->Rf_Mode = RF_OP_By_FW;
+       else
+               priv->Rf_Mode = RF_OP_By_SW_3wire;
+
+       if (priv->ResetProgress == RESET_TYPE_NORESET)
+       {
+               dm_initialize_txpower_tracking(dev);
+
+               if (priv->IC_Cut>= IC_VersionCut_D) {
+                       tmpRegA= rtl8192_QueryBBReg(dev,rOFDM0_XATxIQImbalance,bMaskDWord);
+                       tmpRegC= rtl8192_QueryBBReg(dev,rOFDM0_XCTxIQImbalance,bMaskDWord);
+                       for (i = 0; i<TxBBGainTableLength; i++) {
+                               if (tmpRegA == priv->txbbgain_table[i].txbbgain_value) {
+                                       priv->rfa_txpowertrackingindex= (u8)i;
+                                       priv->rfa_txpowertrackingindex_real= (u8)i;
+                                       priv->rfa_txpowertracking_default = priv->rfa_txpowertrackingindex;
+                                       break;
+                               }
+                       }
+
+                       TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
+
+                       for (i = 0; i < CCKTxBBGainTableLength; i++) {
+                               if (TempCCk == priv->cck_txbbgain_table[i].ccktxbb_valuearray[0]) {
+                                       priv->CCKPresentAttentuation_20Mdefault =(u8) i;
+                                       break;
+                               }
+                       }
+                       priv->CCKPresentAttentuation_40Mdefault = 0;
+                       priv->CCKPresentAttentuation_difference = 0;
+                       priv->CCKPresentAttentuation = priv->CCKPresentAttentuation_20Mdefault;
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_initial = %d\n", priv->rfa_txpowertrackingindex);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real__initial = %d\n", priv->rfa_txpowertrackingindex_real);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_difference_initial = %d\n", priv->CCKPresentAttentuation_difference);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_initial = %d\n", priv->CCKPresentAttentuation);
+                       priv->btxpower_tracking = false;
+               }
+       }
+       rtl8192_irq_enable(dev);
+end:
+       priv->being_init_adapter = false;
+       return rtStatus;
+}
+
+void rtl8192_net_update(struct net_device *dev)
+{
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_network *net;
+       u16 BcnTimeCfg = 0, BcnCW = 6, BcnIFS = 0xf;
+       u16 rate_config = 0;
+
+       net = &priv->rtllib->current_network;
+       rtl8192_config_rate(dev, &rate_config);
+       priv->dot11CurrentPreambleMode = PREAMBLE_AUTO;
+        priv->basic_rate = rate_config &= 0x15f;
+       write_nic_dword(dev,BSSIDR,((u32*)net->bssid)[0]);
+       write_nic_word(dev,BSSIDR+4,((u16*)net->bssid)[2]);
+
+       if (priv->rtllib->iw_mode == IW_MODE_ADHOC) {
+               write_nic_word(dev, ATIMWND, 2);
+               write_nic_word(dev, BCN_DMATIME, 256);
+               write_nic_word(dev, BCN_INTERVAL, net->beacon_interval);
+               write_nic_word(dev, BCN_DRV_EARLY_INT, 10);
+               write_nic_byte(dev, BCN_ERR_THRESH, 100);
+
+               BcnTimeCfg |= (BcnCW<<BCN_TCFG_CW_SHIFT);
+               BcnTimeCfg |= BcnIFS<<BCN_TCFG_IFS;
+
+               write_nic_word(dev, BCN_TCFG, BcnTimeCfg);
+       }
+}
+
+void rtl8192_link_change(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       if (!priv->up)
+                return;
+
+       if (ieee->state == RTLLIB_LINKED) {
+               rtl8192_net_update(dev);
+               priv->ops->update_ratr_table(dev);
+               if ((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type))
+                       EnableHWSecurityConfig8192(dev);
+       } else {
+               write_nic_byte(dev, 0x173, 0);
+       }
+       rtl8192e_update_msr(dev);
+
+       if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC) {
+               u32 reg = 0;
+               reg = read_nic_dword(dev, RCR);
+               if (priv->rtllib->state == RTLLIB_LINKED) {
+                       if (ieee->IntelPromiscuousModeInfo.bPromiscuousOn)
+                               ;
+                       else
+                               priv->ReceiveConfig = reg |= RCR_CBSSID;
+               } else
+                       priv->ReceiveConfig = reg &= ~RCR_CBSSID;
+
+               write_nic_dword(dev, RCR, reg);
+       }
+}
+
+void rtl8192_AllowAllDestAddr(struct net_device* dev,
+                        bool bAllowAllDA, bool WriteIntoReg)
+{
+        struct r8192_priv* priv = rtllib_priv(dev);
+
+        if (bAllowAllDA)
+                priv->ReceiveConfig |= RCR_AAP;
+        else
+                priv->ReceiveConfig &= ~RCR_AAP;
+
+        if (WriteIntoReg)
+                write_nic_dword( dev, RCR, priv->ReceiveConfig );
+}
+
+
+static u8 MRateToHwRate8190Pci(u8 rate)
+{
+       u8  ret = DESC90_RATE1M;
+
+       switch (rate) {
+       case MGN_1M:
+               ret = DESC90_RATE1M;
+               break;
+       case MGN_2M:
+               ret = DESC90_RATE2M;
+               break;
+       case MGN_5_5M:
+               ret = DESC90_RATE5_5M;
+               break;
+       case MGN_11M:
+               ret = DESC90_RATE11M;
+               break;
+       case MGN_6M:
+               ret = DESC90_RATE6M;
+               break;
+       case MGN_9M:
+               ret = DESC90_RATE9M;
+               break;
+       case MGN_12M:
+               ret = DESC90_RATE12M;
+               break;
+       case MGN_18M:
+               ret = DESC90_RATE18M;
+               break;
+       case MGN_24M:
+               ret = DESC90_RATE24M;
+               break;
+       case MGN_36M:
+               ret = DESC90_RATE36M;
+               break;
+       case MGN_48M:
+               ret = DESC90_RATE48M;
+               break;
+       case MGN_54M:
+               ret = DESC90_RATE54M;
+               break;
+       case MGN_MCS0:
+               ret = DESC90_RATEMCS0;
+               break;
+       case MGN_MCS1:
+               ret = DESC90_RATEMCS1;
+               break;
+       case MGN_MCS2:
+               ret = DESC90_RATEMCS2;
+               break;
+       case MGN_MCS3:
+               ret = DESC90_RATEMCS3;
+               break;
+       case MGN_MCS4:
+               ret = DESC90_RATEMCS4;
+               break;
+       case MGN_MCS5:
+               ret = DESC90_RATEMCS5;
+               break;
+       case MGN_MCS6:
+               ret = DESC90_RATEMCS6;
+               break;
+       case MGN_MCS7:
+               ret = DESC90_RATEMCS7;
+               break;
+       case MGN_MCS8:
+               ret = DESC90_RATEMCS8;
+               break;
+       case MGN_MCS9:
+               ret = DESC90_RATEMCS9;
+               break;
+       case MGN_MCS10:
+               ret = DESC90_RATEMCS10;
+               break;
+       case MGN_MCS11:
+               ret = DESC90_RATEMCS11;
+               break;
+       case MGN_MCS12:
+               ret = DESC90_RATEMCS12;
+               break;
+       case MGN_MCS13:
+               ret = DESC90_RATEMCS13;
+               break;
+       case MGN_MCS14:
+               ret = DESC90_RATEMCS14;
+               break;
+       case MGN_MCS15:
+               ret = DESC90_RATEMCS15;
+               break;
+       case (0x80|0x20):
+               ret = DESC90_RATEMCS32;
+               break;
+       default:
+               break;
+       }
+       return ret;
+}
+
+u8 rtl8192_MapHwQueueToFirmwareQueue(u8 QueueID, u8 priority)
+{
+       u8 QueueSelect = 0x0;
+
+       switch (QueueID) {
+       case BE_QUEUE:
+               QueueSelect = QSLT_BE;
+               break;
+
+       case BK_QUEUE:
+               QueueSelect = QSLT_BK;
+               break;
+
+       case VO_QUEUE:
+               QueueSelect = QSLT_VO;
+               break;
+
+       case VI_QUEUE:
+               QueueSelect = QSLT_VI;
+               break;
+       case MGNT_QUEUE:
+               QueueSelect = QSLT_MGNT;
+               break;
+       case BEACON_QUEUE:
+               QueueSelect = QSLT_BEACON;
+               break;
+       case TXCMD_QUEUE:
+               QueueSelect = QSLT_CMD;
+               break;
+       case HIGH_QUEUE:
+               QueueSelect = QSLT_HIGH;
+               break;
+       default:
+               RT_TRACE(COMP_ERR, "TransmitTCB(): Impossible Queue Selection:"
+                        " %d \n", QueueID);
+               break;
+       }
+       return QueueSelect;
+}
+
+
+void  rtl8192_tx_fill_desc(struct net_device* dev, tx_desc * pdesc, cb_desc * cb_desc, struct sk_buff* skb)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    dma_addr_t mapping = pci_map_single(priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+    TX_FWINFO_8190PCI *pTxFwInfo = NULL;
+    pTxFwInfo = (PTX_FWINFO_8190PCI)skb->data;
+    memset(pTxFwInfo,0,sizeof(TX_FWINFO_8190PCI));
+    pTxFwInfo->TxHT = (cb_desc->data_rate&0x80)?1:0;
+    pTxFwInfo->TxRate = MRateToHwRate8190Pci((u8)cb_desc->data_rate);
+    pTxFwInfo->EnableCPUDur = cb_desc->bTxEnableFwCalcDur;
+    pTxFwInfo->Short   = rtl8192_QueryIsShort(pTxFwInfo->TxHT, pTxFwInfo->TxRate, cb_desc);
+
+    if (cb_desc->bAMPDUEnable) {
+        pTxFwInfo->AllowAggregation = 1;
+        pTxFwInfo->RxMF = cb_desc->ampdu_factor;
+        pTxFwInfo->RxAMD = cb_desc->ampdu_density;
+    } else {
+        pTxFwInfo->AllowAggregation = 0;
+        pTxFwInfo->RxMF = 0;
+        pTxFwInfo->RxAMD = 0;
+    }
+
+    pTxFwInfo->RtsEnable =     (cb_desc->bRTSEnable)?1:0;
+    pTxFwInfo->CtsEnable =     (cb_desc->bCTSEnable)?1:0;
+    pTxFwInfo->RtsSTBC =       (cb_desc->bRTSSTBC)?1:0;
+    pTxFwInfo->RtsHT=          (cb_desc->rts_rate&0x80)?1:0;
+    pTxFwInfo->RtsRate =               MRateToHwRate8190Pci((u8)cb_desc->rts_rate);
+    pTxFwInfo->RtsBandwidth = 0;
+    pTxFwInfo->RtsSubcarrier = cb_desc->RTSSC;
+    pTxFwInfo->RtsShort =      (pTxFwInfo->RtsHT==0)?(cb_desc->bRTSUseShortPreamble?1:0):(cb_desc->bRTSUseShortGI?1:0);
+    if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20_40)
+    {
+        if (cb_desc->bPacketBW)
+        {
+            pTxFwInfo->TxBandwidth = 1;
+#ifdef RTL8190P
+            pTxFwInfo->TxSubCarrier = 3;
+#else
+            pTxFwInfo->TxSubCarrier = 0;
+#endif
+        }
+        else
+        {
+            pTxFwInfo->TxBandwidth = 0;
+            pTxFwInfo->TxSubCarrier = priv->nCur40MhzPrimeSC;
+        }
+    } else {
+        pTxFwInfo->TxBandwidth = 0;
+        pTxFwInfo->TxSubCarrier = 0;
+    }
+
+    memset((u8*)pdesc,0,12);
+    pdesc->LINIP = 0;
+    pdesc->CmdInit = 1;
+    pdesc->Offset = sizeof(TX_FWINFO_8190PCI) + 8;
+    pdesc->PktSize = (u16)skb->len-sizeof(TX_FWINFO_8190PCI);
+
+    pdesc->SecCAMID= 0;
+    pdesc->RATid = cb_desc->RATRIndex;
+
+
+    pdesc->NoEnc = 1;
+    pdesc->SecType = 0x0;
+    if (cb_desc->bHwSec) {
+        static u8 tmp =0;
+        if (!tmp) {
+            RT_TRACE(COMP_DBG, "==>================hw sec\n");
+            tmp = 1;
+        }
+        switch (priv->rtllib->pairwise_key_type) {
+            case KEY_TYPE_WEP40:
+            case KEY_TYPE_WEP104:
+                pdesc->SecType = 0x1;
+                pdesc->NoEnc = 0;
+                break;
+            case KEY_TYPE_TKIP:
+                pdesc->SecType = 0x2;
+                pdesc->NoEnc = 0;
+                break;
+            case KEY_TYPE_CCMP:
+                pdesc->SecType = 0x3;
+                pdesc->NoEnc = 0;
+                break;
+            case KEY_TYPE_NA:
+                pdesc->SecType = 0x0;
+                pdesc->NoEnc = 1;
+                break;
+        }
+    }
+
+    pdesc->PktId = 0x0;
+
+    pdesc->QueueSelect = rtl8192_MapHwQueueToFirmwareQueue(cb_desc->queue_index, cb_desc->priority);
+    pdesc->TxFWInfoSize = sizeof(TX_FWINFO_8190PCI);
+
+    pdesc->DISFB = cb_desc->bTxDisableRateFallBack;
+    pdesc->USERATE = cb_desc->bTxUseDriverAssingedRate;
+
+    pdesc->FirstSeg =1;
+    pdesc->LastSeg = 1;
+    pdesc->TxBufferSize = skb->len;
+
+    pdesc->TxBuffAddr = cpu_to_le32(mapping);
+}
+
+void  rtl8192_tx_fill_cmd_desc(struct net_device* dev, tx_desc_cmd * entry,
+               cb_desc * cb_desc, struct sk_buff* skb)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    dma_addr_t mapping = pci_map_single(priv->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
+
+    memset(entry,0,12);
+    entry->LINIP = cb_desc->bLastIniPkt;
+    entry->FirstSeg = 1;
+    entry->LastSeg = 1;
+    if (cb_desc->bCmdOrInit == DESC_PACKET_TYPE_INIT) {
+        entry->CmdInit = DESC_PACKET_TYPE_INIT;
+    } else {
+       tx_desc* entry_tmp = (tx_desc*)entry;
+        entry_tmp->CmdInit = DESC_PACKET_TYPE_NORMAL;
+        entry_tmp->Offset = sizeof(TX_FWINFO_8190PCI) + 8;
+        entry_tmp->PktSize = (u16)(cb_desc->pkt_size + entry_tmp->Offset);
+        entry_tmp->QueueSelect = QSLT_CMD;
+        entry_tmp->TxFWInfoSize = 0x08;
+        entry_tmp->RATid = (u8)DESC_PACKET_TYPE_INIT;
+    }
+    entry->TxBufferSize = skb->len;
+    entry->TxBuffAddr = cpu_to_le32(mapping);
+    entry->OWN = 1;
+}
+
+u8 HwRateToMRate90(bool bIsHT, u8 rate)
+{
+       u8  ret_rate = 0x02;
+
+       if (!bIsHT) {
+               switch (rate) {
+                       case DESC90_RATE1M:   ret_rate = MGN_1M;         break;
+                       case DESC90_RATE2M:   ret_rate = MGN_2M;         break;
+                       case DESC90_RATE5_5M: ret_rate = MGN_5_5M;       break;
+                       case DESC90_RATE11M:  ret_rate = MGN_11M;        break;
+                       case DESC90_RATE6M:   ret_rate = MGN_6M;         break;
+                       case DESC90_RATE9M:   ret_rate = MGN_9M;         break;
+                       case DESC90_RATE12M:  ret_rate = MGN_12M;        break;
+                       case DESC90_RATE18M:  ret_rate = MGN_18M;        break;
+                       case DESC90_RATE24M:  ret_rate = MGN_24M;        break;
+                       case DESC90_RATE36M:  ret_rate = MGN_36M;        break;
+                       case DESC90_RATE48M:  ret_rate = MGN_48M;        break;
+                       case DESC90_RATE54M:  ret_rate = MGN_54M;        break;
+
+                       default:
+                                             RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n", rate, bIsHT);
+                                             break;
+               }
+
+       } else {
+               switch (rate) {
+                       case DESC90_RATEMCS0:   ret_rate = MGN_MCS0;    break;
+                       case DESC90_RATEMCS1:   ret_rate = MGN_MCS1;    break;
+                       case DESC90_RATEMCS2:   ret_rate = MGN_MCS2;    break;
+                       case DESC90_RATEMCS3:   ret_rate = MGN_MCS3;    break;
+                       case DESC90_RATEMCS4:   ret_rate = MGN_MCS4;    break;
+                       case DESC90_RATEMCS5:   ret_rate = MGN_MCS5;    break;
+                       case DESC90_RATEMCS6:   ret_rate = MGN_MCS6;    break;
+                       case DESC90_RATEMCS7:   ret_rate = MGN_MCS7;    break;
+                       case DESC90_RATEMCS8:   ret_rate = MGN_MCS8;    break;
+                       case DESC90_RATEMCS9:   ret_rate = MGN_MCS9;    break;
+                       case DESC90_RATEMCS10:  ret_rate = MGN_MCS10;   break;
+                       case DESC90_RATEMCS11:  ret_rate = MGN_MCS11;   break;
+                       case DESC90_RATEMCS12:  ret_rate = MGN_MCS12;   break;
+                       case DESC90_RATEMCS13:  ret_rate = MGN_MCS13;   break;
+                       case DESC90_RATEMCS14:  ret_rate = MGN_MCS14;   break;
+                       case DESC90_RATEMCS15:  ret_rate = MGN_MCS15;   break;
+                       case DESC90_RATEMCS32:  ret_rate = (0x80|0x20); break;
+
+                       default:
+                                               RT_TRACE(COMP_RECV, "HwRateToMRate90(): Non supported Rate [%x], bIsHT = %d!!!\n",rate, bIsHT);
+                                               break;
+               }
+       }
+
+       return ret_rate;
+}
+
+long
+rtl8192_signal_scale_mapping(struct r8192_priv * priv,
+       long currsig
+       )
+{
+       long retsig;
+
+#if defined RTL8192SE || defined RTL8192CE
+       if (priv->CustomerID == RT_CID_819x_Lenovo)
+       {
+               return currsig;
+       }
+       else if (priv->CustomerID == RT_CID_819x_Netcore)
+       {
+               if (currsig >= 31 && currsig <= 100)
+               {
+                       retsig = 100;
+               }
+               else if (currsig >= 21 && currsig <= 30)
+               {
+                       retsig = 90 + ((currsig - 20) / 1);
+               }
+               else if (currsig >= 11 && currsig <= 20)
+               {
+                       retsig = 80 + ((currsig - 10) / 1);
+               }
+               else if (currsig >= 7 && currsig <= 10)
+               {
+                       retsig = 69 + (currsig - 7);
+               }
+               else if (currsig == 6)
+               {
+                       retsig = 54;
+               }
+               else if (currsig == 5)
+               {
+                       retsig = 45;
+               }
+               else if (currsig == 4)
+               {
+                       retsig = 36;
+               }
+               else if (currsig == 3)
+               {
+                       retsig = 27;
+               }
+               else if (currsig == 2)
+               {
+                       retsig = 18;
+               }
+               else if (currsig == 1)
+               {
+                       retsig = 9;
+               }
+               else
+               {
+                       retsig = currsig;
+               }
+               return retsig;
+       }
+#endif
+
+       if (currsig >= 61 && currsig <= 100)
+       {
+               retsig = 90 + ((currsig - 60) / 4);
+       }
+       else if (currsig >= 41 && currsig <= 60)
+       {
+               retsig = 78 + ((currsig - 40) / 2);
+       }
+       else if (currsig >= 31 && currsig <= 40)
+       {
+               retsig = 66 + (currsig - 30);
+       }
+       else if (currsig >= 21 && currsig <= 30)
+       {
+               retsig = 54 + (currsig - 20);
+       }
+       else if (currsig >= 5 && currsig <= 20)
+       {
+               retsig = 42 + (((currsig - 5) * 2) / 3);
+       }
+       else if (currsig == 4)
+       {
+               retsig = 36;
+       }
+       else if (currsig == 3)
+       {
+               retsig = 27;
+       }
+       else if (currsig == 2)
+       {
+               retsig = 18;
+       }
+       else if (currsig == 1)
+       {
+               retsig = 9;
+       }
+       else
+       {
+               retsig = currsig;
+       }
+
+       return retsig;
+}
+
+
+#define                rx_hal_is_cck_rate(_pdrvinfo)\
+                       (_pdrvinfo->RxRate == DESC90_RATE1M ||\
+                       _pdrvinfo->RxRate == DESC90_RATE2M ||\
+                       _pdrvinfo->RxRate == DESC90_RATE5_5M ||\
+                       _pdrvinfo->RxRate == DESC90_RATE11M) &&\
+                       !_pdrvinfo->RxHT
+void rtl8192_query_rxphystatus(
+       struct r8192_priv * priv,
+       struct rtllib_rx_stats * pstats,
+       prx_desc  pdesc,
+       prx_fwinfo   pdrvinfo,
+       struct rtllib_rx_stats * precord_stats,
+       bool bpacket_match_bssid,
+       bool bpacket_toself,
+       bool bPacketBeacon,
+       bool bToSelfBA
+       )
+{
+       phy_sts_ofdm_819xpci_t* pofdm_buf;
+       phy_sts_cck_819xpci_t   *       pcck_buf;
+       phy_ofdm_rx_status_rxsc_sgien_exintfflag* prxsc;
+       u8                              *prxpkt;
+       u8                              i,max_spatial_stream, tmp_rxsnr, tmp_rxevm, rxsc_sgien_exflg;
+       char                            rx_pwr[4], rx_pwr_all=0;
+       char                            rx_snrX, rx_evmX;
+       u8                              evm, pwdb_all;
+       u32                     RSSI, total_rssi=0;
+       u8                              is_cck_rate=0;
+       u8                              rf_rx_num = 0;
+
+       static  u8              check_reg824 = 0;
+       static  u32             reg824_bit9 = 0;
+
+       priv->stats.numqry_phystatus++;
+
+
+       is_cck_rate = rx_hal_is_cck_rate(pdrvinfo);
+       memset(precord_stats, 0, sizeof(struct rtllib_rx_stats));
+       pstats->bPacketMatchBSSID = precord_stats->bPacketMatchBSSID = bpacket_match_bssid;
+       pstats->bPacketToSelf = precord_stats->bPacketToSelf = bpacket_toself;
+       pstats->bIsCCK = precord_stats->bIsCCK = is_cck_rate;
+       pstats->bPacketBeacon = precord_stats->bPacketBeacon = bPacketBeacon;
+       pstats->bToSelfBA = precord_stats->bToSelfBA = bToSelfBA;
+       if (check_reg824 == 0)
+       {
+               reg824_bit9 = rtl8192_QueryBBReg(priv->rtllib->dev, rFPGA0_XA_HSSIParameter2, 0x200);
+               check_reg824 = 1;
+       }
+
+
+       prxpkt = (u8*)pdrvinfo;
+
+       prxpkt += sizeof(rx_fwinfo);
+
+       pcck_buf = (phy_sts_cck_819xpci_t *)prxpkt;
+       pofdm_buf = (phy_sts_ofdm_819xpci_t *)prxpkt;
+
+       pstats->RxMIMOSignalQuality[0] = -1;
+       pstats->RxMIMOSignalQuality[1] = -1;
+       precord_stats->RxMIMOSignalQuality[0] = -1;
+       precord_stats->RxMIMOSignalQuality[1] = -1;
+
+       if (is_cck_rate)
+       {
+
+               u8 report;
+#ifdef RTL8190P
+               u8 tmp_pwdb;
+               char cck_adc_pwdb[4];
+#endif
+               priv->stats.numqry_phystatusCCK++;
+
+#ifdef RTL8190P
+               if (priv->rf_type == RF_2T4R && DM_RxPathSelTable.Enable && bpacket_match_bssid)
+               {
+                       for (i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+                       {
+                               tmp_pwdb = pcck_buf->adc_pwdb_X[i];
+                               cck_adc_pwdb[i] = (char)tmp_pwdb;
+                               cck_adc_pwdb[i] /= 2;
+                               pstats->cck_adc_pwdb[i] = precord_stats->cck_adc_pwdb[i] = cck_adc_pwdb[i];
+                       }
+               }
+#endif
+
+               if (!reg824_bit9)
+               {
+                       report = pcck_buf->cck_agc_rpt & 0xc0;
+                       report = report>>6;
+                       switch (report)
+                       {
+                               case 0x3:
+                                       rx_pwr_all = -35 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                               case 0x2:
+                                       rx_pwr_all = -23 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                               case 0x1:
+                                       rx_pwr_all = -11 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                               case 0x0:
+                                       rx_pwr_all = 8 - (pcck_buf->cck_agc_rpt & 0x3e);
+                                       break;
+                       }
+               }
+               else
+               {
+                       report = pcck_buf->cck_agc_rpt & 0x60;
+                       report = report>>5;
+                       switch (report)
+                       {
+                               case 0x3:
+                                       rx_pwr_all = -35 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+                                       break;
+                               case 0x2:
+                                       rx_pwr_all = -23 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1);
+                                       break;
+                               case 0x1:
+                                       rx_pwr_all = -11 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+                                       break;
+                               case 0x0:
+                                       rx_pwr_all = -8 - ((pcck_buf->cck_agc_rpt & 0x1f)<<1) ;
+                                       break;
+                       }
+               }
+
+               pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
+               pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
+               pstats->RecvSignalPower = rx_pwr_all;
+
+               if (bpacket_match_bssid)
+               {
+                       u8      sq;
+
+                       if (pstats->RxPWDBAll > 40)
+                       {
+                               sq = 100;
+                       }else
+                       {
+                               sq = pcck_buf->sq_rpt;
+
+                               if (pcck_buf->sq_rpt > 64)
+                                       sq = 0;
+                               else if (pcck_buf->sq_rpt < 20)
+                                       sq = 100;
+                               else
+                                       sq = ((64-sq) * 100) / 44;
+                       }
+                       pstats->SignalQuality = precord_stats->SignalQuality = sq;
+                       pstats->RxMIMOSignalQuality[0] = precord_stats->RxMIMOSignalQuality[0] = sq;
+                       pstats->RxMIMOSignalQuality[1] = precord_stats->RxMIMOSignalQuality[1] = -1;
+               }
+       }
+       else
+       {
+               priv->stats.numqry_phystatusHT++;
+               for (i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+               {
+                       if (priv->brfpath_rxenable[i])
+                               rf_rx_num++;
+
+#ifdef RTL8190P
+                       rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 106;
+#else
+                       rx_pwr[i] = ((pofdm_buf->trsw_gain_X[i]&0x3F)*2) - 110;
+#endif
+
+                       tmp_rxsnr = pofdm_buf->rxsnr_X[i];
+                       rx_snrX = (char)(tmp_rxsnr);
+                       rx_snrX /= 2;
+                       priv->stats.rxSNRdB[i] = (long)rx_snrX;
+
+                       RSSI = rtl819x_query_rxpwrpercentage(rx_pwr[i]);
+                       if (priv->brfpath_rxenable[i])
+                               total_rssi += RSSI;
+
+                       if (bpacket_match_bssid)
+                       {
+                               pstats->RxMIMOSignalStrength[i] =(u8) RSSI;
+                               precord_stats->RxMIMOSignalStrength[i] =(u8) RSSI;
+                       }
+               }
+
+
+               rx_pwr_all = (((pofdm_buf->pwdb_all ) >> 1 )& 0x7f) -106;
+               pwdb_all = rtl819x_query_rxpwrpercentage(rx_pwr_all);
+
+               pstats->RxPWDBAll = precord_stats->RxPWDBAll = pwdb_all;
+               pstats->RxPower = precord_stats->RxPower =      rx_pwr_all;
+               pstats->RecvSignalPower = rx_pwr_all;
+               if (pdrvinfo->RxHT && pdrvinfo->RxRate>=DESC90_RATEMCS8 &&
+                       pdrvinfo->RxRate<=DESC90_RATEMCS15)
+                       max_spatial_stream = 2;
+               else
+                       max_spatial_stream = 1;
+
+               for (i=0; i<max_spatial_stream; i++)
+               {
+                       tmp_rxevm = pofdm_buf->rxevm_X[i];
+                       rx_evmX = (char)(tmp_rxevm);
+
+                       rx_evmX /= 2;
+
+                       evm = rtl819x_evm_dbtopercentage(rx_evmX);
+                       if (bpacket_match_bssid)
+                       {
+                               if (i==0)
+                                       pstats->SignalQuality = precord_stats->SignalQuality = (u8)(evm & 0xff);
+                               pstats->RxMIMOSignalQuality[i] = precord_stats->RxMIMOSignalQuality[i] = (u8)(evm & 0xff);
+                       }
+               }
+
+
+               rxsc_sgien_exflg = pofdm_buf->rxsc_sgien_exflg;
+               prxsc = (phy_ofdm_rx_status_rxsc_sgien_exintfflag *)&rxsc_sgien_exflg;
+               if (pdrvinfo->BW)
+                       priv->stats.received_bwtype[1+prxsc->rxsc]++;
+               else
+                       priv->stats.received_bwtype[0]++;
+       }
+
+       if (is_cck_rate)
+       {
+               pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl8192_signal_scale_mapping(priv,(long)pwdb_all));
+
+       }
+       else
+       {
+               if (rf_rx_num != 0)
+                       pstats->SignalStrength = precord_stats->SignalStrength = (u8)(rtl8192_signal_scale_mapping(priv,(long)(total_rssi/=rf_rx_num)));
+       }
+}
+
+void rtl8192_process_phyinfo(struct r8192_priv * priv, u8* buffer,struct rtllib_rx_stats * pprevious_stats, struct rtllib_rx_stats * pcurrent_stats)
+{
+       bool bcheck = false;
+       u8      rfpath;
+       u32 nspatial_stream, tmp_val;
+       static u32 slide_rssi_index=0, slide_rssi_statistics=0;
+       static u32 slide_evm_index=0, slide_evm_statistics=0;
+       static u32 last_rssi=0, last_evm=0;
+       static u32 slide_beacon_adc_pwdb_index=0, slide_beacon_adc_pwdb_statistics=0;
+       static u32 last_beacon_adc_pwdb=0;
+
+       struct rtllib_hdr_3addr *hdr;
+       u16 sc ;
+       unsigned int frag,seq;
+       hdr = (struct rtllib_hdr_3addr *)buffer;
+       sc = le16_to_cpu(hdr->seq_ctl);
+       frag = WLAN_GET_SEQ_FRAG(sc);
+       seq = WLAN_GET_SEQ_SEQ(sc);
+       pcurrent_stats->Seq_Num = seq;
+       if (!pprevious_stats->bIsAMPDU)
+               bcheck = true;
+
+       if (slide_rssi_statistics++ >= PHY_RSSI_SLID_WIN_MAX)
+       {
+               slide_rssi_statistics = PHY_RSSI_SLID_WIN_MAX;
+               last_rssi = priv->stats.slide_signal_strength[slide_rssi_index];
+               priv->stats.slide_rssi_total -= last_rssi;
+       }
+       priv->stats.slide_rssi_total += pprevious_stats->SignalStrength;
+
+       priv->stats.slide_signal_strength[slide_rssi_index++] = pprevious_stats->SignalStrength;
+       if (slide_rssi_index >= PHY_RSSI_SLID_WIN_MAX)
+               slide_rssi_index = 0;
+
+       tmp_val = priv->stats.slide_rssi_total/slide_rssi_statistics;
+       priv->stats.signal_strength = rtl819x_translate_todbm(priv, (u8)tmp_val);
+       pcurrent_stats->rssi = priv->stats.signal_strength;
+       if (!pprevious_stats->bPacketMatchBSSID)
+       {
+               if (!pprevious_stats->bToSelfBA)
+                       return;
+       }
+
+       if (!bcheck)
+               return;
+
+       rtl819x_process_cck_rxpathsel(priv,pprevious_stats);
+
+       priv->stats.num_process_phyinfo++;
+       if (!pprevious_stats->bIsCCK && pprevious_stats->bPacketToSelf)
+       {
+               for (rfpath = RF90_PATH_A; rfpath < RF90_PATH_C; rfpath++)
+               {
+                       if (!rtl8192_phy_CheckIsLegalRFPath(priv->rtllib->dev, rfpath))
+                               continue;
+                       RT_TRACE(COMP_DBG,"Jacken -> pPreviousstats->RxMIMOSignalStrength[rfpath]  = %d \n" ,pprevious_stats->RxMIMOSignalStrength[rfpath] );
+                       if (priv->stats.rx_rssi_percentage[rfpath] == 0)
+                       {
+                               priv->stats.rx_rssi_percentage[rfpath] = pprevious_stats->RxMIMOSignalStrength[rfpath];
+                       }
+                       if (pprevious_stats->RxMIMOSignalStrength[rfpath]  > priv->stats.rx_rssi_percentage[rfpath])
+                       {
+                               priv->stats.rx_rssi_percentage[rfpath] =
+                                       ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
+                               priv->stats.rx_rssi_percentage[rfpath] = priv->stats.rx_rssi_percentage[rfpath]  + 1;
+                       }
+                       else
+                       {
+                               priv->stats.rx_rssi_percentage[rfpath] =
+                                       ( (priv->stats.rx_rssi_percentage[rfpath]*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxMIMOSignalStrength[rfpath])) /(Rx_Smooth_Factor);
+                       }
+                       RT_TRACE(COMP_DBG,"Jacken -> priv->RxStats.RxRSSIPercentage[rfPath]  = %d \n" ,priv->stats.rx_rssi_percentage[rfpath] );
+               }
+       }
+
+
+       if (pprevious_stats->bPacketBeacon)
+       {
+               if (slide_beacon_adc_pwdb_statistics++ >= PHY_Beacon_RSSI_SLID_WIN_MAX)
+               {
+                       slide_beacon_adc_pwdb_statistics = PHY_Beacon_RSSI_SLID_WIN_MAX;
+                       last_beacon_adc_pwdb = priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index];
+                       priv->stats.Slide_Beacon_Total -= last_beacon_adc_pwdb;
+               }
+               priv->stats.Slide_Beacon_Total += pprevious_stats->RxPWDBAll;
+               priv->stats.Slide_Beacon_pwdb[slide_beacon_adc_pwdb_index] = pprevious_stats->RxPWDBAll;
+               slide_beacon_adc_pwdb_index++;
+               if (slide_beacon_adc_pwdb_index >= PHY_Beacon_RSSI_SLID_WIN_MAX)
+                       slide_beacon_adc_pwdb_index = 0;
+               pprevious_stats->RxPWDBAll = priv->stats.Slide_Beacon_Total/slide_beacon_adc_pwdb_statistics;
+               if (pprevious_stats->RxPWDBAll >= 3)
+                       pprevious_stats->RxPWDBAll -= 3;
+       }
+
+       RT_TRACE(COMP_RXDESC, "Smooth %s PWDB = %d\n",
+                               pprevious_stats->bIsCCK? "CCK": "OFDM",
+                               pprevious_stats->RxPWDBAll);
+
+       if (pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
+       {
+               if (priv->undecorated_smoothed_pwdb < 0)
+               {
+                       priv->undecorated_smoothed_pwdb = pprevious_stats->RxPWDBAll;
+               }
+               if (pprevious_stats->RxPWDBAll > (u32)priv->undecorated_smoothed_pwdb)
+               {
+                       priv->undecorated_smoothed_pwdb =
+                                       ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
+                       priv->undecorated_smoothed_pwdb = priv->undecorated_smoothed_pwdb + 1;
+               }
+               else
+               {
+                       priv->undecorated_smoothed_pwdb =
+                                       ( ((priv->undecorated_smoothed_pwdb)*(Rx_Smooth_Factor-1)) +
+                                       (pprevious_stats->RxPWDBAll)) /(Rx_Smooth_Factor);
+               }
+               rtl819x_update_rxsignalstatistics8190pci(priv,pprevious_stats);
+       }
+
+       if (pprevious_stats->SignalQuality == 0)
+       {
+       }
+       else
+       {
+               if (pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA){
+                       if (slide_evm_statistics++ >= PHY_RSSI_SLID_WIN_MAX){
+                               slide_evm_statistics = PHY_RSSI_SLID_WIN_MAX;
+                               last_evm = priv->stats.slide_evm[slide_evm_index];
+                               priv->stats.slide_evm_total -= last_evm;
+                       }
+
+                       priv->stats.slide_evm_total += pprevious_stats->SignalQuality;
+
+                       priv->stats.slide_evm[slide_evm_index++] = pprevious_stats->SignalQuality;
+                       if (slide_evm_index >= PHY_RSSI_SLID_WIN_MAX)
+                               slide_evm_index = 0;
+
+                       tmp_val = priv->stats.slide_evm_total/slide_evm_statistics;
+                       priv->stats.signal_quality = tmp_val;
+                       priv->stats.last_signal_strength_inpercent = tmp_val;
+               }
+
+               if (pprevious_stats->bPacketToSelf || pprevious_stats->bPacketBeacon || pprevious_stats->bToSelfBA)
+               {
+                       for (nspatial_stream = 0; nspatial_stream<2 ; nspatial_stream++)
+                       {
+                               if (pprevious_stats->RxMIMOSignalQuality[nspatial_stream] != -1)
+                               {
+                                       if (priv->stats.rx_evm_percentage[nspatial_stream] == 0)
+                                       {
+                                               priv->stats.rx_evm_percentage[nspatial_stream] = pprevious_stats->RxMIMOSignalQuality[nspatial_stream];
+                                       }
+                                       priv->stats.rx_evm_percentage[nspatial_stream] =
+                                               ( (priv->stats.rx_evm_percentage[nspatial_stream]* (Rx_Smooth_Factor-1)) +
+                                               (pprevious_stats->RxMIMOSignalQuality[nspatial_stream]* 1)) / (Rx_Smooth_Factor);
+                               }
+                       }
+               }
+       }
+
+}
+
+
+void rtl8192_TranslateRxSignalStuff(struct net_device *dev,
+        struct sk_buff *skb,
+        struct rtllib_rx_stats * pstats,
+        prx_desc pdesc,
+        prx_fwinfo pdrvinfo)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+    bool bpacket_match_bssid, bpacket_toself;
+    bool bPacketBeacon=false;
+    struct rtllib_hdr_3addr *hdr;
+    bool bToSelfBA=false;
+    static struct rtllib_rx_stats  previous_stats;
+    u16 fc,type;
+
+
+    u8* tmp_buf;
+    u8 *praddr;
+
+    tmp_buf = skb->data + pstats->RxDrvInfoSize + pstats->RxBufShift;
+
+    hdr = (struct rtllib_hdr_3addr *)tmp_buf;
+    fc = le16_to_cpu(hdr->frame_ctl);
+    type = WLAN_FC_GET_TYPE(fc);
+    praddr = hdr->addr1;
+
+    bpacket_match_bssid = ((RTLLIB_FTYPE_CTL != type) &&
+            (!compare_ether_addr(priv->rtllib->current_network.bssid,
+                      (fc & RTLLIB_FCTL_TODS)? hdr->addr1 :
+                      (fc & RTLLIB_FCTL_FROMDS )? hdr->addr2 : hdr->addr3))
+            && (!pstats->bHwError) && (!pstats->bCRC)&& (!pstats->bICV));
+    bpacket_toself =  bpacket_match_bssid & (!compare_ether_addr(praddr, priv->rtllib->dev->dev_addr));
+    if (WLAN_FC_GET_FRAMETYPE(fc)== RTLLIB_STYPE_BEACON)
+    {
+        bPacketBeacon = true;
+    }
+    if (bpacket_match_bssid)
+    {
+        priv->stats.numpacket_matchbssid++;
+    }
+    if (bpacket_toself){
+        priv->stats.numpacket_toself++;
+    }
+    rtl8192_process_phyinfo(priv, tmp_buf,&previous_stats, pstats);
+    rtl8192_query_rxphystatus(priv, pstats, pdesc, pdrvinfo, &previous_stats, bpacket_match_bssid,
+            bpacket_toself ,bPacketBeacon, bToSelfBA);
+    rtl8192_record_rxdesc_forlateruse(pstats, &previous_stats);
+}
+
+void rtl8192_UpdateReceivedRateHistogramStatistics(
+       struct net_device *dev,
+       struct rtllib_rx_stats* pstats
+       )
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       u32 rcvType=1;
+       u32 rateIndex;
+       u32 preamble_guardinterval;
+
+       if (pstats->bCRC)
+               rcvType = 2;
+       else if (pstats->bICV)
+               rcvType = 3;
+
+       if (pstats->bShortPreamble)
+               preamble_guardinterval = 1;
+       else
+               preamble_guardinterval = 0;
+
+       switch (pstats->rate)
+       {
+               case MGN_1M:    rateIndex = 0;  break;
+               case MGN_2M:    rateIndex = 1;  break;
+               case MGN_5_5M:  rateIndex = 2;  break;
+               case MGN_11M:   rateIndex = 3;  break;
+               case MGN_6M:    rateIndex = 4;  break;
+               case MGN_9M:    rateIndex = 5;  break;
+               case MGN_12M:   rateIndex = 6;  break;
+               case MGN_18M:   rateIndex = 7;  break;
+               case MGN_24M:   rateIndex = 8;  break;
+               case MGN_36M:   rateIndex = 9;  break;
+               case MGN_48M:   rateIndex = 10; break;
+               case MGN_54M:   rateIndex = 11; break;
+               case MGN_MCS0:  rateIndex = 12; break;
+               case MGN_MCS1:  rateIndex = 13; break;
+               case MGN_MCS2:  rateIndex = 14; break;
+               case MGN_MCS3:  rateIndex = 15; break;
+               case MGN_MCS4:  rateIndex = 16; break;
+               case MGN_MCS5:  rateIndex = 17; break;
+               case MGN_MCS6:  rateIndex = 18; break;
+               case MGN_MCS7:  rateIndex = 19; break;
+               case MGN_MCS8:  rateIndex = 20; break;
+               case MGN_MCS9:  rateIndex = 21; break;
+               case MGN_MCS10: rateIndex = 22; break;
+               case MGN_MCS11: rateIndex = 23; break;
+               case MGN_MCS12: rateIndex = 24; break;
+               case MGN_MCS13: rateIndex = 25; break;
+               case MGN_MCS14: rateIndex = 26; break;
+               case MGN_MCS15: rateIndex = 27; break;
+               default:        rateIndex = 28; break;
+       }
+       priv->stats.received_preamble_GI[preamble_guardinterval][rateIndex]++;
+       priv->stats.received_rate_histogram[0][rateIndex]++;
+       priv->stats.received_rate_histogram[rcvType][rateIndex]++;
+}
+
+bool rtl8192_rx_query_status_desc(struct net_device* dev, struct rtllib_rx_stats*  stats,
+               rx_desc *pdesc, struct sk_buff* skb)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       stats->bICV = pdesc->ICV;
+       stats->bCRC = pdesc->CRC32;
+       stats->bHwError = pdesc->CRC32 | pdesc->ICV;
+
+       stats->Length = pdesc->Length;
+       if (stats->Length < 24)
+               stats->bHwError |= 1;
+
+       if (stats->bHwError) {
+               stats->bShift = false;
+
+               if (pdesc->CRC32) {
+                       if (pdesc->Length <500)
+                               priv->stats.rxcrcerrmin++;
+                       else if (pdesc->Length >1000)
+                               priv->stats.rxcrcerrmax++;
+                       else
+                               priv->stats.rxcrcerrmid++;
+               }
+               return false;
+       } else {
+               prx_fwinfo pDrvInfo = NULL;
+               stats->RxDrvInfoSize = pdesc->RxDrvInfoSize;
+               stats->RxBufShift = ((pdesc->Shift)&0x03);
+               stats->Decrypted = !pdesc->SWDec;
+
+               pDrvInfo = (rx_fwinfo *)(skb->data + stats->RxBufShift);
+
+               stats->rate = HwRateToMRate90((bool)pDrvInfo->RxHT, (u8)pDrvInfo->RxRate);
+               stats->bShortPreamble = pDrvInfo->SPLCP;
+
+               rtl8192_UpdateReceivedRateHistogramStatistics(dev, stats);
+
+               stats->bIsAMPDU = (pDrvInfo->PartAggr==1);
+               stats->bFirstMPDU = (pDrvInfo->PartAggr==1) && (pDrvInfo->FirstAGGR==1);
+
+               stats->TimeStampLow = pDrvInfo->TSFL;
+               stats->TimeStampHigh = read_nic_dword(dev, TSFR+4);
+
+               rtl819x_UpdateRxPktTimeStamp(dev, stats);
+
+               if ((stats->RxBufShift + stats->RxDrvInfoSize) > 0)
+                       stats->bShift = 1;
+
+               stats->RxIs40MHzPacket = pDrvInfo->BW;
+
+               rtl8192_TranslateRxSignalStuff(dev,skb, stats, pdesc, pDrvInfo);
+
+               if (pDrvInfo->FirstAGGR==1 || pDrvInfo->PartAggr == 1)
+                       RT_TRACE(COMP_RXDESC, "pDrvInfo->FirstAGGR = %d, pDrvInfo->PartAggr = %d\n",
+                                       pDrvInfo->FirstAGGR, pDrvInfo->PartAggr);
+               skb_trim(skb, skb->len - 4/*sCrcLng*/);
+
+
+               stats->packetlength = stats->Length-4;
+               stats->fraglength = stats->packetlength;
+               stats->fragoffset = 0;
+               stats->ntotalfrag = 1;
+               return true;
+       }
+}
+
+void rtl8192_halt_adapter(struct net_device *dev, bool reset)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int i;
+       u8      OpMode;
+       u8      u1bTmp;
+       u32     ulRegRead;
+#ifdef RTL8190P
+       u8      ucRegRead;
+#endif
+
+       OpMode = RT_OP_MODE_NO_LINK;
+       priv->rtllib->SetHwRegHandler(dev, HW_VAR_MEDIA_STATUS, &OpMode);
+
+#if 1
+       if (!priv->rtllib->bSupportRemoteWakeUp)
+       {
+               u1bTmp = 0x0;
+               write_nic_byte(dev, CMDR, u1bTmp);
+       }
+#else
+       cmd=read_nic_byte(dev,CMDR);
+       write_nic_byte(dev, CMDR, cmd &~ (CR_TE|CR_RE));
+#endif
+
+       mdelay(20);
+
+       if (!reset)
+       {
+               mdelay(150);
+
+#ifdef RTL8192E
+                       priv->bHwRfOffAction = 2;
+#endif
+
+               if (!priv->rtllib->bSupportRemoteWakeUp)
+               {
+#ifdef RTL8190P
+                       {
+                               PHY_SetRtl8190pRfOff(dev);
+                       }
+#elif defined RTL8192E
+                       {
+                               PHY_SetRtl8192eRfOff(dev);
+                       }
+#endif
+                       ulRegRead = read_nic_dword(dev,CPU_GEN);
+                       ulRegRead|=CPU_GEN_SYSTEM_RESET;
+                       write_nic_dword(dev,CPU_GEN, ulRegRead);
+               }
+               else
+               {
+                       write_nic_dword(dev, WFCRC0, 0xffffffff);
+                       write_nic_dword(dev, WFCRC1, 0xffffffff);
+                       write_nic_dword(dev, WFCRC2, 0xffffffff);
+
+
+#ifdef RTL8190P
+                       {
+                               ucRegRead = read_nic_byte(dev, GPO);
+                               ucRegRead |= BIT0;
+                               write_nic_byte(dev, GPO, ucRegRead);
+                       }
+#endif
+                       write_nic_byte(dev, PMR, 0x5);
+                       write_nic_byte(dev, MacBlkCtrl, 0xa);
+               }
+       }
+
+       for (i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_purge(&priv->rtllib->skb_waitQ [i]);
+       }
+       for (i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_purge(&priv->rtllib->skb_aggQ [i]);
+       }
+
+       skb_queue_purge(&priv->skb_queue);
+       return;
+}
+
+void rtl8192_update_ratr_table(struct net_device* dev)
+{
+       struct r8192_priv* priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+       u8* pMcsRate = ieee->dot11HTOperationalRateSet;
+       u32 ratr_value = 0;
+       u8 rate_index = 0;
+
+       rtl8192_config_rate(dev, (u16*)(&ratr_value));
+       ratr_value |= (*(u16*)(pMcsRate)) << 12;
+       switch (ieee->mode)
+       {
+               case IEEE_A:
+                       ratr_value &= 0x00000FF0;
+                       break;
+               case IEEE_B:
+                       ratr_value &= 0x0000000F;
+                       break;
+               case IEEE_G:
+               case IEEE_G|IEEE_B:
+                       ratr_value &= 0x00000FF7;
+                       break;
+               case IEEE_N_24G:
+               case IEEE_N_5G:
+                       if (ieee->pHTInfo->PeerMimoPs == 0)
+                               ratr_value &= 0x0007F007;
+                       else{
+                               if (priv->rf_type == RF_1T2R)
+                                       ratr_value &= 0x000FF007;
+                               else
+                                       ratr_value &= 0x0F81F007;
+                       }
+                       break;
+               default:
+                       break;
+       }
+       ratr_value &= 0x0FFFFFFF;
+       if (ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI40MHz){
+               ratr_value |= 0x80000000;
+       }else if (!ieee->pHTInfo->bCurTxBW40MHz && ieee->pHTInfo->bCurShortGI20MHz){
+               ratr_value |= 0x80000000;
+       }
+       write_nic_dword(dev, RATR0+rate_index*4, ratr_value);
+       write_nic_byte(dev, UFWP, 1);
+}
+
+void
+rtl8192_InitializeVariables(struct net_device  *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+#ifdef RTL8190P
+       strcpy(priv->nick, "rtl8190p");
+#elif defined(RTL8192E)
+       strcpy(priv->nick, "rtl8192E");
+#endif
+
+#ifdef _ENABLE_SW_BEACON
+       priv->rtllib->softmac_features  = IEEE_SOFTMAC_SCAN |
+               IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
+               IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE  |
+               IEEE_SOFTMAC_BEACONS;
+#else
+       priv->rtllib->softmac_features  = IEEE_SOFTMAC_SCAN |
+               IEEE_SOFTMAC_ASSOCIATE | IEEE_SOFTMAC_PROBERQ |
+               IEEE_SOFTMAC_PROBERS | IEEE_SOFTMAC_TX_QUEUE /* |
+               IEEE_SOFTMAC_BEACONS*/;
+#endif
+
+       priv->rtllib->tx_headroom = sizeof(TX_FWINFO_8190PCI);
+
+       priv->ShortRetryLimit = 0x30;
+       priv->LongRetryLimit = 0x30;
+
+       priv->EarlyRxThreshold = 7;
+       priv->pwrGroupCnt = 0;
+
+       priv->bIgnoreSilentReset = false;
+       priv->enable_gpio0 = 0;
+
+       priv->TransmitConfig = 0;
+
+       priv->ReceiveConfig = RCR_ADD3  |
+               RCR_AMF | RCR_ADF |
+               RCR_AICV |
+               RCR_AB | RCR_AM | RCR_APM |
+               RCR_AAP | ((u32)7<<RCR_MXDMA_OFFSET) |
+               ((u32)7 << RCR_FIFO_OFFSET) | RCR_ONLYERLPKT;
+
+       priv->irq_mask[0] =     (u32)(IMR_ROK | IMR_VODOK | IMR_VIDOK | IMR_BEDOK | IMR_BKDOK |\
+                               IMR_HCCADOK | IMR_MGNTDOK | IMR_COMDOK | IMR_HIGHDOK |\
+                               IMR_BDOK | IMR_RXCMDOK | IMR_TIMEOUT0 | IMR_RDU | IMR_RXFOVW    |\
+                               IMR_TXFOVW | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
+
+
+       priv->MidHighPwrTHR_L1 = 0x3B;
+       priv->MidHighPwrTHR_L2 = 0x40;
+       priv->PwrDomainProtect = false;
+
+        priv->bfirst_after_down = 0;
+}
+
+void rtl8192_EnableInterrupt(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       priv->irq_enabled = 1;
+
+#ifdef RTL8192CE
+       write_nic_dword(dev, REG_HIMR, priv->irq_mask[0]&0xFFFFFFFF);
+#else
+       write_nic_dword(dev,INTA_MASK, priv->irq_mask[0]);
+#endif
+
+#ifdef RTL8192SE
+       write_nic_dword(dev,INTA_MASK+4, priv->irq_mask[1]&0x3F);
+#endif
+
+}
+
+void rtl8192_DisableInterrupt(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+#ifdef RTL8192CE
+       write_nic_dword(dev, REG_HIMR, IMR8190_DISABLED);
+#else
+       write_nic_dword(dev,INTA_MASK,0);
+#endif
+
+#ifdef RTL8192SE
+       write_nic_dword(dev,INTA_MASK + 4,0);
+#endif
+       priv->irq_enabled = 0;
+}
+
+void rtl8192_ClearInterrupt(struct net_device *dev)
+{
+       u32 tmp = 0;
+#ifdef RTL8192CE
+       tmp = read_nic_dword(dev, REG_HISR);
+       write_nic_dword(dev, REG_HISR, tmp);
+#else
+       tmp = read_nic_dword(dev, ISR);
+       write_nic_dword(dev, ISR, tmp);
+#endif
+
+#ifdef RTL8192SE
+       tmp = read_nic_dword(dev, ISR+4);
+       write_nic_dword(dev, ISR+4, tmp);
+#endif
+}
+
+
+void rtl8192_enable_rx(struct net_device *dev)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+    write_nic_dword(dev, RDQDA,priv->rx_ring_dma[RX_MPDU_QUEUE]);
+}
+
+u32 TX_DESC_BASE[] = {BKQDA, BEQDA, VIQDA, VOQDA, HCCAQDA, CQDA, MQDA, HQDA, BQDA};
+void rtl8192_enable_tx(struct net_device *dev)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+    u32 i;
+
+    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+        write_nic_dword(dev, TX_DESC_BASE[i], priv->tx_ring[i].dma);
+}
+
+
+void rtl8192_beacon_disable(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       u32 reg;
+
+#ifdef RTL8192CE
+       reg = read_nic_dword(priv->rtllib->dev,REG_HIMR);
+
+       reg &= ~(IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
+       write_nic_dword(priv->rtllib->dev, REG_HIMR, reg);
+#else
+       reg = read_nic_dword(priv->rtllib->dev,INTA_MASK);
+
+       reg &= ~(IMR_BcnInt | IMR_BcnInt | IMR_TBDOK | IMR_TBDER);
+       write_nic_dword(priv->rtllib->dev, INTA_MASK, reg);
+#endif
+}
+
+void rtl8192_interrupt_recognized(struct net_device *dev, u32 *p_inta, u32 *p_intb)
+{
+#ifdef RTL8192SE
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       *p_inta = read_nic_dword(dev, ISR) & priv->irq_mask[0];
+#else
+       *p_inta = read_nic_dword(dev, ISR) ;
+#endif
+       write_nic_dword(dev,ISR,*p_inta);
+#ifdef RTL8192SE
+       *p_intb = read_nic_dword(dev, ISR+4);
+       write_nic_dword(dev, ISR+4, *p_intb);
+#endif
+}
+
+bool rtl8192_HalRxCheckStuck(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u16               RegRxCounter = read_nic_word(dev, 0x130);
+       bool              bStuck = false;
+       static u8         rx_chk_cnt = 0;
+       u32             SlotIndex = 0, TotalRxStuckCount = 0;
+       u8              i;
+       u8              SilentResetRxSoltNum = 4;
+
+       RT_TRACE(COMP_RESET,"%s(): RegRxCounter is %d,RxCounter is %d\n",
+                       __func__, RegRxCounter,priv->RxCounter);
+
+       rx_chk_cnt++;
+       if (priv->undecorated_smoothed_pwdb >= (RateAdaptiveTH_High+5))
+       {
+               rx_chk_cnt = 0;
+       } else if ((priv->undecorated_smoothed_pwdb < (RateAdaptiveTH_High+5)) &&
+               (((priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) &&
+                 (priv->undecorated_smoothed_pwdb >= RateAdaptiveTH_Low_40M)) ||
+               ((priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20) &&
+                (priv->undecorated_smoothed_pwdb>=RateAdaptiveTH_Low_20M)))) {
+               if (rx_chk_cnt < 2) {
+                       return bStuck;
+               } else {
+                       rx_chk_cnt = 0;
+               }
+       } else if ((((priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20) &&
+                 (priv->undecorated_smoothed_pwdb < RateAdaptiveTH_Low_40M)) ||
+               ((priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20) &&
+                (priv->undecorated_smoothed_pwdb < RateAdaptiveTH_Low_20M))) &&
+               priv->undecorated_smoothed_pwdb >= VeryLowRSSI) {
+               if (rx_chk_cnt < 4) {
+                       return bStuck;
+               } else {
+                       rx_chk_cnt = 0;
+               }
+       } else {
+               if (rx_chk_cnt < 8) {
+                       return bStuck;
+               } else {
+                       rx_chk_cnt = 0;
+               }
+       }
+
+
+       SlotIndex = (priv->SilentResetRxSlotIndex++)%SilentResetRxSoltNum;
+
+       if (priv->RxCounter==RegRxCounter)
+       {
+               priv->SilentResetRxStuckEvent[SlotIndex] = 1;
+
+               for ( i = 0; i < SilentResetRxSoltNum ; i++ )
+                       TotalRxStuckCount += priv->SilentResetRxStuckEvent[i];
+
+               if (TotalRxStuckCount  == SilentResetRxSoltNum)
+               {
+               bStuck = true;
+                       for ( i = 0; i < SilentResetRxSoltNum ; i++ )
+                               TotalRxStuckCount += priv->SilentResetRxStuckEvent[i];
+               }
+
+
+       } else {
+               priv->SilentResetRxStuckEvent[SlotIndex] = 0;
+       }
+
+       priv->RxCounter = RegRxCounter;
+
+       return bStuck;
+}
+
+bool rtl8192_HalTxCheckStuck(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       bool    bStuck = false;
+#if defined(RTL8192E) || defined(RTL8190P)
+       u16    RegTxCounter = read_nic_word(dev, 0x128);
+#elif defined (RTL8192SE) || defined (RTL8192CE)
+       u16     RegTxCounter = read_nic_word(dev, 0x366);
+#else
+       u16     RegTxCounter = priv->TxCounter + 1;
+       WARN_ON(1);
+#endif
+
+       RT_TRACE(COMP_RESET, "%s():RegTxCounter is %d,TxCounter is %d\n",
+                       __func__,RegTxCounter,priv->TxCounter);
+
+       if (priv->TxCounter == RegTxCounter)
+               bStuck = true;
+
+       priv->TxCounter = RegTxCounter;
+
+       return bStuck;
+}
+
+bool rtl8192_GetNmodeSupportBySecCfg(struct net_device *dev)
+{
+#ifdef RTL8192SE
+       return true;
+#else
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device *ieee = priv->rtllib;
+       if (ieee->rtllib_ap_sec_type &&
+          (ieee->rtllib_ap_sec_type(priv->rtllib)&(SEC_ALG_WEP|SEC_ALG_TKIP))) {
+               return false;
+       } else {
+               return true;
+       }
+#endif
+}
+
+bool rtl8192_GetHalfNmodeSupportByAPs(struct net_device* dev)
+{
+#ifdef RTL8192SE
+       return false;
+#else
+       bool                    Reval;
+       struct r8192_priv* priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       if (ieee->bHalfWirelessN24GMode == true)
+               Reval = true;
+       else
+               Reval =  false;
+
+       return Reval;
+#endif
+}
+
+u8 rtl8192_QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc)
+{
+       u8   tmp_Short;
+
+       tmp_Short = (TxHT==1)?((tcb_desc->bUseShortGI)?1:0):((tcb_desc->bUseShortPreamble)?1:0);
+#if defined RTL8192SE || defined RTL8192CE
+       if (TxHT==1 && TxRate != DESC92S_RATEMCS15)
+#elif defined RTL8192E || defined RTL8190P
+       if (TxHT==1 && TxRate != DESC90_RATEMCS15)
+#endif
+               tmp_Short = 0;
+
+       return tmp_Short;
+}
+
+void
+ActUpdateChannelAccessSetting(
+       struct net_device*                      dev,
+       WIRELESS_MODE                   WirelessMode,
+       PCHANNEL_ACCESS_SETTING ChnlAccessSetting
+       )
+{
+               struct r8192_priv* priv = rtllib_priv(dev);
+
+               return;
+
+               {
+                       u16     SIFS_Timer;
+
+                       if (WirelessMode == WIRELESS_MODE_G)
+                               SIFS_Timer = 0x0e0e;
+                       else
+                                SIFS_Timer = priv->SifsTime;
+
+                       priv->rtllib->SetHwRegHandler( dev, HW_VAR_SIFS,  (u8*)&SIFS_Timer);
+               }
+
+}
diff --git a/drivers/staging/rtl8192e/r8192E_dev.h b/drivers/staging/rtl8192e/r8192E_dev.h
new file mode 100644 (file)
index 0000000..f8021c7
--- /dev/null
@@ -0,0 +1,56 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _RTL8192E_H
+#define _RTL8192E_H
+
+#include "r8190P_def.h"
+
+u8 rtl8192_QueryIsShort(u8 TxHT, u8 TxRate, cb_desc *tcb_desc);
+bool rtl8192_GetHalfNmodeSupportByAPs(struct net_device* dev);
+bool rtl8192_GetNmodeSupportBySecCfg(struct net_device *dev);
+bool rtl8192_HalTxCheckStuck(struct net_device *dev);
+bool rtl8192_HalRxCheckStuck(struct net_device *dev);
+void rtl8192_interrupt_recognized(struct net_device *dev, u32 *p_inta, u32 *p_intb);
+void rtl8192_enable_rx(struct net_device *dev);
+void rtl8192_enable_tx(struct net_device *dev);
+void rtl8192_EnableInterrupt(struct net_device *dev);
+void rtl8192_DisableInterrupt(struct net_device *dev);
+void rtl8192_ClearInterrupt(struct net_device *dev);
+void rtl8192_InitializeVariables(struct net_device  *dev);
+void rtl8192e_start_beacon(struct net_device *dev);
+void rtl8192e_SetHwReg(struct net_device *dev,u8 variable,u8* val);
+void rtl8192_get_eeprom_size(struct net_device* dev);
+bool rtl8192_adapter_start(struct net_device *dev);
+void rtl8192_link_change(struct net_device *dev);
+void rtl8192_AllowAllDestAddr(struct net_device* dev, bool bAllowAllDA, bool WriteIntoReg);
+void  rtl8192_tx_fill_desc(struct net_device* dev, tx_desc * pdesc, cb_desc * cb_desc,
+                          struct sk_buff* skb);
+void  rtl8192_tx_fill_cmd_desc(struct net_device* dev, tx_desc_cmd * entry,
+                              cb_desc * cb_desc, struct sk_buff* skb);
+bool rtl8192_rx_query_status_desc(struct net_device* dev, struct rtllib_rx_stats *stats,
+                                 rx_desc *pdesc, struct sk_buff* skb);
+void rtl8192_halt_adapter(struct net_device *dev, bool reset);
+void rtl8192_update_ratr_table(struct net_device* dev);
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_firmware.c b/drivers/staging/rtl8192e/r8192E_firmware.c
new file mode 100644 (file)
index 0000000..6d49029
--- /dev/null
@@ -0,0 +1,396 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#if (defined(RTL8192E) || defined(RTL8190P))
+
+#include "rtl_core.h"
+#include "r8192E_hw.h"
+#ifdef RTL8190P
+#include "r8190P_hwimg.h"
+#elif defined RTL8192E
+#include "r8192E_hwimg.h"
+#endif
+#include "r8192E_firmware.h"
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#include <linux/firmware.h>
+#endif
+
+extern void firmware_init_param(struct net_device *dev)
+{
+       struct r8192_priv       *priv = rtllib_priv(dev);
+       rt_firmware             *pfirmware = priv->pFirmware;
+
+       pfirmware->cmdpacket_frag_thresold = GET_COMMAND_PACKET_FRAG_THRESHOLD(MAX_TRANSMIT_BUFFER_SIZE);
+}
+
+bool fw_download_code(struct net_device *dev, u8 *code_virtual_address, u32 buffer_len)
+{
+       struct r8192_priv   *priv = rtllib_priv(dev);
+       bool                rt_status = true;
+       u16                 frag_threshold;
+       u16                 frag_length, frag_offset = 0;
+       int                 i;
+
+       rt_firmware         *pfirmware = priv->pFirmware;
+       struct sk_buff      *skb;
+       unsigned char       *seg_ptr;
+       cb_desc             *tcb_desc;
+       u8                  bLastIniPkt;
+
+       firmware_init_param(dev);
+       frag_threshold = pfirmware->cmdpacket_frag_thresold;
+       do {
+               if ((buffer_len - frag_offset) > frag_threshold) {
+                       frag_length = frag_threshold ;
+                       bLastIniPkt = 0;
+
+               } else {
+                       frag_length = buffer_len - frag_offset;
+                       bLastIniPkt = 1;
+
+               }
+
+               skb  = dev_alloc_skb(frag_length + 4);
+               memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
+               tcb_desc = (cb_desc*)(skb->cb + MAX_DEV_ADDR_SIZE);
+               tcb_desc->queue_index = TXCMD_QUEUE;
+               tcb_desc->bCmdOrInit = DESC_PACKET_TYPE_INIT;
+               tcb_desc->bLastIniPkt = bLastIniPkt;
+
+               seg_ptr = skb->data;
+               for (i=0 ; i < frag_length; i+=4) {
+                       *seg_ptr++ = ((i+0)<frag_length)?code_virtual_address[i+3]:0;
+                       *seg_ptr++ = ((i+1)<frag_length)?code_virtual_address[i+2]:0;
+                       *seg_ptr++ = ((i+2)<frag_length)?code_virtual_address[i+1]:0;
+                       *seg_ptr++ = ((i+3)<frag_length)?code_virtual_address[i+0]:0;
+               }
+               tcb_desc->txbuf_size= (u16)i;
+               skb_put(skb, i);
+
+               if (!priv->rtllib->check_nic_enough_desc(dev,tcb_desc->queue_index)||
+                       (!skb_queue_empty(&priv->rtllib->skb_waitQ[tcb_desc->queue_index]))||\
+                       (priv->rtllib->queue_stop) ) {
+                       RT_TRACE(COMP_FIRMWARE, "===================> tx full!\n");
+                       skb_queue_tail(&priv->rtllib->skb_waitQ[tcb_desc->queue_index], skb);
+               } else {
+               priv->rtllib->softmac_hard_start_xmit(skb,dev);
+               }
+
+               code_virtual_address += frag_length;
+               frag_offset += frag_length;
+
+       }while(frag_offset < buffer_len);
+
+       write_nic_byte(dev, TPPoll, TPPoll_CQ);
+
+       return rt_status;
+}
+
+bool
+fwSendNullPacket(
+       struct net_device *dev,
+       u32                     Length
+)
+{
+       bool    rtStatus = true;
+       struct r8192_priv   *priv = rtllib_priv(dev);
+       struct sk_buff      *skb;
+       cb_desc             *tcb_desc;
+       unsigned char       *ptr_buf;
+       bool    bLastInitPacket = false;
+
+
+       skb  = dev_alloc_skb(Length+ 4);
+       memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
+       tcb_desc = (cb_desc*)(skb->cb + MAX_DEV_ADDR_SIZE);
+       tcb_desc->queue_index = TXCMD_QUEUE;
+       tcb_desc->bCmdOrInit = DESC_PACKET_TYPE_INIT;
+       tcb_desc->bLastIniPkt = bLastInitPacket;
+       ptr_buf = skb_put(skb, Length);
+       memset(ptr_buf,0,Length);
+       tcb_desc->txbuf_size= (u16)Length;
+
+       if (!priv->rtllib->check_nic_enough_desc(dev,tcb_desc->queue_index)||
+                       (!skb_queue_empty(&priv->rtllib->skb_waitQ[tcb_desc->queue_index]))||\
+                       (priv->rtllib->queue_stop) ) {
+               RT_TRACE(COMP_FIRMWARE,"===================NULL packet================> tx full!\n");
+               skb_queue_tail(&priv->rtllib->skb_waitQ[tcb_desc->queue_index], skb);
+       } else {
+               priv->rtllib->softmac_hard_start_xmit(skb,dev);
+       }
+
+       write_nic_byte(dev, TPPoll, TPPoll_CQ);
+       return rtStatus;
+}
+
+bool CPUcheck_maincodeok_turnonCPU(struct net_device *dev)
+{
+       bool            rt_status = true;
+       u32             CPU_status = 0;
+       unsigned long   timeout;
+
+       timeout = jiffies + MSECS(200);
+       while (time_before(jiffies, timeout)) {
+               CPU_status = read_nic_dword(dev, CPU_GEN);
+               if (CPU_status & CPU_GEN_PUT_CODE_OK)
+                       break;
+               msleep(2);
+       }
+
+       if (!(CPU_status&CPU_GEN_PUT_CODE_OK)) {
+               RT_TRACE(COMP_ERR, "Download Firmware: Put code fail!\n");
+               goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
+       } else {
+               RT_TRACE(COMP_FIRMWARE, "Download Firmware: Put code ok!\n");
+       }
+
+       CPU_status = read_nic_dword(dev, CPU_GEN);
+       write_nic_byte(dev, CPU_GEN, (u8)((CPU_status|CPU_GEN_PWR_STB_CPU)&0xff));
+       mdelay(1);
+
+       timeout = jiffies + MSECS(200);
+       while (time_before(jiffies, timeout)) {
+               CPU_status = read_nic_dword(dev, CPU_GEN);
+               if (CPU_status&CPU_GEN_BOOT_RDY)
+                       break;
+               msleep(2);
+       }
+
+       if (!(CPU_status&CPU_GEN_BOOT_RDY)) {
+               goto CPUCheckMainCodeOKAndTurnOnCPU_Fail;
+       } else {
+               RT_TRACE(COMP_FIRMWARE, "Download Firmware: Boot ready!\n");
+       }
+
+       return rt_status;
+
+CPUCheckMainCodeOKAndTurnOnCPU_Fail:
+       RT_TRACE(COMP_ERR, "ERR in %s()\n", __func__);
+       rt_status = false;
+       return rt_status;
+}
+
+bool CPUcheck_firmware_ready(struct net_device *dev)
+{
+
+       bool    rt_status = true;
+       u32     CPU_status = 0;
+       unsigned long timeout;
+
+       timeout = jiffies + MSECS(20);
+       while (time_before(jiffies, timeout)) {
+               CPU_status = read_nic_dword(dev, CPU_GEN);
+               if (CPU_status&CPU_GEN_FIRM_RDY)
+                       break;
+               msleep(2);
+       }
+
+       if (!(CPU_status&CPU_GEN_FIRM_RDY))
+               goto CPUCheckFirmwareReady_Fail;
+       else
+               RT_TRACE(COMP_FIRMWARE, "Download Firmware: Firmware ready!\n");
+
+       return rt_status;
+
+CPUCheckFirmwareReady_Fail:
+       RT_TRACE(COMP_ERR, "ERR in %s()\n", __func__);
+       rt_status = false;
+       return rt_status;
+
+}
+
+inline static bool firmware_check_ready(struct net_device *dev, u8 load_fw_status)
+{
+       struct r8192_priv       *priv = rtllib_priv(dev);
+       rt_firmware *pfirmware = priv->pFirmware;
+       bool rt_status  = true;
+
+       switch (load_fw_status) {
+       case FW_INIT_STEP0_BOOT:
+               pfirmware->firmware_status = FW_STATUS_1_MOVE_BOOT_CODE;
+#ifdef RTL8190P
+               rt_status = fwSendNullPacket(dev, RTL8190_CPU_START_OFFSET);
+               if (!rt_status) {
+                       RT_TRACE(COMP_INIT, "fwSendNullPacket() fail ! \n");
+               }
+#endif
+               break;
+
+       case FW_INIT_STEP1_MAIN:
+               pfirmware->firmware_status = FW_STATUS_2_MOVE_MAIN_CODE;
+
+               rt_status = CPUcheck_maincodeok_turnonCPU(dev);
+               if (rt_status) {
+                       pfirmware->firmware_status = FW_STATUS_3_TURNON_CPU;
+               } else {
+                       RT_TRACE(COMP_FIRMWARE, "CPUcheck_maincodeok_turnonCPU fail!\n");
+               }
+
+               break;
+
+       case FW_INIT_STEP2_DATA:
+               pfirmware->firmware_status = FW_STATUS_4_MOVE_DATA_CODE;
+               mdelay(1);
+
+               rt_status = CPUcheck_firmware_ready(dev);
+               if (rt_status) {
+                       pfirmware->firmware_status = FW_STATUS_5_READY;
+               } else {
+                       RT_TRACE(COMP_FIRMWARE, "CPUcheck_firmware_ready fail(%d)!\n",rt_status);
+               }
+
+               break;
+       default:
+               rt_status = false;
+               RT_TRACE(COMP_FIRMWARE, "Unknown firware status");
+               break;
+       }
+
+       return rt_status;
+}
+
+bool init_firmware(struct net_device *dev)
+{
+       struct r8192_priv       *priv = rtllib_priv(dev);
+       bool                    rt_status = true;
+
+#ifdef RTL8190P
+       u8      *firmware_img_buf[3] = { &Rtl8190PciFwBootArray[0],
+                                        &Rtl8190PciFwMainArray[0],
+                                        &Rtl8190PciFwDataArray[0]};
+
+       u32     firmware_img_len[3] = { sizeof(Rtl8190PciFwBootArray),
+                                       sizeof(Rtl8190PciFwMainArray),
+                                       sizeof(Rtl8190PciFwDataArray)};
+#else
+       u8      *firmware_img_buf[3] = { &Rtl8192PciEFwBootArray[0],
+                                        &Rtl8192PciEFwMainArray[0],
+                                        &Rtl8192PciEFwDataArray[0]};
+
+       u32     firmware_img_len[3] = { sizeof(Rtl8192PciEFwBootArray),
+                                       sizeof(Rtl8192PciEFwMainArray),
+                                       sizeof(Rtl8192PciEFwDataArray)};
+#endif
+       u32     file_length = 0;
+       u8      *mapped_file = NULL;
+       u8      init_step = 0;
+       opt_rst_type_e  rst_opt = OPT_SYSTEM_RESET;
+       firmware_init_step_e    starting_state = FW_INIT_STEP0_BOOT;
+
+       rt_firmware             *pfirmware = priv->pFirmware;
+
+       RT_TRACE(COMP_FIRMWARE, " PlatformInitFirmware()==>\n");
+
+       if (pfirmware->firmware_status == FW_STATUS_0_INIT ) {
+               rst_opt = OPT_SYSTEM_RESET;
+               starting_state = FW_INIT_STEP0_BOOT;
+
+       }else if (pfirmware->firmware_status == FW_STATUS_5_READY) {
+               rst_opt = OPT_FIRMWARE_RESET;
+               starting_state = FW_INIT_STEP2_DATA;
+       }else {
+                RT_TRACE(COMP_FIRMWARE, "PlatformInitFirmware: undefined firmware state\n");
+       }
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) && defined(USE_FW_SOURCE_IMG_FILE)
+       priv->firmware_source = FW_SOURCE_IMG_FILE;
+#else
+       priv->firmware_source = FW_SOURCE_HEADER_FILE;
+#endif
+       for (init_step = starting_state; init_step <= FW_INIT_STEP2_DATA; init_step++) {
+               if (rst_opt == OPT_SYSTEM_RESET) {
+                       switch (priv->firmware_source) {
+                       case FW_SOURCE_IMG_FILE:
+                       {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0) && defined(USE_FW_SOURCE_IMG_FILE)
+                               if (pfirmware->firmware_buf_size[init_step] == 0) {
+                                       const char *fw_name[3] = { "RTL8192E/boot.img",
+                                                                  "RTL8192E/main.img",
+                                                                  "RTL8192E/data.img"
+                                                                 };
+                                       const struct firmware   *fw_entry;
+                                       int rc;
+                                       rc = request_firmware(&fw_entry, fw_name[init_step],&priv->pdev->dev);
+                                       if (rc < 0 ) {
+                                               RT_TRACE(COMP_FIRMWARE, "request firmware fail!\n");
+                                               goto download_firmware_fail;
+                                       }
+                                       if (fw_entry->size > sizeof(pfirmware->firmware_buf[init_step])) {
+                                               RT_TRACE(COMP_FIRMWARE, "img file size exceed the container buffer fail!\n");
+                                               goto download_firmware_fail;
+                                       }
+
+                                       if (init_step != FW_INIT_STEP1_MAIN) {
+                                               memcpy(pfirmware->firmware_buf[init_step],fw_entry->data,fw_entry->size);
+                                               pfirmware->firmware_buf_size[init_step] = fw_entry->size;
+
+                                       } else {
+                                               memset(pfirmware->firmware_buf[init_step],0,128);
+                                               memcpy(&pfirmware->firmware_buf[init_step][128],fw_entry->data,fw_entry->size);
+                                               pfirmware->firmware_buf_size[init_step] = fw_entry->size+128;
+                                       }
+
+                                       if (rst_opt == OPT_SYSTEM_RESET) {
+                                               release_firmware(fw_entry);
+                                       }
+                               }
+                               mapped_file = pfirmware->firmware_buf[init_step];
+                               file_length = pfirmware->firmware_buf_size[init_step];
+#endif
+                               break;
+                       }
+                       case FW_SOURCE_HEADER_FILE:
+                               mapped_file =  firmware_img_buf[init_step];
+                               file_length  = firmware_img_len[init_step];
+                               if (init_step == FW_INIT_STEP2_DATA) {
+                                       memcpy(pfirmware->firmware_buf[init_step], mapped_file, file_length);
+                                       pfirmware->firmware_buf_size[init_step] = file_length;
+                               }
+                               break;
+
+                       default:
+                               break;
+                       }
+
+
+               } else if (rst_opt == OPT_FIRMWARE_RESET) {
+                       mapped_file = pfirmware->firmware_buf[init_step];
+                       file_length = pfirmware->firmware_buf_size[init_step];
+               }
+
+               rt_status = fw_download_code(dev,mapped_file,file_length);
+               if (rt_status != true) {
+                       goto download_firmware_fail;
+               }
+
+               if (!firmware_check_ready(dev, init_step)) {
+                       goto download_firmware_fail;
+               }
+       }
+
+       RT_TRACE(COMP_FIRMWARE, "Firmware Download Success\n");
+       return rt_status;
+
+download_firmware_fail:
+       RT_TRACE(COMP_ERR, "ERR in %s()\n", __func__);
+       rt_status = false;
+       return rt_status;
+
+}
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_firmware.h b/drivers/staging/rtl8192e/r8192E_firmware.h
new file mode 100644 (file)
index 0000000..8819f97
--- /dev/null
@@ -0,0 +1,73 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef __INC_FIRMWARE_H
+#define __INC_FIRMWARE_H
+
+#define RTL8190_CPU_START_OFFSET       0x80
+
+#define GET_COMMAND_PACKET_FRAG_THRESHOLD(v)   (4*(v/4) - 8 )
+
+typedef enum _firmware_init_step{
+       FW_INIT_STEP0_BOOT = 0,
+       FW_INIT_STEP1_MAIN = 1,
+       FW_INIT_STEP2_DATA = 2,
+}firmware_init_step_e;
+
+typedef enum _opt_rst_type{
+       OPT_SYSTEM_RESET = 0,
+       OPT_FIRMWARE_RESET = 1,
+}opt_rst_type_e;
+
+typedef enum _desc_packet_type_e{
+       DESC_PACKET_TYPE_INIT = 0,
+       DESC_PACKET_TYPE_NORMAL = 1,
+}desc_packet_type_e;
+
+typedef enum _firmware_source{
+       FW_SOURCE_IMG_FILE = 0,
+       FW_SOURCE_HEADER_FILE = 1,
+}firmware_source_e, *pfirmware_source_e;
+
+typedef enum _firmware_status{
+       FW_STATUS_0_INIT = 0,
+       FW_STATUS_1_MOVE_BOOT_CODE = 1,
+       FW_STATUS_2_MOVE_MAIN_CODE = 2,
+       FW_STATUS_3_TURNON_CPU = 3,
+       FW_STATUS_4_MOVE_DATA_CODE = 4,
+       FW_STATUS_5_READY = 5,
+}firmware_status_e;
+
+typedef struct _rt_firmare_seg_container {
+       u16     seg_size;
+       u8      *seg_ptr;
+}fw_seg_container, *pfw_seg_container;
+
+typedef struct _rt_firmware{
+       firmware_status_e firmware_status;
+       u16               cmdpacket_frag_thresold;
+#define RTL8190_MAX_FIRMWARE_CODE_SIZE 64000
+#define MAX_FW_INIT_STEP               3
+       u8                firmware_buf[MAX_FW_INIT_STEP][RTL8190_MAX_FIRMWARE_CODE_SIZE];
+       u16               firmware_buf_size[MAX_FW_INIT_STEP];
+} rt_firmware, *prt_firmware;
+
+bool init_firmware(struct net_device *dev);
+extern void firmware_init_param(struct net_device *dev);
+
+#endif
index 24e7303e56a465c61702a5b9378fce1dbccd0c72..0b29636c302c37af9bc0f01ee6df7c840a8448b0 100644 (file)
@@ -1,49 +1,36 @@
-/*
-       This is part of rtl8187 OpenSource driver.
-       Copyright (C) Andrea Merello 2004-2005  <andreamrl@tiscali.it>
-       Released under the terms of GPL (General Public Licence)
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
 
-       Parts of this driver are based on the GPL part of the
-       official Realtek driver.
-       Parts of this driver are based on the rtl8180 driver skeleton
-       from Patric Schenke & Andres Salomon.
-       Parts of this driver are based on the Intel Pro Wireless
-       2100 GPL driver.
 
-       We want to tanks the Authors of those projects
-       and the Ndiswrapper project Authors.
-*/
-
-/* Mariusz Matuszek added full registers definition with Realtek's name */
-
-/* this file contains register definitions for the rtl8187 MAC controller */
 #ifndef R8180_HW
 #define R8180_HW
 
-typedef enum _VERSION_8190{
-       VERSION_8190_BD=0x3,
-       VERSION_8190_BE
-}VERSION_8190,*PVERSION_8190;
-//added for different RF type
-typedef enum _RT_RF_TYPE_DEF
-{
-       RF_1T2R = 0,
-       RF_2T4R,
-
-       RF_819X_MAX_TYPE
-}RT_RF_TYPE_DEF;
-
-typedef enum _BaseBand_Config_Type{
-       BaseBand_Config_PHY_REG = 0,                    //Radio Path A
-       BaseBand_Config_AGC_TAB = 1,                    //Radio Path B
-}BaseBand_Config_Type, *PBaseBand_Config_Type;
+typedef enum _BaseBand_Config_Type {
+       BaseBand_Config_PHY_REG = 0,
+       BaseBand_Config_AGC_TAB = 1,
+} BaseBand_Config_Type, *PBaseBand_Config_Type;
 
 #define        RTL8187_REQT_READ       0xc0
 #define        RTL8187_REQT_WRITE      0x40
 #define        RTL8187_REQ_GET_REGS    0x05
 #define        RTL8187_REQ_SET_REGS    0x05
 
-#define R8180_MAX_RETRY 255
 #define MAX_TX_URB 5
 #define MAX_RX_URB 16
 #define RX_URB_SIZE 9100
@@ -65,14 +52,14 @@ typedef enum _BaseBand_Config_Type{
 #define EEPROM_TxPowerDiff     0x1F
 
 
-#define EEPROM_PwDiff          0x21    //0x21
-#define EEPROM_CrystalCap      0x22    //0x22
+#define EEPROM_PwDiff          0x21
+#define EEPROM_CrystalCap      0x22
 
 
 
-#define EEPROM_TxPwIndex_CCK_V1                0x29    //0x29~0x2B
-#define EEPROM_TxPwIndex_OFDM_24G_V1   0x2C    //0x2C~0x2E
-#define EEPROM_TxPwIndex_Ver           0x27    //0x27
+#define EEPROM_TxPwIndex_CCK_V1                0x29
+#define EEPROM_TxPwIndex_OFDM_24G_V1   0x2C
+#define EEPROM_TxPwIndex_Ver           0x27
 
 #define EEPROM_Default_TxPowerDiff             0x0
 #define EEPROM_Default_ThermalMeter            0x77
@@ -81,42 +68,51 @@ typedef enum _BaseBand_Config_Type{
 #define EEPROM_Default_PwDiff                  0x4
 #define EEPROM_Default_CrystalCap              0x5
 #define EEPROM_Default_TxPower                 0x1010
-#define EEPROM_ICVersion_ChannelPlan   0x7C    //0x7C:ChannelPlan, 0x7D:IC_Version
-#define EEPROM_Customer_ID                     0x7B    //0x7B:CustomerID
-
+#define EEPROM_ICVersion_ChannelPlan   0x7C
+#define EEPROM_Customer_ID                     0x7B
+#ifdef RTL8190P
+#define EEPROM_RFInd_PowerDiff                 0x14
+#define EEPROM_ThermalMeter                    0x15
+#define EEPROM_TxPwDiff_CrystalCap             0x16
+#define EEPROM_TxPwIndex_CCK                   0x18
+#define EEPROM_TxPwIndex_OFDM_24G      0x26
+#define EEPROM_TxPwIndex_OFDM_5G               0x34
+#define EEPROM_C56_CrystalCap                  0x17
+#define EEPROM_C56_RfA_CCK_Chnl1_TxPwIndex     0x80
+#define EEPROM_C56_RfA_HT_OFDM_TxPwIndex       0x81
+#define EEPROM_C56_RfC_CCK_Chnl1_TxPwIndex     0xbc
+#define EEPROM_C56_RfC_HT_OFDM_TxPwIndex       0xb9
+#else
+#ifdef RTL8192E
 #define EEPROM_RFInd_PowerDiff                 0x28
 #define EEPROM_ThermalMeter                    0x29
-#define EEPROM_TxPwDiff_CrystalCap             0x2A    //0x2A~0x2B
-#define EEPROM_TxPwIndex_CCK                   0x2C    //0x23
-#define EEPROM_TxPwIndex_OFDM_24G      0x3A    //0x24~0x26
-
+#define EEPROM_TxPwDiff_CrystalCap             0x2A
+#define EEPROM_TxPwIndex_CCK                   0x2C
+#define EEPROM_TxPwIndex_OFDM_24G      0x3A
+#endif
+#endif
 #define EEPROM_Default_TxPowerLevel            0x10
-
-#define EEPROM_IC_VER                          0x7d    //0x7D
-#define EEPROM_CRC                             0x7e    //0x7E~0x7F
+#define EEPROM_IC_VER                          0x7d
+#define EEPROM_CRC                             0x7e
 
 #define EEPROM_CID_DEFAULT                     0x0
 #define EEPROM_CID_CAMEO                               0x1
 #define EEPROM_CID_RUNTOP                              0x2
 #define EEPROM_CID_Senao                               0x3
-#define EEPROM_CID_TOSHIBA                             0x4     // Toshiba setting, Merge by Jacken, 2008/01/31
+#define EEPROM_CID_TOSHIBA                             0x4
 #define EEPROM_CID_NetCore                             0x5
 #define EEPROM_CID_Nettronix                   0x6
 #define EEPROM_CID_Pronet                              0x7
 #define EEPROM_CID_DLINK                               0x8
-#define EEPROM_CID_WHQL                                0xFE  //added by sherry for dtm, 20080728
-
+#define EEPROM_CID_WHQL                                        0xFE
 enum _RTL8192Pci_HW {
-       MAC0                    = 0x000,
-       MAC1                    = 0x001,
-       MAC2                    = 0x002,
-       MAC3                    = 0x003,
-       MAC4                    = 0x004,
-       MAC5                    = 0x005,
-       PCIF                    = 0x009, // PCI Function Register 0x0009h~0x000bh
-//----------------------------------------------------------------------------
-//       8190 PCIF bits                                                        (Offset 0x009-000b, 24bit)
-//----------------------------------------------------------------------------
+       MAC0                    = 0x000,
+       MAC1                    = 0x001,
+       MAC2                    = 0x002,
+       MAC3                    = 0x003,
+       MAC4                    = 0x004,
+       MAC5                    = 0x005,
+       PCIF                    = 0x009,
 #define MXDMA2_16bytes         0x000
 #define MXDMA2_32bytes         0x001
 #define MXDMA2_64bytes         0x010
@@ -129,8 +125,8 @@ enum _RTL8192Pci_HW {
 #define        MULRW_SHIFT             3
 #define        MXDMA2_RX_SHIFT         4
 #define        MXDMA2_TX_SHIFT         0
-        PMR                     = 0x00c, // Power management register
-       EPROM_CMD               = 0x00e,
+        PMR                     = 0x00c,
+       EPROM_CMD               = 0x00e,
 #define EPROM_CMD_RESERVED_MASK BIT5
 #define EPROM_CMD_9356SEL      BIT4
 #define EPROM_CMD_OPERATING_MODE_SHIFT 6
@@ -151,71 +147,65 @@ enum _RTL8192Pci_HW {
 
        ANAPAR                  = 0x17,
 #define        BB_GLOBAL_RESET_BIT     0x1
-       BB_GLOBAL_RESET         = 0x020, // BasebandGlobal Reset Register
-       BSSIDR                  = 0x02E, // BSSID Register
-       CMDR                    = 0x037, // Command register
-#define        CR_RST                                  0x10
-#define        CR_RE                                   0x08
-#define        CR_TE                                   0x04
-#define        CR_MulRW                                0x01
-       SIFS            = 0x03E,        // SIFS register
-       TCR                     = 0x040, // Transmit Configuration Register
-       RCR                     = 0x044, // Receive Configuration Register
-//----------------------------------------------------------------------------
-////       8190 (RCR) Receive Configuration Register   (Offset 0x44~47, 32 bit)
-////----------------------------------------------------------------------------
+       BB_GLOBAL_RESET         = 0x020,
+       BSSIDR                  = 0x02E,
+       CMDR                    = 0x037,
+#define                CR_RST                                  0x10
+#define                CR_RE                                   0x08
+#define                CR_TE                                   0x04
+#define                CR_MulRW                                0x01
+       SIFS            = 0x03E,
+       TCR                     = 0x040,
+       RCR                     = 0x044,
 #define RCR_FILTER_MASK (BIT0|BIT1|BIT2|BIT3|BIT5|BIT12|BIT18|BIT19|BIT20|BIT21|BIT22|BIT23)
-#define RCR_ONLYERLPKT         BIT31                   // Early Receiving based on Packet Size.
-#define RCR_ENCS2              BIT30                           // Enable Carrier Sense Detection Method 2
-#define RCR_ENCS1              BIT29                           // Enable Carrier Sense Detection Method 1
-#define RCR_ENMBID             BIT27                           // Enable Multiple BssId.
-#define RCR_ACKTXBW            (BIT24|BIT25)           // TXBW Setting of ACK frames
-#define RCR_CBSSID             BIT23                           // Accept BSSID match packet
-#define RCR_APWRMGT            BIT22                           // Accept power management packet
-#define        RCR_ADD3                BIT21                   // Accept address 3 match packet
-#define RCR_AMF                        BIT20                           // Accept management type frame
-#define RCR_ACF                        BIT19                           // Accept control type frame
-#define RCR_ADF                        BIT18                           // Accept data type frame
-#define RCR_RXFTH              BIT13   // Rx FIFO Threshold
-#define RCR_AICV               BIT12                           // Accept ICV error packet
-#define        RCR_ACRC32              BIT5                    // Accept CRC32 error packet
-#define        RCR_AB                  BIT3                    // Accept broadcast packet
-#define        RCR_AM                  BIT2                    // Accept multicast packet
-#define        RCR_APM                 BIT1                    // Accept physical match packet
-#define        RCR_AAP                 BIT0                    // Accept all unicast packet
+#define RCR_ONLYERLPKT         BIT31
+#define RCR_ENCS2              BIT30
+#define RCR_ENCS1              BIT29
+#define RCR_ENMBID             BIT27
+#define RCR_ACKTXBW            (BIT24|BIT25)
+#define RCR_CBSSID             BIT23
+#define RCR_APWRMGT            BIT22
+#define        RCR_ADD3                BIT21
+#define RCR_AMF                        BIT20
+#define RCR_ACF                        BIT19
+#define RCR_ADF                        BIT18
+#define RCR_RXFTH              BIT13
+#define RCR_AICV               BIT12
+#define        RCR_ACRC32              BIT5
+#define        RCR_AB                  BIT3
+#define        RCR_AM                  BIT2
+#define        RCR_APM                 BIT1
+#define        RCR_AAP                 BIT0
 #define RCR_MXDMA_OFFSET       8
 #define RCR_FIFO_OFFSET                13
-       SLOT_TIME               = 0x049, // Slot Time Register
-       ACK_TIMEOUT             = 0x04c, // Ack Timeout Register
-       PIFS_TIME               = 0x04d, // PIFS time
-       USTIME                  = 0x04e, // Microsecond Tuning Register, Sets the microsecond time unit used by MAC clock.
-       EDCAPARA_BE             = 0x050, // EDCA Parameter of AC BE
-       EDCAPARA_BK             = 0x054, // EDCA Parameter of AC BK
-       EDCAPARA_VO             = 0x058, // EDCA Parameter of AC VO
-       EDCAPARA_VI             = 0x05C, // EDCA Parameter of AC VI
+       SLOT_TIME               = 0x049,
+       ACK_TIMEOUT             = 0x04c,
+       PIFS_TIME               = 0x04d,
+       USTIME                  = 0x04e,
+       EDCAPARA_BE             = 0x050,
+       EDCAPARA_BK             = 0x054,
+       EDCAPARA_VO             = 0x058,
+       EDCAPARA_VI             = 0x05C,
 #define        AC_PARAM_TXOP_LIMIT_OFFSET              16
 #define        AC_PARAM_ECW_MAX_OFFSET         12
 #define        AC_PARAM_ECW_MIN_OFFSET                 8
 #define        AC_PARAM_AIFS_OFFSET                            0
-       RFPC                    = 0x05F, // Rx FIFO Packet Count
-       CWRR                    = 0x060, // Contention Window Report Register
-       BCN_TCFG                = 0x062, // Beacon Time Configuration
+       RFPC                    = 0x05F,
+       CWRR                    = 0x060,
+       BCN_TCFG                = 0x062,
 #define BCN_TCFG_CW_SHIFT              8
 #define BCN_TCFG_IFS                   0
-       BCN_INTERVAL            = 0x070, // Beacon Interval (TU)
-       ATIMWND                 = 0x072, // ATIM Window Size (TU)
-       BCN_DRV_EARLY_INT       = 0x074, // Driver Early Interrupt Time (TU). Time to send interrupt to notify to change beacon content before TBTT
+       BCN_INTERVAL            = 0x070,
+       ATIMWND                 = 0x072,
+       BCN_DRV_EARLY_INT       = 0x074,
 #define        BCN_DRV_EARLY_INT_SWBCN_SHIFT   8
 #define        BCN_DRV_EARLY_INT_TIME_SHIFT    0
-       BCN_DMATIME             = 0x076, // Beacon DMA and ATIM interrupt time (US). Indicates the time before TBTT to perform beacon queue DMA
-       BCN_ERR_THRESH          = 0x078, // Beacon Error Threshold
-       RWCAM                   = 0x0A0, //IN 8190 Data Sheet is called CAMcmd
-       //----------------------------------------------------------------------------
-       ////       8190 CAM Command Register                    (offset 0xA0, 4 byte)
-       ////----------------------------------------------------------------------------
-#define   CAM_CM_SecCAMPolling         BIT31           //Security CAM Polling
-#define   CAM_CM_SecCAMClr                     BIT30           //Clear all bits in CAM
-#define   CAM_CM_SecCAMWE                      BIT16           //Security CAM enable
+       BCN_DMATIME             = 0x076,
+       BCN_ERR_THRESH          = 0x078,
+       RWCAM                   = 0x0A0,
+#define   CAM_CM_SecCAMPolling         BIT31
+#define   CAM_CM_SecCAMClr                     BIT30
+#define   CAM_CM_SecCAMWE                      BIT16
 #define   CAM_VALID                           BIT15
 #define   CAM_NOTVALID                 0x0000
 #define   CAM_USEDK                            BIT5
@@ -234,68 +224,62 @@ enum _RTL8192Pci_HW {
 #define   CAM_READ             0x00000000
 #define   CAM_POLLINIG         BIT31
 #define   SCR_UseDK            0x01
-       WCAMI                   = 0x0A4, // Software write CAM input content
-       RCAMO                   = 0x0A8, // Software read/write CAM config
-       SECR                    = 0x0B0, //Security Configuration Register
-#define        SCR_TxUseDK                     BIT0                    //Force Tx Use Default Key
-#define   SCR_RxUseDK                  BIT1                    //Force Rx Use Default Key
-#define   SCR_TxEncEnable              BIT2                    //Enable Tx Encryption
-#define   SCR_RxDecEnable              BIT3                    //Enable Rx Decryption
-#define   SCR_SKByA2                           BIT4                    //Search kEY BY A2
-#define   SCR_NoSKMC                           BIT5                    //No Key Search for Multicast
-       SWREGULATOR     = 0x0BD,        // Switching Regulator
-       INTA_MASK               = 0x0f4,
-//----------------------------------------------------------------------------
-//       8190 IMR/ISR bits                                             (offset 0xfd,  8bits)
-//----------------------------------------------------------------------------
+       WCAMI                   = 0x0A4,
+       RCAMO                   = 0x0A8,
+       SECR                    = 0x0B0,
+#define        SCR_TxUseDK                     BIT0
+#define   SCR_RxUseDK                  BIT1
+#define   SCR_TxEncEnable              BIT2
+#define   SCR_RxDecEnable              BIT3
+#define   SCR_SKByA2                           BIT4
+#define   SCR_NoSKMC                           BIT5
+       SWREGULATOR     = 0x0BD,
+       INTA_MASK               = 0x0f4,
 #define IMR8190_DISABLED               0x0
-#define IMR_ATIMEND                    BIT28                   // ATIM Window End Interrupt
-#define IMR_TBDOK                      BIT27                   // Transmit Beacon OK Interrupt
-#define IMR_TBDER                      BIT26                   // Transmit Beacon Error Interrupt
-#define IMR_TXFOVW                     BIT15                   // Transmit FIFO Overflow
-#define IMR_TIMEOUT0                   BIT14                   // TimeOut0
-#define IMR_BcnInt                     BIT13                   // Beacon DMA Interrupt 0
-#define        IMR_RXFOVW                      BIT12                   // Receive FIFO Overflow
-#define IMR_RDU                                BIT11                   // Receive Descriptor Unavailable
-#define IMR_RXCMDOK                    BIT10                   // Receive Command Packet OK
-#define IMR_BDOK                       BIT9                    // Beacon Queue DMA OK Interrup
-#define IMR_HIGHDOK                    BIT8                    // High Queue DMA OK Interrupt
-#define        IMR_COMDOK                      BIT7                    // Command Queue DMA OK Interrupt
-#define IMR_MGNTDOK                    BIT6                    // Management Queue DMA OK Interrupt
-#define IMR_HCCADOK                    BIT5                    // HCCA Queue DMA OK Interrupt
-#define        IMR_BKDOK                       BIT4                    // AC_BK DMA OK Interrupt
-#define        IMR_BEDOK                       BIT3                    // AC_BE DMA OK Interrupt
-#define        IMR_VIDOK                       BIT2                    // AC_VI DMA OK Interrupt
-#define        IMR_VODOK                       BIT1                    // AC_VO DMA Interrupt
-#define        IMR_ROK                         BIT0                    // Receive DMA OK Interrupt
-       ISR                     = 0x0f8, // Interrupt Status Register
-       TPPoll                  = 0x0fd, // Transmit priority polling register
-#define TPPoll_BKQ             BIT0                            // BK queue polling
-#define TPPoll_BEQ             BIT1                            // BE queue polling
-#define TPPoll_VIQ             BIT2                            // VI queue polling
-#define TPPoll_VOQ             BIT3                            // VO queue polling
-#define TPPoll_BQ              BIT4                            // Beacon queue polling
-#define TPPoll_CQ              BIT5                            // Command queue polling
-#define TPPoll_MQ              BIT6                            // Management queue polling
-#define TPPoll_HQ              BIT7                            // High queue polling
-#define TPPoll_HCCAQ           BIT8                            // HCCA queue polling
-#define TPPoll_StopBK  BIT9                            // Stop BK queue
-#define TPPoll_StopBE  BIT10                   // Stop BE queue
-#define TPPoll_StopVI          BIT11                   // Stop VI queue
-#define TPPoll_StopVO  BIT12                   // Stop VO queue
-#define TPPoll_StopMgt BIT13                   // Stop Mgnt queue
-#define TPPoll_StopHigh        BIT14                   // Stop High queue
-#define TPPoll_StopHCCA        BIT15                   // Stop HCCA queue
-#define TPPoll_SHIFT           8                               // Queue ID mapping
-
-       PSR                     = 0x0ff, // Page Select Register
-#define PSR_GEN                        0x0                             // Page 0 register general MAC Control
-#define PSR_CPU                        0x1                             // Page 1 register for CPU
-       CPU_GEN                 = 0x100, // CPU Reset Register
-       BB_RESET                        = 0x101, // Baseband Reset
-//----------------------------------------------------------------------------
-//       8190 CPU General Register             (offset 0x100, 4 byte)
-//----------------------------------------------------------------------------
+#define IMR_ATIMEND                    BIT28
+#define IMR_TBDOK                      BIT27
+#define IMR_TBDER                      BIT26
+#define IMR_TXFOVW                     BIT15
+#define IMR_TIMEOUT0                   BIT14
+#define IMR_BcnInt                     BIT13
+#define        IMR_RXFOVW                      BIT12
+#define IMR_RDU                                BIT11
+#define IMR_RXCMDOK                    BIT10
+#define IMR_BDOK                       BIT9
+#define IMR_HIGHDOK                    BIT8
+#define        IMR_COMDOK                      BIT7
+#define IMR_MGNTDOK                    BIT6
+#define IMR_HCCADOK                    BIT5
+#define        IMR_BKDOK                       BIT4
+#define        IMR_BEDOK                       BIT3
+#define        IMR_VIDOK                       BIT2
+#define        IMR_VODOK                       BIT1
+#define        IMR_ROK                         BIT0
+       ISR                     = 0x0f8,
+       TPPoll                  = 0x0fd,
+#define TPPoll_BKQ             BIT0
+#define TPPoll_BEQ             BIT1
+#define TPPoll_VIQ             BIT2
+#define TPPoll_VOQ             BIT3
+#define TPPoll_BQ              BIT4
+#define TPPoll_CQ              BIT5
+#define TPPoll_MQ              BIT6
+#define TPPoll_HQ              BIT7
+#define TPPoll_HCCAQ           BIT8
+#define TPPoll_StopBK  BIT9
+#define TPPoll_StopBE  BIT10
+#define TPPoll_StopVI          BIT11
+#define TPPoll_StopVO  BIT12
+#define TPPoll_StopMgt BIT13
+#define TPPoll_StopHigh        BIT14
+#define TPPoll_StopHCCA        BIT15
+#define TPPoll_SHIFT           8
+
+       PSR                     = 0x0ff,
+#define PSR_GEN                        0x0
+#define PSR_CPU                        0x1
+       CPU_GEN                 = 0x100,
+       BB_RESET                        = 0x101,
 #define        CPU_CCK_LOOPBACK        0x00030000
 #define        CPU_GEN_SYSTEM_RESET    0x00000001
 #define        CPU_GEN_FIRMWARE_RESET  0x00000008
@@ -304,19 +288,15 @@ enum _RTL8192Pci_HW {
 #define        CPU_GEN_PUT_CODE_OK     0x00000080
 #define        CPU_GEN_BB_RST          0x00000100
 #define        CPU_GEN_PWR_STB_CPU     0x00000004
-#define CPU_GEN_NO_LOOPBACK_MSK        0xFFF8FFFF // Set bit18,17,16 to 0. Set bit19
-#define CPU_GEN_NO_LOOPBACK_SET        0x00080000 // Set BIT19 to 1
+#define CPU_GEN_NO_LOOPBACK_MSK        0xFFF8FFFF
+#define CPU_GEN_NO_LOOPBACK_SET        0x00080000
 #define        CPU_GEN_GPIO_UART               0x00007000
 
-       LED1Cfg                 = 0x154,// LED1 Configuration Register
-       LED0Cfg                 = 0x155,// LED0 Configuration Register
+       LED1Cfg                 = 0x154,
+       LED0Cfg                 = 0x155,
 
-       AcmAvg                  = 0x170, // ACM Average Period Register
-       AcmHwCtrl               = 0x171, // ACM Hardware Control Register
-//----------------------------------------------------------------------------
-//
-//       8190 AcmHwCtrl bits                                   (offset 0x171, 1 byte)
-//----------------------------------------------------------------------------
+       AcmAvg                  = 0x170,
+       AcmHwCtrl               = 0x171,
 #define        AcmHw_HwEn              BIT0
 #define        AcmHw_BeqEn             BIT1
 #define        AcmHw_ViqEn             BIT2
@@ -324,67 +304,65 @@ enum _RTL8192Pci_HW {
 #define        AcmHw_BeqStatus         BIT4
 #define        AcmHw_ViqStatus         BIT5
 #define        AcmHw_VoqStatus         BIT6
-       AcmFwCtrl               = 0x172, // ACM Firmware Control Register
+       AcmFwCtrl               = 0x172,
 #define        AcmFw_BeqStatus         BIT0
 #define        AcmFw_ViqStatus         BIT1
 #define        AcmFw_VoqStatus         BIT2
-       VOAdmTime               = 0x174, // VO Queue Admitted Time Register
-       VIAdmTime               = 0x178, // VI Queue Admitted Time Register
-       BEAdmTime               = 0x17C, // BE Queue Admitted Time Register
-       RQPN1                   = 0x180, // Reserved Queue Page Number , Vo Vi, Be, Bk
-       RQPN2                   = 0x184, // Reserved Queue Page Number, HCCA, Cmd, Mgnt, High
-       RQPN3                   = 0x188, // Reserved Queue Page Number, Bcn, Public,
-       QPRR                    = 0x1E0, // Queue Page Report per TID
-       QPNR                    = 0x1F0, // Queue Packet Number report per TID
-/* there's 9 tx descriptor base address available */
-       BQDA                    = 0x200, // Beacon Queue Descriptor Address
-       HQDA                    = 0x204, // High Priority Queue Descriptor Address
-       CQDA                    = 0x208, // Command Queue Descriptor Address
-       MQDA                    = 0x20C, // Management Queue Descriptor Address
-       HCCAQDA                 = 0x210, // HCCA Queue Descriptor Address
-       VOQDA                   = 0x214, // VO Queue Descriptor Address
-       VIQDA                   = 0x218, // VI Queue Descriptor Address
-       BEQDA                   = 0x21C, // BE Queue Descriptor Address
-       BKQDA                   = 0x220, // BK Queue Descriptor Address
-/* there's 2 rx descriptor base address availalbe */
-       RCQDA                   = 0x224, // Receive command Queue Descriptor Address
-       RDQDA                   = 0x228, // Receive Queue Descriptor Start Address
-
-       MAR0                    = 0x240, // Multicast filter.
+       VOAdmTime               = 0x174,
+       VIAdmTime               = 0x178,
+       BEAdmTime               = 0x17C,
+       RQPN1                   = 0x180,
+       RQPN2                   = 0x184,
+       RQPN3                   = 0x188,
+       QPRR                    = 0x1E0,
+       QPNR                    = 0x1F0,
+       BQDA                    = 0x200,
+       HQDA                    = 0x204,
+       CQDA                    = 0x208,
+       MQDA                    = 0x20C,
+       HCCAQDA                 = 0x210,
+       VOQDA                   = 0x214,
+       VIQDA                   = 0x218,
+       BEQDA                   = 0x21C,
+       BKQDA                   = 0x220,
+       RCQDA                   = 0x224,
+       RDQDA                   = 0x228,
+
+       MAR0                    = 0x240,
        MAR4                    = 0x244,
 
-       CCX_PERIOD              = 0x250, // CCX Measurement Period Register, in unit of TU.
-       CLM_RESULT              = 0x251, // CCA Busy fraction register.
-       NHM_PERIOD              = 0x252, // NHM Measurement Period register, in unit of TU.
-
-       NHM_THRESHOLD0          = 0x253, // Noise Histogram Meashorement0.
-       NHM_THRESHOLD1          = 0x254, // Noise Histogram Meashorement1.
-       NHM_THRESHOLD2          = 0x255, // Noise Histogram Meashorement2.
-       NHM_THRESHOLD3          = 0x256, // Noise Histogram Meashorement3.
-       NHM_THRESHOLD4          = 0x257, // Noise Histogram Meashorement4.
-       NHM_THRESHOLD5          = 0x258, // Noise Histogram Meashorement5.
-       NHM_THRESHOLD6          = 0x259, // Noise Histogram Meashorement6
-
-       MCTRL                   = 0x25A, // Measurement Control
-
-       NHM_RPI_COUNTER0        = 0x264, // Noise Histogram RPI counter0, the fraction of signal strength < NHM_THRESHOLD0.
-       NHM_RPI_COUNTER1        = 0x265, // Noise Histogram RPI counter1, the fraction of signal strength in (NHM_THRESHOLD0, NHM_THRESHOLD1].
-       NHM_RPI_COUNTER2        = 0x266, // Noise Histogram RPI counter2, the fraction of signal strength in (NHM_THRESHOLD1, NHM_THRESHOLD2].
-       NHM_RPI_COUNTER3        = 0x267, // Noise Histogram RPI counter3, the fraction of signal strength in (NHM_THRESHOLD2, NHM_THRESHOLD3].
-       NHM_RPI_COUNTER4        = 0x268, // Noise Histogram RPI counter4, the fraction of signal strength in (NHM_THRESHOLD3, NHM_THRESHOLD4].
-       NHM_RPI_COUNTER5        = 0x269, // Noise Histogram RPI counter5, the fraction of signal strength in (NHM_THRESHOLD4, NHM_THRESHOLD5].
-       NHM_RPI_COUNTER6        = 0x26A, // Noise Histogram RPI counter6, the fraction of signal strength in (NHM_THRESHOLD5, NHM_THRESHOLD6].
-       NHM_RPI_COUNTER7        = 0x26B, // Noise Histogram RPI counter7, the fraction of signal strength in (NHM_THRESHOLD6, NHM_THRESHOLD7].
+       CCX_PERIOD              = 0x250,
+       CLM_RESULT              = 0x251,
+       NHM_PERIOD              = 0x252,
+
+       NHM_THRESHOLD0          = 0x253,
+       NHM_THRESHOLD1          = 0x254,
+       NHM_THRESHOLD2          = 0x255,
+       NHM_THRESHOLD3          = 0x256,
+       NHM_THRESHOLD4          = 0x257,
+       NHM_THRESHOLD5          = 0x258,
+       NHM_THRESHOLD6          = 0x259,
+
+       MCTRL                   = 0x25A,
+
+       NHM_RPI_COUNTER0        = 0x264,
+       NHM_RPI_COUNTER1        = 0x265,
+       NHM_RPI_COUNTER2        = 0x266,
+       NHM_RPI_COUNTER3        = 0x267,
+       NHM_RPI_COUNTER4        = 0x268,
+       NHM_RPI_COUNTER5        = 0x269,
+       NHM_RPI_COUNTER6        = 0x26A,
+       NHM_RPI_COUNTER7        = 0x26B,
         WFCRC0                  = 0x2f0,
         WFCRC1                  = 0x2f4,
         WFCRC2                  = 0x2f8,
 
-       BW_OPMODE               = 0x300, // Bandwidth operation mode
+       BW_OPMODE               = 0x300,
 #define        BW_OPMODE_11J                   BIT0
 #define        BW_OPMODE_5G                    BIT1
 #define        BW_OPMODE_20MHZ                 BIT2
-       IC_VERRSION             = 0x301,        //IC_VERSION
-       MSR                     = 0x303, // Media Status register
+       IC_VERRSION             = 0x301,
+       MSR                     = 0x303,
 #define MSR_LINK_MASK      ((1<<0)|(1<<1))
 #define MSR_LINK_MANAGED   2
 #define MSR_LINK_NONE      0
@@ -392,11 +370,17 @@ enum _RTL8192Pci_HW {
 #define MSR_LINK_ADHOC     1
 #define MSR_LINK_MASTER    3
 #define MSR_LINK_ENEDCA           (1<<4)
-       RETRY_LIMIT             = 0x304, // Retry Limit [15:8]-short, [7:0]-long
+
+#define        MSR_NOLINK                                      0x00
+#define        MSR_ADHOC                                       0x01
+#define        MSR_INFRA                                       0x02
+#define        MSR_AP                                          0x03
+
+       RETRY_LIMIT             = 0x304,
 #define RETRY_LIMIT_SHORT_SHIFT 8
 #define RETRY_LIMIT_LONG_SHIFT 0
        TSFR                    = 0x308,
-       RRSR                    = 0x310, // Response Rate Set
+       RRSR                    = 0x310,
 #define RRSR_RSC_OFFSET                        21
 #define RRSR_SHORT_OFFSET                      23
 #define RRSR_RSC_DUPLICATE                     0x600000
@@ -423,18 +407,13 @@ enum _RTL8192Pci_HW {
 #define RRSR_MCS5                                      BIT17
 #define RRSR_MCS6                                      BIT18
 #define RRSR_MCS7                                      BIT19
-#define BRSR_AckShortPmb                       BIT23           // CCK ACK: use Short Preamble or not
+#define BRSR_AckShortPmb                       BIT23
        UFWP                    = 0x318,
-       RATR0                   = 0x320, // Rate Adaptive Table register1
-//----------------------------------------------------------------------------
-//       8190 Rate Adaptive Table Register     (offset 0x320, 4 byte)
-//----------------------------------------------------------------------------
-//CCK
+       RATR0                   = 0x320,
 #define        RATR_1M                 0x00000001
 #define        RATR_2M                 0x00000002
 #define        RATR_55M                0x00000004
 #define        RATR_11M                0x00000008
-//OFDM
 #define        RATR_6M                 0x00000010
 #define        RATR_9M                 0x00000020
 #define        RATR_12M                0x00000040
@@ -443,7 +422,6 @@ enum _RTL8192Pci_HW {
 #define        RATR_36M                0x00000200
 #define        RATR_48M                0x00000400
 #define        RATR_54M                0x00000800
-//MCS 1 Spatial Stream
 #define        RATR_MCS0               0x00001000
 #define        RATR_MCS1               0x00002000
 #define        RATR_MCS2               0x00004000
@@ -452,7 +430,6 @@ enum _RTL8192Pci_HW {
 #define        RATR_MCS5               0x00020000
 #define        RATR_MCS6               0x00040000
 #define        RATR_MCS7               0x00080000
-//MCS 2 Spatial Stream
 #define        RATR_MCS8               0x00100000
 #define        RATR_MCS9               0x00200000
 #define        RATR_MCS10              0x00400000
@@ -461,7 +438,6 @@ enum _RTL8192Pci_HW {
 #define        RATR_MCS13              0x02000000
 #define        RATR_MCS14              0x04000000
 #define        RATR_MCS15              0x08000000
-// ALL CCK Rate
 #define RATE_ALL_CCK           RATR_1M|RATR_2M|RATR_55M|RATR_11M
 #define RATE_ALL_OFDM_AG       RATR_6M|RATR_9M|RATR_12M|RATR_18M|RATR_24M|RATR_36M|RATR_48M|RATR_54M
 #define RATE_ALL_OFDM_1SS      RATR_MCS0|RATR_MCS1|RATR_MCS2|RATR_MCS3 | \
@@ -470,22 +446,20 @@ enum _RTL8192Pci_HW {
                                                                        RATR_MCS12|RATR_MCS13|RATR_MCS14|RATR_MCS15
 
 
-       DRIVER_RSSI             = 0x32c,        // Driver tell Firmware current RSSI
-       MCS_TXAGC               = 0x340, // MCS AGC
-       CCK_TXAGC               = 0x348, // CCK AGC
-       MacBlkCtrl              = 0x403, // Mac block on/off control register
+       DRIVER_RSSI             = 0x32c,
+       MCS_TXAGC               = 0x340,
+       CCK_TXAGC               = 0x348,
+       MacBlkCtrl              = 0x403,
 
-};
+}
+;
 
 #define GPI 0x108
 #define GPO 0x109
 #define GPE 0x10a
 
-#define        ANAPAR_FOR_8192PciE                                                     0x17            // Analog parameter register
+#define         HWSET_MAX_SIZE_92S                              128
 
-#define        MSR_NOLINK                                      0x00
-#define        MSR_ADHOC                                       0x01
-#define        MSR_INFRA                                       0x02
-#define        MSR_AP                                          0x03
+#define        ANAPAR_FOR_8192PciE                                                     0x17
 
 #endif
diff --git a/drivers/staging/rtl8192e/r8192E_hwimg.c b/drivers/staging/rtl8192e/r8192E_hwimg.c
new file mode 100644 (file)
index 0000000..1b42f73
--- /dev/null
@@ -0,0 +1,3337 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+/*Created on  2008/11/18,  3: 7*/
+
+#include "r8192E_hwimg.h"
+
+u8 Rtl8192PciEFwBootArray[BootArrayLengthPciE] = {
+0x10,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x3c,0x08,0xbf,0xc0,0x25,0x08,0x00,0x08,
+0x3c,0x09,0xb0,0x03,0xad,0x28,0x00,0x20,0x40,0x80,0x68,0x00,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0xd0,0x00,0x40,0x8a,0x60,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x80,0x01,
+0x25,0x08,0xa8,0x04,0x24,0x09,0x00,0x01,0x3c,0x01,0x7f,0xff,0x34,0x21,0xff,0xff,
+0x01,0x01,0x50,0x24,0x00,0x09,0x48,0x40,0x35,0x29,0x00,0x01,0x01,0x2a,0x10,0x2b,
+0x14,0x40,0xff,0xfc,0x00,0x00,0x00,0x00,0x3c,0x0a,0x00,0x00,0x25,0x4a,0x00,0x00,
+0x4c,0x8a,0x00,0x00,0x4c,0x89,0x08,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x80,0x01,
+0x25,0x08,0xa8,0x04,0x3c,0x01,0x80,0x00,0x01,0x21,0x48,0x25,0x3c,0x0a,0xbf,0xc0,
+0x25,0x4a,0x00,0x7c,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0xad,0x00,0x00,0x00,
+0x21,0x08,0x00,0x04,0x01,0x09,0x10,0x2b,0x14,0x40,0xff,0xf8,0x00,0x00,0x00,0x00,
+0x3c,0x08,0x80,0x01,0x25,0x08,0x7f,0xff,0x24,0x09,0x00,0x01,0x3c,0x01,0x7f,0xff,
+0x34,0x21,0xff,0xff,0x01,0x01,0x50,0x24,0x00,0x09,0x48,0x40,0x35,0x29,0x00,0x01,
+0x01,0x2a,0x10,0x2b,0x14,0x40,0xff,0xfc,0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x01,
+0x25,0x4a,0x00,0x00,0x3c,0x01,0x7f,0xff,0x34,0x21,0xff,0xff,0x01,0x41,0x50,0x24,
+0x3c,0x09,0x00,0x01,0x35,0x29,0x7f,0xff,0x4c,0x8a,0x20,0x00,0x4c,0x89,0x28,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x08,0x04,0x10,
+0x00,0x00,0x00,0x00,0x40,0x88,0xa0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x3c,0x08,0xbf,0xc0,0x00,0x00,0x00,0x00,0x8d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0xbf,0xc0,0x25,0x4a,0x01,0x20,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,
+0x3c,0x08,0xb0,0x03,0x8d,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x35,0x29,0x00,0x10,
+0xad,0x09,0x00,0x00,0x00,0x00,0x00,0x00,0x3c,0x08,0x80,0x00,0x25,0x08,0x4b,0x94,
+0x01,0x00,0x00,0x08,0x00,0x00,0x00,0x00,};
+
+u8 Rtl8192PciEFwMainArray[MainArrayLengthPciE] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
+0x40,0x04,0x68,0x00,0x40,0x05,0x70,0x00,0x40,0x06,0x40,0x00,0x0c,0x00,0x12,0x98,
+0x00,0x00,0x00,0x00,0x40,0x1a,0x68,0x00,0x33,0x5b,0x00,0x3c,0x17,0x60,0x00,0x09,
+0x00,0x00,0x00,0x00,0x40,0x1b,0x60,0x00,0x00,0x00,0x00,0x00,0x03,0x5b,0xd0,0x24,
+0x40,0x1a,0x70,0x00,0x03,0x40,0x00,0x08,0x42,0x00,0x00,0x10,0x00,0x00,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0xff,0x34,0x42,0xff,0xff,0x8c,0x43,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x00,0xd0,
+0xac,0x62,0x00,0x00,0x00,0x00,0x20,0x21,0x27,0x85,0x8b,0x70,0x00,0x85,0x18,0x21,
+0x24,0x84,0x00,0x01,0x28,0x82,0x00,0x0a,0x14,0x40,0xff,0xfc,0xa0,0x60,0x00,0x00,
+0x27,0x82,0x8b,0x7a,0x24,0x04,0x00,0x06,0x24,0x84,0xff,0xff,0xa4,0x40,0x00,0x00,
+0x04,0x81,0xff,0xfd,0x24,0x42,0x00,0x02,0x24,0x02,0x00,0x03,0xa3,0x82,0x8b,0x70,
+0x24,0x02,0x00,0x0a,0x24,0x03,0x09,0xc4,0xa3,0x82,0x8b,0x72,0x24,0x02,0x00,0x04,
+0x24,0x04,0x00,0x01,0x24,0x05,0x00,0x02,0xa7,0x83,0x8b,0x86,0xa3,0x82,0x8b,0x78,
+0x24,0x03,0x04,0x00,0x24,0x02,0x02,0x00,0xaf,0x83,0x8b,0x8c,0xa3,0x85,0x8b,0x79,
+0xa7,0x82,0x8b,0x7a,0xa7,0x84,0x8b,0x7c,0xaf,0x84,0x8b,0x88,0xa3,0x84,0x8b,0x71,
+0xa3,0x80,0x8b,0x73,0xa3,0x80,0x8b,0x74,0xa3,0x80,0x8b,0x75,0xa3,0x84,0x8b,0x76,
+0xa3,0x85,0x8b,0x77,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x24,0x42,0x01,0x7c,0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,
+0x27,0x84,0x8b,0x98,0x00,0x00,0x10,0x21,0x24,0x42,0x00,0x01,0x00,0x02,0x16,0x00,
+0x00,0x02,0x16,0x03,0x28,0x43,0x00,0x03,0xac,0x80,0xff,0xfc,0xa0,0x80,0x00,0x00,
+0x14,0x60,0xff,0xf9,0x24,0x84,0x00,0x0c,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x01,0xc0,
+0x3c,0x08,0xb0,0x03,0xac,0x62,0x00,0x00,0x35,0x08,0x00,0x70,0x8d,0x02,0x00,0x00,
+0x00,0xa0,0x48,0x21,0x00,0x04,0x26,0x00,0x00,0x02,0x2a,0x43,0x00,0x06,0x36,0x00,
+0x00,0x07,0x3e,0x00,0x00,0x02,0x12,0x03,0x29,0x23,0x00,0x03,0x00,0x04,0x56,0x03,
+0x00,0x06,0x36,0x03,0x00,0x07,0x3e,0x03,0x30,0x48,0x00,0x01,0x10,0x60,0x00,0x11,
+0x30,0xa5,0x00,0x07,0x24,0x02,0x00,0x02,0x00,0x49,0x10,0x23,0x00,0x45,0x10,0x07,
+0x30,0x42,0x00,0x01,0x10,0x40,0x00,0x66,0x00,0x00,0x00,0x00,0x8f,0xa2,0x00,0x10,
+0x00,0x00,0x00,0x00,0x00,0x02,0x21,0x43,0x11,0x00,0x00,0x10,0x00,0x07,0x20,0x0b,
+0x15,0x20,0x00,0x06,0x24,0x02,0x00,0x01,0x3c,0x02,0xb0,0x05,0x34,0x42,0x01,0x20,
+0xa4,0x44,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x11,0x22,0x00,0x04,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x05,0x08,0x00,0x00,0x94,0x34,0x42,0x01,0x24,
+0x3c,0x02,0xb0,0x05,0x08,0x00,0x00,0x94,0x34,0x42,0x01,0x22,0x15,0x20,0x00,0x54,
+0x24,0x02,0x00,0x01,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x74,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0xaf,0x83,0x8b,0x94,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x70,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x6b,0x00,0x08,0x11,0x60,0x00,0x18,
+0x00,0x09,0x28,0x40,0x00,0x00,0x40,0x21,0x27,0x85,0x8b,0x90,0x8c,0xa3,0x00,0x00,
+0x8c,0xa2,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x62,0x38,0x23,0x00,0x43,0x10,0x2a,
+0x10,0x40,0x00,0x3d,0x00,0x00,0x00,0x00,0xac,0xa7,0x00,0x00,0x25,0x02,0x00,0x01,
+0x00,0x02,0x16,0x00,0x00,0x02,0x46,0x03,0x29,0x03,0x00,0x03,0x14,0x60,0xff,0xf3,
+0x24,0xa5,0x00,0x0c,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x70,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x4b,0x10,0x23,0xa0,0x62,0x00,0x00,0x00,0x09,0x28,0x40,
+0x00,0xa9,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x8b,0x98,0x00,0x0a,0x20,0x0b,
+0x00,0x43,0x18,0x21,0x10,0xc0,0x00,0x05,0x00,0x00,0x38,0x21,0x80,0x62,0x00,0x01,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x80,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x03,0x00,0xa9,0x10,0x21,0x24,0x07,0x00,0x01,
+0x00,0xa9,0x10,0x21,0x00,0x02,0x30,0x80,0x27,0x82,0x8b,0x98,0xa0,0x67,0x00,0x01,
+0x00,0xc2,0x38,0x21,0x80,0xe3,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x07,
+0x00,0x00,0x00,0x00,0x27,0x83,0x8b,0x90,0x00,0xc3,0x18,0x21,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x21,0xac,0x62,0x00,0x00,0x27,0x85,0x8b,0x94,
+0x27,0x82,0x8b,0x90,0x00,0xc5,0x28,0x21,0x00,0xc2,0x10,0x21,0x8c,0x43,0x00,0x00,
+0x8c,0xa4,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x64,0x18,0x2a,0x14,0x60,0x00,0x03,
+0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0xa0,0xe2,0x00,0x00,0xa0,0xe0,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0xb7,0xac,0xa0,0x00,0x00,
+0x11,0x22,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x7c,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x83,0x8b,0xac,0x08,0x00,0x00,0xa7,
+0x3c,0x02,0xb0,0x03,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x78,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0xaf,0x83,0x8b,0xa0,0x08,0x00,0x00,0xa7,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x04,0x10,
+0x3c,0x05,0xb0,0x03,0xac,0x62,0x00,0x00,0x34,0xa5,0x00,0x70,0x8c,0xa2,0x00,0x00,
+0x90,0x84,0x00,0x08,0x3c,0x06,0xb0,0x03,0x00,0x02,0x16,0x00,0x2c,0x83,0x00,0x03,
+0x34,0xc6,0x00,0x72,0x24,0x07,0x00,0x01,0x10,0x60,0x00,0x11,0x00,0x02,0x2f,0xc2,
+0x90,0xc2,0x00,0x00,0x00,0x00,0x18,0x21,0x00,0x02,0x16,0x00,0x10,0xa7,0x00,0x09,
+0x00,0x02,0x16,0x03,0x14,0x80,0x00,0x0c,0x30,0x43,0x00,0x03,0x83,0x82,0x8b,0x98,
+0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x00,0x02,0x16,0x00,
+0x00,0x02,0x1e,0x03,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x72,0xa0,0x43,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0x45,0x00,0x05,0x10,0x87,0x00,0x04,
+0x30,0x43,0x00,0x06,0x93,0x82,0x8b,0xb0,0x08,0x00,0x01,0x1f,0x00,0x43,0x10,0x21,
+0x83,0x82,0x8b,0xa4,0x00,0x00,0x00,0x00,0x00,0x02,0x10,0x40,0x08,0x00,0x01,0x1f,
+0x00,0x45,0x10,0x21,0x10,0x80,0x00,0x05,0x00,0x00,0x18,0x21,0x24,0x63,0x00,0x01,
+0x00,0x64,0x10,0x2b,0x14,0x40,0xff,0xfd,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x24,0x42,0x04,0xe4,
+0x3c,0x04,0xb0,0x02,0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,0x34,0x84,0x00,0x08,
+0x24,0x02,0x00,0x01,0xaf,0x84,0x8b,0xc0,0xa3,0x82,0x8b,0xd0,0xa7,0x80,0x8b,0xc4,
+0xa7,0x80,0x8b,0xc6,0xaf,0x80,0x8b,0xc8,0xaf,0x80,0x8b,0xcc,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,
+0x24,0x42,0x05,0x24,0x3c,0x04,0xb0,0x03,0xac,0x62,0x00,0x00,0x34,0x84,0x00,0xac,
+0x80,0xa2,0x00,0x15,0x8c,0x83,0x00,0x00,0x27,0xbd,0xff,0xf0,0x00,0x43,0x10,0x21,
+0xac,0x82,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x10,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x00,0x34,0x42,0x00,0x20,0x24,0x63,0x05,0x5c,0x27,0xbd,0xff,0xe0,
+0xac,0x43,0x00,0x00,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x18,
+0x8f,0x90,0x8b,0xc0,0x0c,0x00,0x02,0x98,0x00,0x80,0x88,0x21,0x14,0x40,0x00,0x2a,
+0x3c,0x02,0x00,0x80,0x16,0x20,0x00,0x02,0x34,0x42,0x02,0x01,0x24,0x02,0x02,0x01,
+0xae,0x02,0x00,0x00,0x97,0x84,0x8b,0xc4,0x97,0x82,0x8b,0xc6,0x3c,0x03,0xb0,0x02,
+0x00,0x83,0x20,0x21,0x24,0x42,0x00,0x04,0xa7,0x82,0x8b,0xc6,0xa4,0x82,0x00,0x00,
+0x8f,0x84,0x8b,0xc8,0x8f,0x82,0x8b,0xc0,0x93,0x85,0x8b,0x72,0x24,0x84,0x00,0x01,
+0x24,0x42,0x00,0x04,0x24,0x03,0x8f,0xff,0x3c,0x07,0xb0,0x06,0x3c,0x06,0xb0,0x03,
+0x00,0x43,0x10,0x24,0x00,0x85,0x28,0x2a,0x34,0xe7,0x80,0x18,0xaf,0x82,0x8b,0xc0,
+0xaf,0x84,0x8b,0xc8,0x10,0xa0,0x00,0x08,0x34,0xc6,0x01,0x08,0x8f,0x83,0x8b,0xcc,
+0x8f,0x84,0x8b,0x8c,0x8c,0xc2,0x00,0x00,0x00,0x64,0x18,0x21,0x00,0x43,0x10,0x2b,
+0x14,0x40,0x00,0x09,0x00,0x00,0x00,0x00,0x8c,0xe2,0x00,0x00,0x3c,0x03,0x0f,0x00,
+0x3c,0x04,0x04,0x00,0x00,0x43,0x10,0x24,0x10,0x44,0x00,0x03,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x04,0x96,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x27,0xbd,0xff,0xd8,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x00,0x24,0x63,0x06,0x48,0xaf,0xb0,0x00,0x10,0x34,0x42,0x00,0x20,
+0x8f,0x90,0x8b,0xc0,0xac,0x43,0x00,0x00,0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x20,0x00,0x80,0x88,0x21,0x00,0xa0,0x90,0x21,
+0x0c,0x00,0x02,0x98,0x00,0xc0,0x98,0x21,0x24,0x07,0x8f,0xff,0x14,0x40,0x00,0x19,
+0x26,0x03,0x00,0x04,0x24,0x02,0x0e,0x03,0xae,0x02,0x00,0x00,0x00,0x67,0x80,0x24,
+0x26,0x02,0x00,0x04,0xae,0x11,0x00,0x00,0x00,0x47,0x80,0x24,0x97,0x86,0x8b,0xc4,
+0x26,0x03,0x00,0x04,0xae,0x12,0x00,0x00,0x00,0x67,0x80,0x24,0xae,0x13,0x00,0x00,
+0x8f,0x84,0x8b,0xc0,0x3c,0x02,0xb0,0x02,0x97,0x85,0x8b,0xc6,0x00,0xc2,0x30,0x21,
+0x8f,0x82,0x8b,0xc8,0x24,0x84,0x00,0x10,0x24,0xa5,0x00,0x10,0x00,0x87,0x20,0x24,
+0x24,0x42,0x00,0x01,0xa7,0x85,0x8b,0xc6,0xaf,0x84,0x8b,0xc0,0xaf,0x82,0x8b,0xc8,
+0xa4,0xc5,0x00,0x00,0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,
+0x94,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x42,0xe0,0x00,0x14,0x40,0x00,0x14,
+0x00,0x00,0x00,0x00,0x90,0x82,0x00,0x02,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfc,
+0x00,0x82,0x28,0x21,0x8c,0xa4,0x00,0x00,0x3c,0x02,0x00,0x70,0x8c,0xa6,0x00,0x08,
+0x00,0x82,0x10,0x21,0x2c,0x43,0x00,0x06,0x10,0x60,0x00,0x09,0x3c,0x03,0x80,0x01,
+0x00,0x02,0x10,0x80,0x24,0x63,0x01,0xe8,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0xaf,0x86,0x80,0x14,
+0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x8c,0xa4,0x00,0x00,0x0c,0x00,0x17,0x84,0x00,0x00,0x00,0x00,0x08,0x00,0x01,0xdc,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x24,0x49,0x00,0xc0,0x20,0x21,0x08,0x00,0x01,0xdc,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x08,0x8c,0x44,0x00,0x00,
+0x8f,0x82,0x80,0x18,0x3c,0x03,0x00,0x0f,0x34,0x63,0x42,0x40,0x00,0x43,0x10,0x21,
+0x00,0x82,0x20,0x2b,0x10,0x80,0x00,0x09,0x24,0x03,0x00,0x05,0x8f,0x82,0x83,0x60,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xaf,0x82,0x83,0x60,0x10,0x43,0x00,0x03,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x8c,0x63,0x01,0x08,0x24,0x02,0x00,0x01,0xa3,0x82,0x80,0x11,0xaf,0x80,0x83,0x60,
+0xaf,0x83,0x80,0x18,0x08,0x00,0x01,0xf9,0x00,0x00,0x00,0x00,0x30,0x84,0x00,0xff,
+0x14,0x80,0x00,0x2f,0x00,0x00,0x00,0x00,0x8f,0x82,0x80,0x14,0xa3,0x85,0x83,0x93,
+0x10,0x40,0x00,0x2b,0x2c,0xa2,0x00,0x04,0x14,0x40,0x00,0x06,0x00,0x05,0x10,0x40,
+0x24,0xa2,0xff,0xfc,0x2c,0x42,0x00,0x08,0x10,0x40,0x00,0x09,0x24,0xa2,0xff,0xf0,
+0x00,0x05,0x10,0x40,0x27,0x84,0x83,0x9c,0x00,0x44,0x10,0x21,0x94,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,0x03,0xe0,0x00,0x08,0xa4,0x43,0x00,0x00,
+0x2c,0x42,0x00,0x10,0x14,0x40,0x00,0x0a,0x00,0x05,0x10,0x40,0x24,0xa2,0xff,0xe0,
+0x2c,0x42,0x00,0x10,0x14,0x40,0x00,0x06,0x00,0x05,0x10,0x40,0x24,0xa2,0xff,0xd0,
+0x2c,0x42,0x00,0x10,0x10,0x40,0x00,0x09,0x24,0xa2,0xff,0xc0,0x00,0x05,0x10,0x40,
+0x27,0x84,0x83,0x9c,0x00,0x44,0x10,0x21,0x94,0x43,0xff,0xf8,0x00,0x00,0x00,0x00,
+0x24,0x63,0x00,0x01,0x03,0xe0,0x00,0x08,0xa4,0x43,0xff,0xf8,0x2c,0x42,0x00,0x10,
+0x10,0x40,0x00,0x07,0x00,0x05,0x10,0x40,0x27,0x84,0x83,0x9c,0x00,0x44,0x10,0x21,
+0x94,0x43,0xff,0xf8,0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,0xa4,0x43,0xff,0xf8,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x8f,0x86,0x8b,0xc0,0x8f,0x82,0x80,0x14,
+0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x10,0x40,0x00,0x2a,0x00,0xc0,0x38,0x21,
+0x24,0x02,0x00,0x07,0x24,0x03,0xff,0x9c,0xa3,0x82,0x83,0x9b,0xa3,0x83,0x83,0x9a,
+0x27,0x8a,0x83,0x98,0x00,0x00,0x20,0x21,0x24,0x09,0x8f,0xff,0x00,0x04,0x10,0x80,
+0x00,0x4a,0x28,0x21,0x8c,0xa2,0x00,0x00,0x24,0xe3,0x00,0x04,0x24,0x88,0x00,0x01,
+0xac,0xe2,0x00,0x00,0x10,0x80,0x00,0x02,0x00,0x69,0x38,0x24,0xac,0xa0,0x00,0x00,
+0x31,0x04,0x00,0xff,0x2c,0x82,0x00,0x27,0x14,0x40,0xff,0xf5,0x00,0x04,0x10,0x80,
+0x97,0x83,0x8b,0xc6,0x97,0x85,0x8b,0xc4,0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x9c,
+0x00,0xa2,0x28,0x21,0x3c,0x04,0xb0,0x06,0xa7,0x83,0x8b,0xc6,0x34,0x84,0x80,0x18,
+0xa4,0xa3,0x00,0x00,0x8c,0x85,0x00,0x00,0x24,0x02,0x8f,0xff,0x24,0xc6,0x00,0x9c,
+0x3c,0x03,0x0f,0x00,0x00,0xc2,0x30,0x24,0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,
+0xaf,0x86,0x8b,0xc0,0x10,0xa2,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x96,
+0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x8f,0x86,0x8b,0xc0,0x27,0xbd,0xff,0xc8,0x24,0x02,0x00,0x08,
+0x24,0x03,0x00,0x20,0xaf,0xbf,0x00,0x30,0xa3,0xa2,0x00,0x13,0xa3,0xa3,0x00,0x12,
+0xa7,0xa4,0x00,0x10,0x00,0xc0,0x28,0x21,0x27,0xa9,0x00,0x10,0x00,0x00,0x38,0x21,
+0x24,0x08,0x8f,0xff,0x00,0x07,0x10,0x80,0x00,0x49,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x24,0xe3,0x00,0x01,0x30,0x67,0x00,0xff,0x24,0xa2,0x00,0x04,0x2c,0xe3,0x00,0x08,
+0xac,0xa4,0x00,0x00,0x14,0x60,0xff,0xf7,0x00,0x48,0x28,0x24,0x97,0x83,0x8b,0xc6,
+0x97,0x85,0x8b,0xc4,0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x20,0x00,0xa2,0x28,0x21,
+0x3c,0x04,0xb0,0x06,0xa7,0x83,0x8b,0xc6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,
+0x8c,0x85,0x00,0x00,0x24,0x02,0x8f,0xff,0x24,0xc6,0x00,0x20,0x3c,0x03,0x0f,0x00,
+0x00,0xc2,0x30,0x24,0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,0xaf,0x86,0x8b,0xc0,
+0x10,0xa2,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x96,0x00,0x00,0x00,0x00,
+0x8f,0xbf,0x00,0x30,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,
+0x93,0x82,0x8b,0xd0,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x11,0x24,0x06,0x00,0x01,
+0x8f,0x82,0x8b,0xc8,0x3c,0x05,0xb0,0x06,0x3c,0x04,0xb0,0x03,0x34,0xa5,0x80,0x18,
+0x34,0x84,0x01,0x08,0x14,0x40,0x00,0x09,0x00,0x00,0x30,0x21,0x97,0x82,0x8b,0xc4,
+0x8c,0x84,0x00,0x00,0x3c,0x03,0xb0,0x02,0x00,0x43,0x10,0x21,0xaf,0x84,0x8b,0xcc,
+0xa7,0x80,0x8b,0xc6,0xac,0x40,0x00,0x00,0xac,0x40,0x00,0x04,0x8c,0xa2,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0xc0,0x10,0x21,0x8f,0x86,0x8b,0xc0,0x8f,0x82,0x8b,0xc8,
+0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x00,0xc0,0x40,0x21,0x14,0x40,0x00,0x0a,
+0x00,0x40,0x50,0x21,0x00,0x00,0x38,0x21,0x27,0x89,0x83,0x68,0x24,0xe2,0x00,0x01,
+0x00,0x07,0x18,0x80,0x30,0x47,0x00,0xff,0x00,0x69,0x18,0x21,0x2c,0xe2,0x00,0x0a,
+0x14,0x40,0xff,0xfa,0xac,0x60,0x00,0x00,0x3c,0x02,0x00,0x80,0x10,0x82,0x00,0x6f,
+0x00,0x00,0x00,0x00,0x97,0x82,0x83,0x6e,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,
+0xa7,0x82,0x83,0x6e,0x90,0xa3,0x00,0x15,0x97,0x82,0x83,0x70,0x00,0x03,0x1e,0x00,
+0x00,0x03,0x1e,0x03,0x00,0x43,0x10,0x21,0xa7,0x82,0x83,0x70,0x8c,0xa4,0x00,0x20,
+0x3c,0x02,0x00,0x60,0x3c,0x03,0x00,0x20,0x00,0x82,0x20,0x24,0x10,0x83,0x00,0x54,
+0x00,0x00,0x00,0x00,0x14,0x80,0x00,0x47,0x00,0x00,0x00,0x00,0x97,0x82,0x83,0x74,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xa7,0x82,0x83,0x74,0x84,0xa3,0x00,0x06,
+0x8f,0x82,0x83,0x84,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x21,0xaf,0x82,0x83,0x84,
+0x25,0x42,0x00,0x01,0x28,0x43,0x27,0x10,0xaf,0x82,0x8b,0xc8,0x10,0x60,0x00,0x09,
+0x24,0x02,0x00,0x04,0x93,0x83,0x80,0x11,0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x05,
+0x24,0x02,0x00,0x04,0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x24,0x03,0x00,0x28,0xa3,0x83,0x83,0x6a,0xa3,0x82,0x83,0x6b,
+0x90,0xa2,0x00,0x18,0x93,0x83,0x83,0x93,0x00,0x00,0x38,0x21,0x00,0x02,0x16,0x00,
+0x00,0x02,0x16,0x03,0xa7,0x82,0x83,0x7e,0xa3,0x83,0x83,0x8c,0x27,0x89,0x83,0x68,
+0x24,0x05,0x8f,0xff,0x00,0x07,0x10,0x80,0x00,0x49,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x24,0xe3,0x00,0x01,0x30,0x67,0x00,0xff,0x25,0x02,0x00,0x04,0x2c,0xe3,0x00,0x0a,
+0xad,0x04,0x00,0x00,0x14,0x60,0xff,0xf7,0x00,0x45,0x40,0x24,0x97,0x83,0x8b,0xc6,
+0x97,0x85,0x8b,0xc4,0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x28,0x00,0xa2,0x28,0x21,
+0x3c,0x04,0xb0,0x06,0xa7,0x83,0x8b,0xc6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,
+0x8c,0x85,0x00,0x00,0x24,0x02,0x8f,0xff,0x24,0xc6,0x00,0x28,0x3c,0x03,0x0f,0x00,
+0x00,0xc2,0x30,0x24,0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,0xaf,0x86,0x8b,0xc0,
+0x10,0xa2,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x96,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x02,0x36,0x00,0x00,0x00,0x00,0xa3,0x80,0x80,0x11,0x08,0x00,0x02,0xe5,
+0x00,0x00,0x00,0x00,0x97,0x82,0x83,0x76,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,
+0xa7,0x82,0x83,0x76,0x84,0xa3,0x00,0x06,0x8f,0x82,0x83,0x88,0x00,0x00,0x00,0x00,
+0x00,0x43,0x10,0x21,0xaf,0x82,0x83,0x88,0x08,0x00,0x02,0xdd,0x25,0x42,0x00,0x01,
+0x97,0x82,0x83,0x72,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xa7,0x82,0x83,0x72,
+0x84,0xa3,0x00,0x06,0x8f,0x82,0x83,0x80,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x21,
+0xaf,0x82,0x83,0x80,0x08,0x00,0x02,0xdd,0x25,0x42,0x00,0x01,0x97,0x82,0x83,0x6c,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xa7,0x82,0x83,0x6c,0x08,0x00,0x02,0xc5,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xd0,0xaf,0xbf,0x00,0x28,0x8c,0xa3,0x00,0x20,
+0x8f,0x8a,0x8b,0xc0,0x3c,0x02,0x00,0x10,0x00,0x62,0x10,0x24,0x00,0xa0,0x38,0x21,
+0x01,0x40,0x48,0x21,0x10,0x40,0x00,0x3d,0x00,0x80,0x28,0x21,0x8c,0xe4,0x00,0x1c,
+0x34,0xa5,0x12,0x06,0xaf,0xa5,0x00,0x10,0x8c,0x82,0x00,0x08,0x00,0x03,0x1c,0x42,
+0x30,0x63,0x00,0x30,0x00,0x02,0x13,0x02,0x30,0x42,0x00,0x40,0x00,0x43,0x10,0x25,
+0x90,0xe6,0x00,0x10,0x90,0xe4,0x00,0x13,0x94,0xe8,0x00,0x0c,0x94,0xe3,0x00,0x1a,
+0x00,0x02,0x16,0x00,0x90,0xe7,0x00,0x12,0x00,0xa2,0x28,0x25,0x24,0x02,0x12,0x34,
+0xa7,0xa2,0x00,0x1c,0x24,0x02,0x56,0x78,0xaf,0xa5,0x00,0x10,0xa3,0xa6,0x00,0x18,
+0xa3,0xa7,0x00,0x1f,0xa7,0xa3,0x00,0x1a,0xa3,0xa4,0x00,0x19,0xa7,0xa8,0x00,0x20,
+0xa7,0xa2,0x00,0x22,0x00,0x00,0x28,0x21,0x27,0xa7,0x00,0x10,0x24,0x06,0x8f,0xff,
+0x00,0x05,0x10,0x80,0x00,0x47,0x10,0x21,0x8c,0x44,0x00,0x00,0x24,0xa3,0x00,0x01,
+0x30,0x65,0x00,0xff,0x25,0x22,0x00,0x04,0x2c,0xa3,0x00,0x05,0xad,0x24,0x00,0x00,
+0x14,0x60,0xff,0xf7,0x00,0x46,0x48,0x24,0x97,0x83,0x8b,0xc6,0x97,0x85,0x8b,0xc4,
+0x3c,0x02,0xb0,0x02,0x24,0x63,0x00,0x14,0x00,0xa2,0x28,0x21,0x3c,0x04,0xb0,0x06,
+0xa7,0x83,0x8b,0xc6,0x34,0x84,0x80,0x18,0xa4,0xa3,0x00,0x00,0x8c,0x85,0x00,0x00,
+0x24,0x02,0x8f,0xff,0x25,0x46,0x00,0x14,0x3c,0x03,0x0f,0x00,0x00,0xc2,0x50,0x24,
+0x00,0xa3,0x28,0x24,0x3c,0x02,0x04,0x00,0xaf,0x8a,0x8b,0xc0,0x10,0xa2,0x00,0x03,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x96,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x28,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,0x3c,0x05,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xc8,0x00,0x04,0x22,0x00,0x34,0xa5,0x00,0x20,
+0x24,0x42,0x0d,0xfc,0x3c,0x03,0xb0,0x00,0xaf,0xb5,0x00,0x24,0xaf,0xb4,0x00,0x20,
+0xaf,0xb2,0x00,0x18,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x30,0x00,0x83,0x80,0x21,
+0xaf,0xb7,0x00,0x2c,0xaf,0xb6,0x00,0x28,0xaf,0xb3,0x00,0x1c,0xaf,0xb1,0x00,0x14,
+0xac,0xa2,0x00,0x00,0x8e,0x09,0x00,0x00,0x00,0x00,0x90,0x21,0x26,0x10,0x00,0x08,
+0x00,0x09,0xa6,0x02,0x12,0x80,0x00,0x13,0x00,0x00,0xa8,0x21,0x24,0x13,0x00,0x02,
+0x3c,0x16,0x00,0xff,0x3c,0x17,0xff,0x00,0x8e,0x09,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x09,0x12,0x02,0x24,0x42,0x00,0x02,0x31,0x25,0x00,0xff,0x10,0xb3,0x00,0x76,
+0x30,0x51,0x00,0xff,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x18,0x00,0x00,0x00,0x00,
+0x02,0x51,0x10,0x21,0x30,0x52,0xff,0xff,0x02,0x54,0x18,0x2b,0x14,0x60,0xff,0xf2,
+0x02,0x11,0x80,0x21,0x12,0xa0,0x00,0x0a,0x3c,0x02,0xb0,0x06,0x34,0x42,0x80,0x18,
+0x8c,0x43,0x00,0x00,0x3c,0x04,0x0f,0x00,0x3c,0x02,0x04,0x00,0x00,0x64,0x18,0x24,
+0x10,0x62,0x00,0x03,0x00,0x00,0x00,0x00,0x0c,0x00,0x04,0x96,0x00,0x00,0x00,0x00,
+0x8f,0xbf,0x00,0x30,0x7b,0xb6,0x01,0x7c,0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0x8e,0x09,0x00,0x04,
+0x24,0x15,0x00,0x01,0x8e,0x06,0x00,0x0c,0x00,0x09,0x11,0x42,0x00,0x09,0x18,0xc2,
+0x30,0x48,0x00,0x03,0x00,0x09,0x14,0x02,0x30,0x6c,0x00,0x03,0x00,0x09,0x26,0x02,
+0x11,0x15,0x00,0x45,0x30,0x43,0x00,0x0f,0x29,0x02,0x00,0x02,0x14,0x40,0x00,0x26,
+0x00,0x00,0x00,0x00,0x11,0x13,0x00,0x0f,0x00,0x00,0x38,0x21,0x00,0x07,0x22,0x02,
+0x30,0x84,0xff,0x00,0x3c,0x03,0x00,0xff,0x00,0x07,0x2e,0x02,0x00,0x07,0x12,0x00,
+0x00,0x43,0x10,0x24,0x00,0xa4,0x28,0x25,0x00,0xa2,0x28,0x25,0x00,0x07,0x1e,0x00,
+0x00,0xa3,0x28,0x25,0x0c,0x00,0x01,0x92,0x01,0x20,0x20,0x21,0x08,0x00,0x03,0xa5,
+0x02,0x51,0x10,0x21,0x11,0x95,0x00,0x0f,0x00,0x00,0x00,0x00,0x11,0x88,0x00,0x07,
+0x00,0x00,0x00,0x00,0x00,0x04,0x10,0x80,0x27,0x83,0x8b,0x70,0x00,0x43,0x10,0x21,
+0x8c,0x47,0x00,0x18,0x08,0x00,0x03,0xcc,0x00,0x07,0x22,0x02,0x00,0x04,0x10,0x40,
+0x27,0x83,0x8b,0x78,0x00,0x43,0x10,0x21,0x94,0x47,0x00,0x02,0x08,0x00,0x03,0xcc,
+0x00,0x07,0x22,0x02,0x27,0x82,0x8b,0x70,0x00,0x82,0x10,0x21,0x90,0x47,0x00,0x00,
+0x08,0x00,0x03,0xcc,0x00,0x07,0x22,0x02,0x15,0x00,0xff,0xdc,0x00,0x00,0x38,0x21,
+0x10,0x75,0x00,0x05,0x00,0x80,0x38,0x21,0x00,0x65,0x18,0x26,0x24,0x82,0x01,0x00,
+0x00,0x00,0x38,0x21,0x00,0x43,0x38,0x0a,0x24,0x02,0x00,0x01,0x11,0x82,0x00,0x0e,
+0x3c,0x02,0xb0,0x03,0x24,0x02,0x00,0x02,0x11,0x82,0x00,0x06,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x00,0xe2,0x10,0x21,0x8c,0x47,0x00,0x00,0x08,0x00,0x03,0xcc,
+0x00,0x07,0x22,0x02,0x3c,0x02,0xb0,0x03,0x00,0xe2,0x10,0x21,0x94,0x43,0x00,0x00,
+0x08,0x00,0x03,0xcb,0x30,0x67,0xff,0xff,0x00,0xe2,0x10,0x21,0x90,0x43,0x00,0x00,
+0x08,0x00,0x03,0xcb,0x30,0x67,0x00,0xff,0x30,0x62,0x00,0x03,0x00,0x02,0x12,0x00,
+0x11,0x95,0x00,0x07,0x00,0x44,0x38,0x21,0x11,0x93,0x00,0x03,0x00,0x00,0x00,0x00,
+0x08,0x00,0x03,0xfd,0x3c,0x02,0xb0,0x0a,0x08,0x00,0x04,0x02,0x3c,0x02,0xb0,0x0a,
+0x08,0x00,0x04,0x06,0x3c,0x02,0xb0,0x0a,0x8e,0x09,0x00,0x04,0x8e,0x02,0x00,0x08,
+0x8e,0x03,0x00,0x0c,0x00,0x09,0x41,0x42,0x00,0x02,0x22,0x02,0x00,0x03,0x3a,0x02,
+0x30,0x84,0xff,0x00,0x30,0xe7,0xff,0x00,0x00,0x02,0x5e,0x02,0x00,0x02,0x32,0x00,
+0x00,0x03,0x56,0x02,0x00,0x03,0x2a,0x00,0x01,0x64,0x58,0x25,0x00,0xd6,0x30,0x24,
+0x01,0x47,0x50,0x25,0x00,0x02,0x16,0x00,0x00,0xb6,0x28,0x24,0x00,0x03,0x1e,0x00,
+0x01,0x66,0x58,0x25,0x01,0x45,0x50,0x25,0x00,0x57,0x10,0x24,0x00,0x77,0x18,0x24,
+0x01,0x62,0x38,0x25,0x01,0x43,0x30,0x25,0x00,0x09,0x10,0xc2,0x00,0x09,0x1c,0x02,
+0x31,0x08,0x00,0x03,0x30,0x4c,0x00,0x03,0x30,0x63,0x00,0x0f,0x00,0x09,0x26,0x02,
+0x00,0xe0,0x58,0x21,0x15,0x00,0x00,0x28,0x00,0xc0,0x50,0x21,0x24,0x02,0x00,0x01,
+0x10,0x62,0x00,0x06,0x00,0x80,0x28,0x21,0x24,0x02,0x00,0x03,0x14,0x62,0xff,0x69,
+0x02,0x51,0x10,0x21,0x24,0x85,0x01,0x00,0x24,0x02,0x00,0x01,0x11,0x82,0x00,0x15,
+0x24,0x02,0x00,0x02,0x11,0x82,0x00,0x0a,0x3c,0x03,0xb0,0x03,0x00,0xa3,0x18,0x21,
+0x8c,0x62,0x00,0x00,0x00,0x0a,0x20,0x27,0x01,0x6a,0x28,0x24,0x00,0x44,0x10,0x24,
+0x00,0x45,0x10,0x25,0xac,0x62,0x00,0x00,0x08,0x00,0x03,0xa5,0x02,0x51,0x10,0x21,
+0x00,0xa3,0x18,0x21,0x94,0x62,0x00,0x00,0x00,0x0a,0x20,0x27,0x01,0x6a,0x28,0x24,
+0x00,0x44,0x10,0x24,0x00,0x45,0x10,0x25,0xa4,0x62,0x00,0x00,0x08,0x00,0x03,0xa5,
+0x02,0x51,0x10,0x21,0x3c,0x03,0xb0,0x03,0x00,0xa3,0x18,0x21,0x90,0x62,0x00,0x00,
+0x00,0x0a,0x20,0x27,0x01,0x6a,0x28,0x24,0x00,0x44,0x10,0x24,0x00,0x45,0x10,0x25,
+0x08,0x00,0x03,0xa4,0xa0,0x62,0x00,0x00,0x24,0x02,0x00,0x01,0x11,0x02,0x00,0x21,
+0x00,0x00,0x00,0x00,0x15,0x13,0xff,0x42,0x00,0x00,0x00,0x00,0x11,0x82,0x00,0x17,
+0x00,0x00,0x00,0x00,0x11,0x88,0x00,0x0b,0x00,0x00,0x00,0x00,0x27,0x83,0x8b,0x70,
+0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,0x8c,0x82,0x00,0x18,0x00,0x06,0x18,0x27,
+0x00,0xe6,0x28,0x24,0x00,0x43,0x10,0x24,0x00,0x45,0x10,0x25,0x08,0x00,0x03,0xa4,
+0xac,0x82,0x00,0x18,0x27,0x83,0x8b,0x78,0x00,0x04,0x20,0x40,0x00,0x83,0x20,0x21,
+0x94,0x82,0x00,0x02,0x00,0x06,0x18,0x27,0x00,0xe6,0x28,0x24,0x00,0x43,0x10,0x24,
+0x00,0x45,0x10,0x25,0x08,0x00,0x03,0xa4,0xa4,0x82,0x00,0x02,0x27,0x83,0x8b,0x70,
+0x00,0x83,0x18,0x21,0x90,0x62,0x00,0x00,0x00,0x06,0x20,0x27,0x08,0x00,0x04,0x5a,
+0x00,0xe6,0x28,0x24,0x30,0x62,0x00,0x07,0x00,0x02,0x12,0x00,0x11,0x88,0x00,0x0f,
+0x00,0x44,0x10,0x21,0x11,0x93,0x00,0x07,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x0a,
+0x00,0x43,0x18,0x21,0x8c,0x62,0x00,0x00,0x00,0x06,0x20,0x27,0x08,0x00,0x04,0x47,
+0x00,0xe6,0x28,0x24,0x3c,0x03,0xb0,0x0a,0x00,0x43,0x18,0x21,0x94,0x62,0x00,0x00,
+0x00,0x06,0x20,0x27,0x08,0x00,0x04,0x50,0x00,0xe6,0x28,0x24,0x3c,0x03,0xb0,0x0a,
+0x08,0x00,0x04,0x7d,0x00,0x43,0x18,0x21,0x97,0x85,0x8b,0xc4,0x3c,0x07,0xb0,0x02,
+0x3c,0x04,0xb0,0x03,0x3c,0x02,0x80,0x00,0x00,0xa7,0x28,0x21,0x34,0x84,0x00,0x20,
+0x24,0x42,0x12,0x58,0x24,0x03,0xff,0x80,0xac,0x82,0x00,0x00,0xa0,0xa3,0x00,0x07,
+0x97,0x82,0x8b,0xc6,0x97,0x85,0x8b,0xc4,0x3c,0x06,0xb0,0x06,0x30,0x42,0xff,0xf8,
+0x24,0x42,0x00,0x10,0x00,0xa2,0x10,0x21,0x30,0x42,0x0f,0xff,0x24,0x44,0x00,0x08,
+0x30,0x84,0x0f,0xff,0x00,0x05,0x28,0xc2,0x3c,0x03,0x00,0x40,0x00,0xa3,0x28,0x25,
+0x00,0x87,0x20,0x21,0x34,0xc6,0x80,0x18,0xac,0xc5,0x00,0x00,0xaf,0x84,0x8b,0xc0,
+0xa7,0x82,0x8b,0xc4,0xa7,0x80,0x8b,0xc6,0xaf,0x80,0x8b,0xc8,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0xa5,0x00,0xff,0x30,0x84,0x00,0xff,0x24,0x02,0x00,0x01,
+0x00,0xe0,0x48,0x21,0x30,0xc6,0x00,0xff,0x8f,0xa7,0x00,0x10,0x10,0x82,0x00,0x07,
+0x00,0xa0,0x40,0x21,0x24,0x02,0x00,0x03,0x10,0x82,0x00,0x03,0x00,0x00,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x24,0xa8,0x01,0x00,0x3c,0x03,0xb0,0x03,
+0x24,0x02,0x00,0x01,0x00,0x07,0x20,0x27,0x01,0x27,0x28,0x24,0x10,0xc2,0x00,0x14,
+0x01,0x03,0x18,0x21,0x24,0x02,0x00,0x02,0x10,0xc2,0x00,0x09,0x00,0x07,0x50,0x27,
+0x3c,0x03,0xb0,0x03,0x01,0x03,0x18,0x21,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x4a,0x10,0x24,0x00,0x45,0x10,0x25,0x08,0x00,0x04,0xe1,0xac,0x62,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x01,0x03,0x18,0x21,0x94,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x4a,0x10,0x24,0x00,0x45,0x10,0x25,0x03,0xe0,0x00,0x08,0xa4,0x62,0x00,0x00,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x24,0x00,0x45,0x10,0x25,
+0xa0,0x62,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0x84,0x00,0x07,
+0x00,0x04,0x22,0x00,0x30,0xa5,0x00,0xff,0x00,0x85,0x28,0x21,0x3c,0x02,0xb0,0x0a,
+0x00,0xa2,0x40,0x21,0x30,0xc6,0x00,0xff,0x24,0x02,0x00,0x01,0x8f,0xa4,0x00,0x10,
+0x10,0xc2,0x00,0x14,0x24,0x02,0x00,0x02,0x00,0x04,0x50,0x27,0x10,0xc2,0x00,0x09,
+0x00,0xe4,0x48,0x24,0x3c,0x03,0xb0,0x0a,0x00,0xa3,0x18,0x21,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x4a,0x10,0x24,0x00,0x49,0x10,0x25,0x03,0xe0,0x00,0x08,
+0xac,0x62,0x00,0x00,0x3c,0x03,0xb0,0x0a,0x00,0xa3,0x18,0x21,0x94,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x4a,0x10,0x24,0x00,0x49,0x10,0x25,0x03,0xe0,0x00,0x08,
+0xa4,0x62,0x00,0x00,0x91,0x02,0x00,0x00,0x00,0x04,0x18,0x27,0x00,0xe4,0x20,0x24,
+0x00,0x43,0x10,0x24,0x00,0x44,0x10,0x25,0x03,0xe0,0x00,0x08,0xa1,0x02,0x00,0x00,
+0x30,0xa9,0x00,0xff,0x27,0x83,0x8b,0x70,0x30,0x85,0x00,0xff,0x24,0x02,0x00,0x01,
+0x00,0x07,0x50,0x27,0x00,0xc7,0x40,0x24,0x11,0x22,0x00,0x17,0x00,0xa3,0x18,0x21,
+0x00,0x05,0x20,0x40,0x27,0x82,0x8b,0x70,0x00,0x05,0x28,0x80,0x27,0x83,0x8b,0x78,
+0x00,0x83,0x50,0x21,0x00,0xa2,0x20,0x21,0x24,0x02,0x00,0x02,0x00,0x07,0x40,0x27,
+0x11,0x22,0x00,0x07,0x00,0xc7,0x28,0x24,0x8c,0x82,0x00,0x18,0x00,0x00,0x00,0x00,
+0x00,0x48,0x10,0x24,0x00,0x45,0x10,0x25,0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x18,
+0x95,0x42,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x48,0x10,0x24,0x00,0x45,0x10,0x25,
+0x03,0xe0,0x00,0x08,0xa5,0x42,0x00,0x02,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x4a,0x10,0x24,0x00,0x48,0x10,0x25,0x03,0xe0,0x00,0x08,0xa0,0x62,0x00,0x00,
+0x00,0x04,0x32,0x02,0x30,0xc6,0xff,0x00,0x00,0x04,0x16,0x02,0x00,0x04,0x1a,0x00,
+0x3c,0x05,0x00,0xff,0x00,0x65,0x18,0x24,0x00,0x46,0x10,0x25,0x00,0x43,0x10,0x25,
+0x00,0x04,0x26,0x00,0x03,0xe0,0x00,0x08,0x00,0x44,0x10,0x25,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xe8,0x34,0x63,0x00,0x20,0x24,0x42,0x14,0xdc,
+0x3c,0x04,0xb0,0x03,0xaf,0xbf,0x00,0x14,0xac,0x62,0x00,0x00,0xaf,0xb0,0x00,0x10,
+0x34,0x84,0x00,0x2c,0x8c,0x83,0x00,0x00,0xa7,0x80,0xbc,0x00,0x00,0x03,0x12,0x02,
+0x00,0x03,0x2d,0x02,0x30,0x42,0x0f,0xff,0xa3,0x83,0xbc,0x08,0xa7,0x85,0xbc,0x0c,
+0xa7,0x82,0xbc,0x0a,0xa7,0x80,0xbc,0x02,0xa7,0x80,0xbc,0x04,0xa7,0x80,0xbc,0x06,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x05,0x00,0x3c,0x05,0x08,0x00,0x00,0x45,0x28,0x25,
+0x24,0x04,0x05,0x00,0x0c,0x00,0x06,0xbf,0x00,0x40,0x80,0x21,0x3c,0x02,0xf7,0xff,
+0x34,0x42,0xff,0xff,0x02,0x02,0x80,0x24,0x02,0x00,0x28,0x21,0x0c,0x00,0x06,0xbf,
+0x24,0x04,0x05,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0xb0,0x03,0x34,0x42,0x01,0x08,
+0x34,0x63,0x01,0x18,0x8c,0x45,0x00,0x00,0x8c,0x64,0x00,0x00,0x3c,0x02,0x00,0x0f,
+0x3c,0x03,0x00,0x4c,0x30,0x84,0x02,0x00,0x34,0x63,0x4b,0x40,0xaf,0x85,0xbc,0x10,
+0x10,0x80,0x00,0x06,0x34,0x42,0x42,0x40,0xaf,0x83,0xbc,0x14,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0xaf,0x82,0xbc,0x14,
+0x08,0x00,0x05,0x67,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x27,0xbd,0xff,0xc8,0x34,0x63,0x00,0x20,0x24,0x42,0x15,0xb8,0x30,0x84,0x00,0xff,
+0xaf,0xbf,0x00,0x30,0xaf,0xb7,0x00,0x2c,0xaf,0xb6,0x00,0x28,0xaf,0xb5,0x00,0x24,
+0xaf,0xb4,0x00,0x20,0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,
+0xaf,0xb0,0x00,0x10,0xac,0x62,0x00,0x00,0x10,0x80,0x00,0x1c,0x24,0x02,0x00,0x02,
+0x10,0x82,0x00,0x08,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x30,0x7b,0xb6,0x01,0x7c,
+0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x38,0xa7,0x80,0xbc,0x00,0xa7,0x80,0xbc,0x02,0xa7,0x80,0xbc,0x04,
+0xa7,0x80,0xbc,0x06,0x0c,0x00,0x06,0xd1,0x24,0x04,0x05,0x00,0x3c,0x05,0x08,0x00,
+0x00,0x45,0x28,0x25,0x24,0x04,0x05,0x00,0x0c,0x00,0x06,0xbf,0x00,0x40,0x80,0x21,
+0x3c,0x05,0xf7,0xff,0x34,0xa5,0xff,0xff,0x02,0x05,0x28,0x24,0x0c,0x00,0x06,0xbf,
+0x24,0x04,0x05,0x00,0x08,0x00,0x05,0x82,0x00,0x00,0x00,0x00,0x0c,0x00,0x06,0xd1,
+0x24,0x04,0x05,0xa0,0x24,0x04,0x05,0xa4,0x0c,0x00,0x06,0xd1,0x00,0x02,0xbc,0x02,
+0x24,0x04,0x05,0xa8,0x00,0x02,0xb4,0x02,0x0c,0x00,0x06,0xd1,0x30,0x55,0xff,0xff,
+0x00,0x40,0x80,0x21,0x97,0x84,0xbc,0x00,0x97,0x82,0xbc,0x02,0x97,0x83,0xbc,0x06,
+0x02,0xe4,0x20,0x23,0x02,0xa2,0x10,0x23,0x00,0x82,0x20,0x21,0x97,0x82,0xbc,0x04,
+0x32,0x14,0xff,0xff,0x02,0x83,0x18,0x23,0x02,0xc2,0x10,0x23,0x00,0x82,0x20,0x21,
+0x93,0x82,0xbc,0x08,0x00,0x83,0x20,0x21,0x30,0x84,0xff,0xff,0x00,0x82,0x10,0x2b,
+0x14,0x40,0x00,0xaa,0x00,0x00,0x00,0x00,0x97,0x82,0xbc,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x44,0x10,0x2b,0x14,0x40,0x00,0x7f,0x00,0x00,0x00,0x00,0x97,0x82,0xbc,0x0a,
+0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x2b,0x10,0x40,0x00,0x3a,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x04,0x50,0x30,0x51,0x00,0x7f,0x00,0x40,0x80,0x21,
+0x2e,0x22,0x00,0x32,0x10,0x40,0x00,0x13,0x24,0x02,0x00,0x20,0x12,0x22,0x00,0x17,
+0x24,0x02,0xff,0x80,0x02,0x02,0x10,0x24,0x26,0x31,0x00,0x01,0x00,0x51,0x80,0x25,
+0x02,0x00,0x28,0x21,0x0c,0x00,0x06,0xbf,0x24,0x04,0x04,0x50,0x02,0x00,0x28,0x21,
+0x0c,0x00,0x06,0xbf,0x24,0x04,0x04,0x58,0x02,0x00,0x28,0x21,0x0c,0x00,0x06,0xbf,
+0x24,0x04,0x04,0x60,0x02,0x00,0x28,0x21,0x24,0x04,0x04,0x68,0x0c,0x00,0x06,0xbf,
+0x00,0x00,0x00,0x00,0xa7,0x97,0xbc,0x00,0xa7,0x95,0xbc,0x02,0xa7,0x96,0xbc,0x04,
+0xa7,0x94,0xbc,0x06,0x08,0x00,0x05,0x82,0x00,0x00,0x00,0x00,0x0c,0x00,0x06,0xd1,
+0x24,0x04,0x02,0x08,0x3c,0x04,0x00,0xc0,0x00,0x40,0x28,0x21,0x00,0x44,0x10,0x24,
+0x00,0x02,0x15,0x82,0x24,0x03,0x00,0x03,0x10,0x43,0x00,0x07,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,0x00,0xa2,0x10,0x24,0x00,0x44,0x28,0x25,
+0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x08,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x2c,
+0x00,0x40,0x90,0x21,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,0x02,0x42,0x90,0x24,
+0x02,0x40,0x28,0x21,0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x2c,0x08,0x00,0x05,0xc9,
+0x24,0x02,0xff,0x80,0x0c,0x00,0x06,0xd1,0x24,0x04,0x04,0x50,0x30,0x51,0x00,0x7f,
+0x24,0x02,0x00,0x20,0x16,0x22,0xff,0xdb,0x00,0x00,0x00,0x00,0x0c,0x00,0x06,0xd1,
+0x24,0x04,0x02,0x2c,0x34,0x52,0x40,0x00,0x02,0x40,0x28,0x21,0x0c,0x00,0x06,0xbf,
+0x24,0x04,0x02,0x2c,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x58,0x24,0x04,0x02,0x5c,
+0x0c,0x00,0x06,0xd1,0x00,0x02,0x9e,0x02,0x30,0x43,0x00,0xff,0x00,0x13,0x12,0x00,
+0x00,0x43,0x10,0x25,0x2c,0x43,0x00,0x04,0x14,0x60,0x00,0x1d,0x2c,0x42,0x00,0x11,
+0x10,0x40,0x00,0x0b,0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,
+0x02,0x42,0x90,0x24,0x02,0x40,0x28,0x21,0x24,0x04,0x02,0x2c,0x0c,0x00,0x06,0xbf,
+0x36,0x52,0x80,0x00,0x02,0x40,0x28,0x21,0x08,0x00,0x05,0xd7,0x24,0x04,0x02,0x2c,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x08,0x3c,0x04,0x00,0xc0,0x00,0x40,0x28,0x21,
+0x00,0x44,0x10,0x24,0x00,0x02,0x15,0x82,0x24,0x03,0x00,0x02,0x14,0x43,0xff,0xee,
+0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,0x00,0xa2,0x10,0x24,0x00,0x44,0x28,0x25,
+0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x08,0x08,0x00,0x06,0x13,0x3c,0x02,0xff,0xff,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x08,0x00,0x40,0x28,0x21,0x00,0x02,0x15,0x82,
+0x30,0x42,0x00,0x03,0x24,0x03,0x00,0x03,0x14,0x43,0xff,0xdf,0x3c,0x02,0xff,0x3f,
+0x34,0x42,0xff,0xff,0x00,0xa2,0x10,0x24,0x3c,0x03,0x00,0x80,0x08,0x00,0x06,0x28,
+0x00,0x43,0x28,0x25,0x0c,0x00,0x06,0xd1,0x24,0x04,0x04,0x50,0x30,0x51,0x00,0x7f,
+0x00,0x40,0x80,0x21,0x2e,0x22,0x00,0x32,0x10,0x40,0xff,0x9a,0x24,0x02,0x00,0x20,
+0x12,0x22,0x00,0x04,0x24,0x02,0xff,0x80,0x02,0x02,0x10,0x24,0x08,0x00,0x05,0xcb,
+0x26,0x31,0x00,0x02,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x08,0x3c,0x04,0x00,0xc0,
+0x00,0x40,0x28,0x21,0x00,0x44,0x10,0x24,0x00,0x02,0x15,0x82,0x24,0x03,0x00,0x03,
+0x10,0x43,0x00,0x07,0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,
+0x00,0xa2,0x10,0x24,0x00,0x44,0x28,0x25,0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x08,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x2c,0x00,0x40,0x90,0x21,0x3c,0x02,0xff,0xff,
+0x34,0x42,0x3f,0xff,0x02,0x42,0x90,0x24,0x02,0x40,0x28,0x21,0x0c,0x00,0x06,0xbf,
+0x24,0x04,0x02,0x2c,0x08,0x00,0x06,0x42,0x24,0x02,0xff,0x80,0x0c,0x00,0x06,0xd1,
+0x24,0x04,0x04,0x50,0x00,0x40,0x80,0x21,0x30,0x51,0x00,0x7f,0x24,0x02,0x00,0x20,
+0x12,0x22,0x00,0x1d,0x2e,0x22,0x00,0x21,0x14,0x40,0xff,0x72,0x24,0x02,0xff,0x80,
+0x02,0x02,0x10,0x24,0x26,0x31,0xff,0xff,0x00,0x51,0x80,0x25,0x24,0x04,0x04,0x50,
+0x0c,0x00,0x06,0xbf,0x02,0x00,0x28,0x21,0x24,0x04,0x04,0x58,0x0c,0x00,0x06,0xbf,
+0x02,0x00,0x28,0x21,0x24,0x04,0x04,0x60,0x0c,0x00,0x06,0xbf,0x02,0x00,0x28,0x21,
+0x02,0x00,0x28,0x21,0x0c,0x00,0x06,0xbf,0x24,0x04,0x04,0x68,0x24,0x02,0x00,0x20,
+0x16,0x22,0xff,0x60,0x00,0x00,0x00,0x00,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x2c,
+0x00,0x40,0x90,0x21,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,0x02,0x42,0x10,0x24,
+0x08,0x00,0x06,0x19,0x34,0x52,0x80,0x00,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x2c,
+0x34,0x52,0x40,0x00,0x02,0x40,0x28,0x21,0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x2c,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x58,0x24,0x04,0x02,0x5c,0x0c,0x00,0x06,0xd1,
+0x00,0x02,0x9e,0x02,0x30,0x43,0x00,0xff,0x00,0x13,0x12,0x00,0x00,0x43,0x10,0x25,
+0x2c,0x43,0x00,0x04,0x14,0x60,0x00,0x20,0x2c,0x42,0x00,0x11,0x10,0x40,0x00,0x0d,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0xff,0x34,0x42,0x3f,0xff,0x02,0x42,0x90,0x24,
+0x02,0x40,0x28,0x21,0x24,0x04,0x02,0x2c,0x0c,0x00,0x06,0xbf,0x36,0x52,0x80,0x00,
+0x02,0x40,0x28,0x21,0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x2c,0x08,0x00,0x06,0x66,
+0x2e,0x22,0x00,0x21,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x08,0x3c,0x04,0x00,0xc0,
+0x00,0x40,0x28,0x21,0x00,0x44,0x10,0x24,0x00,0x02,0x15,0x82,0x24,0x03,0x00,0x02,
+0x14,0x43,0xff,0xec,0x00,0x00,0x00,0x00,0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,
+0x00,0xa2,0x10,0x24,0x00,0x44,0x28,0x25,0x0c,0x00,0x06,0xbf,0x24,0x04,0x02,0x08,
+0x08,0x00,0x06,0x96,0x3c,0x02,0xff,0xff,0x0c,0x00,0x06,0xd1,0x24,0x04,0x02,0x08,
+0x00,0x40,0x28,0x21,0x00,0x02,0x15,0x82,0x30,0x42,0x00,0x03,0x24,0x03,0x00,0x03,
+0x14,0x43,0xff,0xdc,0x3c,0x03,0x00,0x80,0x3c,0x02,0xff,0x3f,0x34,0x42,0xff,0xff,
+0x00,0xa2,0x10,0x24,0x08,0x00,0x06,0xae,0x00,0x43,0x28,0x25,0x30,0x83,0x00,0x03,
+0x00,0x04,0x20,0x40,0x00,0x83,0x20,0x23,0x3c,0x02,0xb0,0x0a,0x00,0x82,0x20,0x21,
+0x3c,0x06,0x00,0x01,0xac,0x85,0x00,0x00,0x24,0x07,0x00,0x01,0x00,0x00,0x28,0x21,
+0x34,0xc6,0x86,0x9f,0x8c,0x82,0x10,0x00,0x24,0xa5,0x00,0x01,0x10,0x47,0x00,0x03,
+0x00,0xc5,0x18,0x2b,0x10,0x60,0xff,0xfb,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0x83,0x00,0x03,0x00,0x04,0x20,0x40,0x3c,0x02,0xb0,0x0a,
+0x00,0x83,0x20,0x23,0x00,0x82,0x20,0x21,0x3c,0x06,0x00,0x01,0x24,0x02,0xff,0xff,
+0xac,0x82,0x10,0x00,0x00,0x00,0x28,0x21,0x24,0x07,0x00,0x01,0x34,0xc6,0x86,0x9f,
+0x8c,0x82,0x10,0x00,0x24,0xa5,0x00,0x01,0x10,0x47,0x00,0x03,0x00,0xc5,0x18,0x2b,
+0x10,0x60,0xff,0xfb,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x3c,0x05,0xb0,0x03,0x3c,0x02,0x80,0x00,0x24,0x42,0x1b,0x94,
+0x24,0x03,0x00,0x01,0x34,0xa5,0x00,0x20,0x3c,0x06,0xb0,0x03,0xac,0xa2,0x00,0x00,
+0x34,0xc6,0x01,0x04,0xa0,0x83,0x00,0x48,0xa0,0x80,0x00,0x04,0xa0,0x80,0x00,0x05,
+0xa0,0x80,0x00,0x06,0xa0,0x80,0x00,0x07,0xa0,0x80,0x00,0x08,0xa0,0x80,0x00,0x09,
+0xa0,0x80,0x00,0x0a,0xa0,0x80,0x00,0x11,0xa0,0x80,0x00,0x13,0xa0,0x80,0x00,0x49,
+0x94,0xc2,0x00,0x00,0xac,0x80,0x00,0x00,0xa0,0x80,0x00,0x4e,0x00,0x02,0x14,0x00,
+0x00,0x02,0x14,0x03,0x30,0x43,0x00,0xff,0x30,0x42,0xff,0x00,0xa4,0x82,0x00,0x44,
+0xa4,0x83,0x00,0x46,0xac,0x80,0x00,0x24,0xac,0x80,0x00,0x28,0xac,0x80,0x00,0x2c,
+0xac,0x80,0x00,0x30,0xac,0x80,0x00,0x34,0xac,0x80,0x00,0x38,0xac,0x80,0x00,0x3c,
+0x03,0xe0,0x00,0x08,0xac,0x80,0x00,0x40,0x84,0x83,0x00,0x0c,0x3c,0x07,0xb0,0x03,
+0x34,0xe7,0x00,0x20,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x83,0x90,0x04,0x00,0x43,0x10,0x21,0x8c,0x48,0x00,0x18,0x3c,0x02,0x80,0x00,
+0x24,0x42,0x1c,0x28,0xac,0xe2,0x00,0x00,0x8d,0x03,0x00,0x08,0x80,0x82,0x00,0x13,
+0x00,0x05,0x2c,0x00,0x00,0x03,0x1e,0x02,0x00,0x02,0x12,0x00,0x30,0x63,0x00,0x7e,
+0x00,0x62,0x18,0x21,0x00,0x65,0x18,0x21,0x3c,0x02,0xc0,0x00,0x3c,0x05,0xb0,0x05,
+0x34,0x42,0x04,0x00,0x24,0x63,0x00,0x01,0x3c,0x07,0xb0,0x05,0x3c,0x08,0xb0,0x05,
+0x34,0xa5,0x04,0x20,0xac,0xa3,0x00,0x00,0x00,0xc2,0x30,0x21,0x34,0xe7,0x04,0x24,
+0x35,0x08,0x02,0x28,0x24,0x02,0x00,0x01,0x24,0x03,0x00,0x20,0xac,0xe6,0x00,0x00,
+0xac,0x82,0x00,0x3c,0x03,0xe0,0x00,0x08,0xa1,0x03,0x00,0x00,0x27,0xbd,0xff,0xa8,
+0x00,0x07,0x60,0x80,0x27,0x82,0xb4,0x00,0xaf,0xbe,0x00,0x50,0xaf,0xb7,0x00,0x4c,
+0xaf,0xb5,0x00,0x44,0xaf,0xb4,0x00,0x40,0xaf,0xbf,0x00,0x54,0xaf,0xb6,0x00,0x48,
+0xaf,0xb3,0x00,0x3c,0xaf,0xb2,0x00,0x38,0xaf,0xb1,0x00,0x34,0xaf,0xb0,0x00,0x30,
+0x01,0x82,0x10,0x21,0x8c,0x43,0x00,0x00,0x00,0xe0,0x70,0x21,0x3c,0x02,0x80,0x00,
+0x94,0x73,0x00,0x14,0x3c,0x07,0xb0,0x03,0x34,0xe7,0x00,0x20,0x24,0x42,0x1c,0xbc,
+0x3c,0x03,0xb0,0x05,0xac,0xe2,0x00,0x00,0x34,0x63,0x01,0x28,0x90,0x67,0x00,0x00,
+0x00,0x13,0xa8,0xc0,0x02,0xb3,0x18,0x21,0x27,0x82,0x90,0x04,0x00,0x03,0x18,0x80,
+0x00,0x62,0x18,0x21,0x00,0x05,0x2c,0x00,0x00,0x07,0x3e,0x00,0x28,0xc2,0x00,0x03,
+0x00,0xc0,0xa0,0x21,0x00,0x80,0x78,0x21,0x00,0x05,0xbc,0x03,0x8c,0x68,0x00,0x18,
+0x02,0xa0,0x58,0x21,0x10,0x40,0x01,0x81,0x00,0x07,0xf6,0x03,0x00,0xde,0x10,0x07,
+0x30,0x5e,0x00,0x01,0x01,0x73,0x10,0x21,0x27,0x83,0x90,0x08,0x00,0x02,0x10,0x80,
+0x00,0x43,0x10,0x21,0x80,0x4d,0x00,0x06,0x8d,0x03,0x00,0x00,0x8d,0x02,0x00,0x04,
+0x8d,0x0a,0x00,0x08,0x8d,0x03,0x00,0x0c,0xaf,0xa2,0x00,0x20,0x11,0xa0,0x01,0x71,
+0xaf,0xa3,0x00,0x18,0x27,0x82,0xb4,0x00,0x01,0x82,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x04,
+0x14,0x60,0x00,0x12,0x00,0x00,0xb0,0x21,0x3c,0x02,0xb0,0x09,0x34,0x42,0x01,0x46,
+0x90,0x43,0x00,0x00,0x2a,0x84,0x00,0x04,0x10,0x80,0x01,0x56,0x30,0x65,0x00,0x01,
+0x91,0xe2,0x00,0x09,0x00,0x00,0x00,0x00,0x12,0x82,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x00,0x28,0x21,0x14,0xa0,0x00,0x03,0x00,0x00,0x38,0x21,0x13,0xc0,0x00,0x03,
+0x38,0xf6,0x00,0x01,0x24,0x07,0x00,0x01,0x38,0xf6,0x00,0x01,0x01,0x73,0x10,0x21,
+0x00,0x02,0x30,0x80,0x27,0x83,0x90,0x10,0x00,0xc3,0x48,0x21,0x91,0x25,0x00,0x00,
+0x8f,0xa4,0x00,0x20,0x2c,0xa3,0x00,0x04,0x00,0x04,0x11,0xc3,0x30,0x42,0x00,0x01,
+0x00,0x03,0xb0,0x0b,0x12,0xc0,0x00,0xd8,0xaf,0xa2,0x00,0x24,0x93,0x90,0xbb,0xea,
+0x00,0x0a,0x16,0x42,0x30,0x52,0x00,0x3f,0x2e,0x06,0x00,0x0c,0x10,0xc0,0x00,0xc0,
+0x00,0xa0,0x20,0x21,0x2c,0xa2,0x00,0x10,0x14,0x40,0x00,0x04,0x00,0x90,0x10,0x2b,
+0x30,0xa2,0x00,0x07,0x24,0x44,0x00,0x04,0x00,0x90,0x10,0x2b,0x10,0x40,0x00,0x0b,
+0x01,0x73,0x10,0x21,0x27,0x85,0xbb,0x1c,0x00,0x10,0x10,0x40,0x00,0x50,0x10,0x21,
+0x00,0x45,0x10,0x21,0x90,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x18,0x2b,
+0x14,0x60,0xff,0xfa,0x00,0x10,0x10,0x40,0x01,0x73,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x83,0x90,0x08,0x00,0x43,0x10,0x21,0x31,0xa4,0x00,0x01,0x10,0x80,0x00,0xa5,
+0xa0,0x50,0x00,0x07,0x3c,0x04,0xb0,0x05,0x34,0x84,0x00,0x08,0x24,0x02,0x00,0x01,
+0x3c,0x03,0x80,0x00,0xa1,0xe2,0x00,0x4e,0xac,0x83,0x00,0x00,0x8c,0x85,0x00,0x00,
+0x3c,0x02,0x00,0xf0,0x3c,0x03,0x40,0xf0,0x34,0x42,0xf0,0x00,0x34,0x63,0xf0,0x00,
+0x24,0x17,0x00,0x0e,0x24,0x13,0x01,0x06,0xac,0x82,0x00,0x00,0xac,0x83,0x00,0x00,
+0x27,0x82,0xb4,0x00,0x01,0x82,0x10,0x21,0x8c,0x43,0x00,0x00,0x24,0x05,0x00,0x01,
+0xaf,0xa5,0x00,0x1c,0x90,0x62,0x00,0x16,0x00,0x13,0xa8,0xc0,0x32,0x51,0x00,0x02,
+0x34,0x42,0x00,0x04,0xa0,0x62,0x00,0x16,0x8f,0xa3,0x00,0x20,0x8f,0xa4,0x00,0x18,
+0x00,0x03,0x13,0x43,0x00,0x04,0x1a,0x02,0x30,0x47,0x00,0x01,0x12,0x20,0x00,0x04,
+0x30,0x64,0x07,0xff,0x2e,0x03,0x00,0x04,0x32,0x42,0x00,0x33,0x00,0x43,0x90,0x0b,
+0x8f,0xa5,0x00,0x24,0x8f,0xa6,0x00,0x1c,0x00,0x12,0x10,0x40,0x00,0x05,0x19,0xc0,
+0x00,0x47,0x10,0x21,0x00,0x06,0x2a,0x80,0x00,0x43,0x10,0x21,0x00,0x10,0x32,0x00,
+0x00,0x04,0x24,0x80,0x02,0x65,0x28,0x21,0x00,0xa4,0x28,0x21,0x00,0x46,0x10,0x21,
+0x00,0x17,0x1c,0x00,0x3c,0x04,0xc0,0x00,0x00,0x43,0x30,0x21,0x16,0x80,0x00,0x29,
+0x00,0xa4,0x28,0x21,0x3c,0x02,0xb0,0x05,0x34,0x42,0x04,0x00,0x3c,0x03,0xb0,0x05,
+0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x04,0x34,0x84,0x02,0x28,
+0x24,0x02,0x00,0x01,0xac,0x65,0x00,0x00,0xa0,0x82,0x00,0x00,0x3c,0x02,0xb0,0x09,
+0x34,0x42,0x01,0x46,0x90,0x44,0x00,0x00,0x91,0xe3,0x00,0x09,0x30,0x86,0x00,0x01,
+0x02,0x83,0x18,0x26,0x00,0x03,0x30,0x0b,0x14,0xc0,0x00,0x03,0x00,0x00,0x28,0x21,
+0x13,0xc0,0x00,0x03,0x02,0xb3,0x10,0x21,0x24,0x05,0x00,0x01,0x02,0xb3,0x10,0x21,
+0x27,0x83,0x90,0x08,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x84,0x48,0x00,0x04,
+0x00,0xa0,0x30,0x21,0x00,0xe0,0x20,0x21,0x02,0x80,0x28,0x21,0x02,0xc0,0x38,0x21,
+0x0c,0x00,0x00,0x70,0xaf,0xa8,0x00,0x10,0x7b,0xbe,0x02,0xbc,0x7b,0xb6,0x02,0x7c,
+0x7b,0xb4,0x02,0x3c,0x7b,0xb2,0x01,0xfc,0x7b,0xb0,0x01,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x58,0x24,0x02,0x00,0x01,0x12,0x82,0x00,0x3d,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x02,0x12,0x82,0x00,0x31,0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x03,
+0x12,0x82,0x00,0x25,0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x10,0x12,0x82,0x00,0x19,
+0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x11,0x12,0x82,0x00,0x0d,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x12,0x16,0x82,0xff,0xd1,0x3c,0x02,0xb0,0x05,0x3c,0x03,0xb0,0x05,
+0x34,0x42,0x04,0x20,0x3c,0x04,0xb0,0x05,0x34,0x63,0x04,0x24,0xac,0x46,0x00,0x00,
+0x34,0x84,0x02,0x28,0xac,0x65,0x00,0x00,0x08,0x00,0x07,0xe6,0x24,0x02,0x00,0x20,
+0x34,0x42,0x04,0x40,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,
+0x34,0x63,0x04,0x44,0x34,0x84,0x02,0x28,0x24,0x02,0x00,0x40,0x08,0x00,0x07,0xe6,
+0xac,0x65,0x00,0x00,0x34,0x42,0x04,0x28,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,
+0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x2c,0x34,0x84,0x02,0x28,0x24,0x02,0xff,0x80,
+0x08,0x00,0x07,0xe6,0xac,0x65,0x00,0x00,0x34,0x42,0x04,0x18,0x3c,0x03,0xb0,0x05,
+0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x1c,0x34,0x84,0x02,0x28,
+0x24,0x02,0x00,0x08,0x08,0x00,0x07,0xe6,0xac,0x65,0x00,0x00,0x34,0x42,0x04,0x10,
+0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,0x34,0x63,0x04,0x14,
+0x34,0x84,0x02,0x28,0x24,0x02,0x00,0x04,0x08,0x00,0x07,0xe6,0xac,0x65,0x00,0x00,
+0x34,0x42,0x04,0x08,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0xac,0x46,0x00,0x00,
+0x34,0x63,0x04,0x0c,0x34,0x84,0x02,0x28,0x24,0x02,0x00,0x02,0x08,0x00,0x07,0xe6,
+0xac,0x65,0x00,0x00,0x24,0x17,0x00,0x14,0x08,0x00,0x07,0xb8,0x24,0x13,0x01,0x02,
+0x30,0xa2,0x00,0x07,0x24,0x44,0x00,0x0c,0x00,0x90,0x18,0x2b,0x10,0x60,0x00,0x0c,
+0x26,0x02,0x00,0x04,0x27,0x85,0xbb,0x1c,0x00,0x10,0x10,0x40,0x00,0x50,0x10,0x21,
+0x00,0x45,0x10,0x21,0x90,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0x18,0x2b,
+0x14,0x60,0xff,0xfa,0x00,0x10,0x10,0x40,0x2e,0x06,0x00,0x0c,0x26,0x02,0x00,0x04,
+0x08,0x00,0x07,0xa2,0x00,0x46,0x80,0x0a,0x27,0x82,0xb4,0x00,0x01,0x82,0x20,0x21,
+0x8c,0x87,0x00,0x00,0x00,0x00,0x00,0x00,0x90,0xe2,0x00,0x19,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x27,0x82,0x90,0x20,0x00,0xc2,0x10,0x21,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x60,0x00,0x14,0x00,0x00,0x00,0x00,
+0x90,0xe3,0x00,0x16,0x27,0x82,0x90,0x08,0x00,0xc2,0x10,0x21,0x34,0x63,0x00,0x20,
+0x90,0x50,0x00,0x07,0xa0,0xe3,0x00,0x16,0x8c,0x84,0x00,0x00,0x00,0x0a,0x1e,0x42,
+0x24,0x06,0x00,0x01,0x90,0x82,0x00,0x16,0x30,0x71,0x00,0x02,0x30,0x72,0x00,0x3f,
+0x30,0x42,0x00,0xfb,0x24,0x17,0x00,0x18,0x24,0x13,0x01,0x03,0x24,0x15,0x08,0x18,
+0xaf,0xa6,0x00,0x1c,0x08,0x00,0x07,0xc2,0xa0,0x82,0x00,0x16,0x8d,0x02,0x00,0x04,
+0x00,0x0a,0x1c,0x42,0x30,0x42,0x00,0x10,0x14,0x40,0x00,0x15,0x30,0x72,0x00,0x3f,
+0x81,0x22,0x00,0x05,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x11,0x30,0x72,0x00,0x3e,
+0x27,0x83,0x90,0x18,0x00,0xc3,0x18,0x21,0x80,0x64,0x00,0x00,0x27,0x83,0xb5,0x78,
+0x00,0x04,0x11,0x00,0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x05,0x90,0x43,0x00,0x04,
+0x00,0x00,0x00,0x00,0x00,0x64,0x18,0x24,0x30,0x63,0x00,0x01,0x02,0x43,0x90,0x25,
+0x27,0x85,0xb4,0x00,0x01,0x85,0x28,0x21,0x8c,0xa6,0x00,0x00,0x01,0x73,0x10,0x21,
+0x27,0x83,0x90,0x10,0x90,0xc4,0x00,0x16,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,
+0x30,0x84,0x00,0xdf,0x90,0x50,0x00,0x00,0xa0,0xc4,0x00,0x16,0x80,0xc6,0x00,0x12,
+0x8c,0xa3,0x00,0x00,0x2d,0xc4,0x00,0x02,0xaf,0xa6,0x00,0x1c,0x90,0x62,0x00,0x16,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfb,0x14,0x80,0x00,0x06,0xa0,0x62,0x00,0x16,
+0x24,0x02,0x00,0x06,0x11,0xc2,0x00,0x03,0x24,0x02,0x00,0x04,0x15,0xc2,0xff,0x0e,
+0x32,0x51,0x00,0x02,0x32,0x51,0x00,0x02,0x2e,0x02,0x00,0x0c,0x14,0x40,0x00,0x0f,
+0x00,0x11,0x18,0x2b,0x32,0x02,0x00,0x0f,0x34,0x42,0x00,0x10,0x00,0x03,0x19,0x00,
+0x00,0x43,0x18,0x21,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xe0,0xa0,0x43,0x00,0x00,
+0x00,0x00,0x20,0x21,0x02,0x00,0x28,0x21,0x0c,0x00,0x02,0x03,0xaf,0xaf,0x00,0x28,
+0x8f,0xaf,0x00,0x28,0x08,0x00,0x07,0xc2,0x00,0x00,0x00,0x00,0x08,0x00,0x08,0xbd,
+0x32,0x03,0x00,0xff,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x42,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x0f,0x14,0x40,0xfe,0xaa,0x00,0x00,0x00,0x00,
+0x91,0xe2,0x00,0x09,0x00,0x00,0x00,0x00,0x02,0x82,0x10,0x26,0x08,0x00,0x07,0x79,
+0x00,0x02,0x28,0x0b,0x08,0x00,0x07,0x7f,0x00,0x00,0xb0,0x21,0x24,0x02,0x00,0x10,
+0x10,0xc2,0x00,0x08,0x24,0x02,0x00,0x11,0x10,0xc2,0xfe,0x7d,0x00,0x07,0x17,0x83,
+0x24,0x02,0x00,0x12,0x14,0xc2,0xfe,0x7b,0x00,0x07,0x17,0x43,0x08,0x00,0x07,0x59,
+0x30,0x5e,0x00,0x01,0x08,0x00,0x07,0x59,0x00,0x07,0xf7,0xc2,0x00,0x04,0x10,0x40,
+0x27,0x83,0x80,0x1c,0x00,0x43,0x10,0x21,0x00,0x80,0x40,0x21,0x94,0x44,0x00,0x00,
+0x2d,0x07,0x00,0x04,0x24,0xc2,0x00,0x03,0x00,0x47,0x30,0x0a,0x00,0x86,0x00,0x18,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x23,0x8c,
+0xac,0x62,0x00,0x00,0x2d,0x06,0x00,0x10,0x00,0x00,0x20,0x12,0x00,0x04,0x22,0x42,
+0x24,0x84,0x00,0x01,0x24,0x83,0x00,0xc0,0x10,0xe0,0x00,0x0b,0x24,0x82,0x00,0x60,
+0x00,0x40,0x20,0x21,0x00,0x65,0x20,0x0a,0x3c,0x03,0xb0,0x03,0x34,0x63,0x01,0x00,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x00,0x44,0x20,0x04,
+0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x24,0x85,0x00,0x28,0x24,0x83,0x00,0x24,
+0x31,0x02,0x00,0x08,0x14,0xc0,0xff,0xf4,0x24,0x84,0x00,0x14,0x00,0x60,0x20,0x21,
+0x08,0x00,0x08,0xfa,0x00,0xa2,0x20,0x0b,0x27,0xbd,0xff,0xe0,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0xaf,0xb0,0x00,0x10,0x24,0x42,0x24,0x28,0x00,0x80,0x80,0x21,
+0x34,0x63,0x00,0x20,0x3c,0x04,0xb0,0x03,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,
+0xaf,0xbf,0x00,0x1c,0x83,0xb1,0x00,0x33,0x83,0xa8,0x00,0x37,0x34,0x84,0x01,0x10,
+0xac,0x62,0x00,0x00,0x2e,0x02,0x00,0x10,0x00,0xe0,0x90,0x21,0x8c,0x87,0x00,0x00,
+0x14,0x40,0x00,0x0c,0x2e,0x02,0x00,0x0c,0x3c,0x02,0x00,0x0f,0x34,0x42,0xf0,0x00,
+0x00,0xe2,0x10,0x24,0x14,0x40,0x00,0x37,0x32,0x02,0x00,0x08,0x32,0x02,0x00,0x07,
+0x27,0x83,0x80,0xcc,0x00,0x43,0x10,0x21,0x90,0x50,0x00,0x00,0x00,0x00,0x00,0x00,
+0x2e,0x02,0x00,0x0c,0x14,0x40,0x00,0x03,0x02,0x00,0x20,0x21,0x32,0x02,0x00,0x0f,
+0x24,0x44,0x00,0x0c,0x00,0x87,0x10,0x06,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x07,
+0x2c,0x82,0x00,0x0c,0x00,0x04,0x10,0x80,0x27,0x83,0xb4,0x50,0x00,0x43,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x82,0x00,0x0c,0x14,0x40,0x00,0x05,
+0x00,0x05,0x10,0x40,0x00,0x46,0x10,0x21,0x00,0x02,0x11,0x00,0x00,0x82,0x10,0x21,
+0x24,0x44,0x00,0x04,0x15,0x00,0x00,0x02,0x24,0x06,0x00,0x20,0x24,0x06,0x00,0x0e,
+0x0c,0x00,0x08,0xe3,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x21,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x01,0x00,0x90,0x43,0x00,0x00,0x2e,0x04,0x00,0x04,0x24,0x02,0x00,0x10,
+0x24,0x05,0x00,0x0a,0x00,0x44,0x28,0x0a,0x30,0x63,0x00,0x01,0x14,0x60,0x00,0x02,
+0x00,0x05,0x10,0x40,0x00,0xa0,0x10,0x21,0x30,0x45,0x00,0xff,0x00,0xc5,0x10,0x21,
+0x24,0x46,0x00,0x46,0x02,0x26,0x18,0x04,0xa6,0x43,0x00,0x00,0x8f,0xbf,0x00,0x1c,
+0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x00,0xc0,0x10,0x21,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x10,0x40,0xff,0xcf,0x2e,0x02,0x00,0x0c,0x32,0x02,0x00,0x07,
+0x27,0x83,0x80,0xc4,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x00,0x08,0x00,0x09,0x28,
+0x02,0x04,0x80,0x23,0x27,0xbd,0xff,0xb8,0x00,0x05,0x38,0x80,0x27,0x82,0xb4,0x00,
+0xaf,0xbe,0x00,0x40,0xaf,0xb6,0x00,0x38,0xaf,0xb3,0x00,0x2c,0xaf,0xbf,0x00,0x44,
+0xaf,0xb7,0x00,0x3c,0xaf,0xb5,0x00,0x34,0xaf,0xb4,0x00,0x30,0xaf,0xb2,0x00,0x28,
+0xaf,0xb1,0x00,0x24,0xaf,0xb0,0x00,0x20,0x00,0xe2,0x38,0x21,0x8c,0xe6,0x00,0x00,
+0xaf,0xa5,0x00,0x4c,0x3c,0x02,0x80,0x00,0x3c,0x05,0xb0,0x03,0x34,0xa5,0x00,0x20,
+0x24,0x42,0x25,0x84,0x24,0x03,0x00,0x01,0xac,0xa2,0x00,0x00,0xa0,0xc3,0x00,0x12,
+0x8c,0xe5,0x00,0x00,0x94,0xc3,0x00,0x06,0x90,0xa2,0x00,0x16,0xa4,0xc3,0x00,0x14,
+0x27,0x83,0x90,0x00,0x34,0x42,0x00,0x08,0xa0,0xa2,0x00,0x16,0x8c,0xe8,0x00,0x00,
+0xaf,0xa4,0x00,0x48,0x27,0x82,0x90,0x04,0x95,0x11,0x00,0x14,0x00,0x00,0x00,0x00,
+0x00,0x11,0x98,0xc0,0x02,0x71,0x20,0x21,0x00,0x04,0x20,0x80,0x00,0x82,0x10,0x21,
+0x8c,0x52,0x00,0x18,0x00,0x83,0x18,0x21,0x84,0x75,0x00,0x06,0x8e,0x45,0x00,0x08,
+0x8e,0x46,0x00,0x04,0x8e,0x47,0x00,0x04,0x00,0x05,0x1c,0x82,0x00,0x06,0x31,0x42,
+0x27,0x82,0x90,0x10,0x30,0x63,0x00,0x01,0x30,0xc6,0x00,0x01,0x00,0x82,0x20,0x21,
+0xa5,0x15,0x00,0x1a,0x00,0x05,0x14,0x42,0xaf,0xa3,0x00,0x18,0xaf,0xa6,0x00,0x1c,
+0x30,0xe7,0x00,0x10,0x30,0x56,0x00,0x01,0x80,0x97,0x00,0x06,0x14,0xe0,0x00,0x47,
+0x00,0x05,0xf7,0xc2,0x80,0x82,0x00,0x05,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x44,
+0x02,0x71,0x10,0x21,0x93,0x90,0xbb,0xe9,0x00,0x00,0x00,0x00,0x2e,0x02,0x00,0x0c,
+0x14,0x40,0x00,0x06,0x02,0x00,0x20,0x21,0x00,0x16,0x10,0x40,0x00,0x43,0x10,0x21,
+0x00,0x02,0x11,0x00,0x02,0x02,0x10,0x21,0x24,0x44,0x00,0x04,0x02,0x71,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,0x00,0x80,0x80,0x21,
+0xa0,0x44,0x00,0x03,0xa0,0x44,0x00,0x00,0x02,0x00,0x20,0x21,0x02,0xc0,0x28,0x21,
+0x0c,0x00,0x08,0xe3,0x02,0xa0,0x30,0x21,0x02,0x71,0x18,0x21,0x00,0x03,0x88,0x80,
+0x00,0x40,0xa0,0x21,0x27,0x82,0x90,0x20,0x02,0x22,0x10,0x21,0x8c,0x44,0x00,0x00,
+0x26,0xe3,0x00,0x02,0x00,0x03,0x17,0xc2,0x00,0x62,0x18,0x21,0x00,0x04,0x25,0xc2,
+0x00,0x03,0x18,0x43,0x30,0x84,0x00,0x01,0x00,0x03,0x18,0x40,0x03,0xc4,0x20,0x24,
+0x14,0x80,0x00,0x15,0x02,0x43,0x38,0x21,0x3c,0x08,0xb0,0x03,0x35,0x08,0x00,0x28,
+0x8d,0x03,0x00,0x00,0x8f,0xa6,0x00,0x4c,0x8f,0xa4,0x00,0x48,0x27,0x82,0x90,0x08,
+0x02,0x22,0x10,0x21,0x24,0x63,0x00,0x01,0x02,0xa0,0x28,0x21,0xa4,0x54,0x00,0x04,
+0x00,0xc0,0x38,0x21,0x0c,0x00,0x07,0x2f,0xad,0x03,0x00,0x00,0x7b,0xbe,0x02,0x3c,
+0x7b,0xb6,0x01,0xfc,0x7b,0xb4,0x01,0xbc,0x7b,0xb2,0x01,0x7c,0x7b,0xb0,0x01,0x3c,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x48,0x8f,0xa2,0x00,0x1c,0x8f,0xa6,0x00,0x18,
+0x02,0x00,0x20,0x21,0x02,0xc0,0x28,0x21,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x09,0x0a,
+0xaf,0xa0,0x00,0x14,0x08,0x00,0x09,0xc6,0x02,0x82,0xa0,0x21,0x02,0x71,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,0x90,0x50,0x00,0x00,
+0x08,0x00,0x09,0xb2,0xa0,0x50,0x00,0x03,0x27,0xbd,0xff,0xb8,0xaf,0xb1,0x00,0x24,
+0x8f,0xb1,0x00,0x5c,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,
+0x24,0x42,0x27,0xa8,0xaf,0xbe,0x00,0x40,0xaf,0xb7,0x00,0x3c,0xaf,0xb6,0x00,0x38,
+0xaf,0xb5,0x00,0x34,0xaf,0xb4,0x00,0x30,0xaf,0xa5,0x00,0x4c,0x8f,0xb5,0x00,0x58,
+0xaf,0xbf,0x00,0x44,0xaf,0xb3,0x00,0x2c,0xaf,0xb2,0x00,0x28,0xaf,0xb0,0x00,0x20,
+0x00,0xe0,0xb0,0x21,0xac,0x62,0x00,0x00,0x00,0x80,0xf0,0x21,0x00,0x00,0xb8,0x21,
+0x16,0x20,0x00,0x2b,0x00,0x00,0xa0,0x21,0x27,0x85,0xb4,0x00,0x00,0x07,0x10,0x80,
+0x00,0x45,0x10,0x21,0x8c,0x53,0x00,0x00,0x00,0x15,0x18,0x80,0x00,0x65,0x18,0x21,
+0x92,0x62,0x00,0x16,0x8c,0x72,0x00,0x00,0x30,0x42,0x00,0x03,0x14,0x40,0x00,0x2d,
+0x00,0x00,0x00,0x00,0x92,0x42,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x03,
+0x14,0x40,0x00,0x28,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x34,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x18,0x02,0x20,0x10,0x21,0x8c,0x82,0x00,0x38,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x14,0x02,0x20,0x10,0x21,0x8c,0x82,0x00,0x3c,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x0f,0x3c,0x03,0xb0,0x09,0x3c,0x05,0xb0,0x05,0x34,0x63,0x01,0x44,
+0x34,0xa5,0x02,0x52,0x94,0x66,0x00,0x00,0x90,0xa2,0x00,0x00,0x8f,0xa3,0x00,0x4c,
+0x00,0x00,0x00,0x00,0x00,0x62,0x10,0x06,0x30,0x42,0x00,0x01,0x10,0x40,0x00,0x04,
+0x30,0xc6,0xff,0xff,0x2c,0xc2,0x00,0x41,0x10,0x40,0x00,0x09,0x24,0x05,0x00,0x14,
+0x02,0x20,0x10,0x21,0x7b,0xbe,0x02,0x3c,0x7b,0xb6,0x01,0xfc,0x7b,0xb4,0x01,0xbc,
+0x7b,0xb2,0x01,0x7c,0x7b,0xb0,0x01,0x3c,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x48,
+0x0c,0x00,0x07,0x0a,0x24,0x06,0x01,0x07,0x24,0x02,0x00,0x01,0x08,0x00,0x0a,0x2c,
+0xa3,0xc2,0x00,0x11,0x10,0xc0,0x00,0x1c,0x24,0x02,0x00,0x01,0x10,0xc2,0x00,0x17,
+0x00,0xc0,0x88,0x21,0x96,0x54,0x00,0x1a,0x02,0xa0,0xb8,0x21,0x12,0x20,0xff,0xed,
+0x02,0x20,0x10,0x21,0x27,0x83,0xb4,0x00,0x00,0x17,0x10,0x80,0x00,0x43,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x28,0x80,0x86,0x00,0x12,
+0x8c,0x62,0x00,0x00,0x00,0x14,0x2c,0x00,0x00,0x05,0x2c,0x03,0x00,0x46,0x10,0x21,
+0x8f,0xa6,0x00,0x4c,0x02,0xe0,0x38,0x21,0x03,0xc0,0x20,0x21,0x0c,0x00,0x07,0x2f,
+0xac,0x62,0x00,0x00,0x08,0x00,0x0a,0x2c,0xaf,0xd1,0x00,0x40,0x96,0x74,0x00,0x1a,
+0x08,0x00,0x0a,0x3f,0x02,0xc0,0xb8,0x21,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x08,
+0x8c,0x50,0x00,0x00,0x02,0x60,0x20,0x21,0x0c,0x00,0x1e,0xf3,0x02,0x00,0x28,0x21,
+0x30,0x42,0x00,0xff,0x02,0x00,0x28,0x21,0x02,0x40,0x20,0x21,0x0c,0x00,0x1e,0xf3,
+0xaf,0xa2,0x00,0x18,0x8f,0xa4,0x00,0x18,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0xed,
+0x30,0x50,0x00,0xff,0x12,0x00,0x00,0x18,0x24,0x11,0x00,0x01,0x96,0x63,0x00,0x14,
+0x96,0x44,0x00,0x14,0x27,0x85,0x90,0x00,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,0x00,0x04,0x18,0xc0,0x8c,0x46,0x00,0x08,
+0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x65,0x18,0x21,0x00,0x06,0x17,0x02,
+0x24,0x04,0x00,0xff,0x8c,0x63,0x00,0x08,0x10,0x44,0x00,0xd6,0x00,0x03,0x17,0x02,
+0x10,0x44,0x00,0xd5,0x3c,0x02,0x80,0x00,0x00,0x66,0x18,0x2b,0x24,0x11,0x00,0x02,
+0x24,0x02,0x00,0x01,0x00,0x43,0x88,0x0a,0x24,0x02,0x00,0x01,0x12,0x22,0x00,0x5a,
+0x24,0x02,0x00,0x02,0x16,0x22,0xff,0xbd,0x00,0x00,0x00,0x00,0x96,0x49,0x00,0x14,
+0x27,0x82,0x90,0x04,0x02,0xa0,0xb8,0x21,0x00,0x09,0x50,0xc0,0x01,0x49,0x18,0x21,
+0x00,0x03,0x40,0x80,0x01,0x02,0x10,0x21,0x8c,0x43,0x00,0x18,0x00,0x00,0x00,0x00,
+0x8c,0x65,0x00,0x08,0x8c,0x62,0x00,0x0c,0x8c,0x62,0x00,0x04,0x00,0x05,0x24,0x42,
+0x00,0x05,0x1c,0x82,0x30,0x42,0x00,0x10,0x30,0x66,0x00,0x01,0x14,0x40,0x00,0x41,
+0x30,0x87,0x00,0x01,0x27,0x82,0x90,0x18,0x01,0x02,0x10,0x21,0x80,0x44,0x00,0x00,
+0x27,0x82,0xb5,0x78,0x00,0x04,0x19,0x00,0x00,0x64,0x18,0x23,0x00,0x03,0x18,0x80,
+0x00,0x64,0x18,0x23,0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,0x90,0x45,0x00,0x05,
+0x27,0x84,0xb4,0xa0,0x00,0x64,0x18,0x21,0x90,0x63,0x00,0x00,0x10,0xa0,0x00,0x2b,
+0x2c,0x64,0x00,0x0c,0x14,0x80,0x00,0x04,0x00,0x60,0x10,0x21,0x00,0x06,0x11,0x00,
+0x00,0x62,0x10,0x21,0x24,0x42,0x00,0x24,0x3c,0x01,0xb0,0x03,0xa0,0x22,0x00,0xe1,
+0x14,0x80,0x00,0x06,0x00,0x60,0x28,0x21,0x00,0x07,0x10,0x40,0x00,0x46,0x10,0x21,
+0x00,0x02,0x11,0x00,0x00,0x62,0x10,0x21,0x24,0x45,0x00,0x04,0x01,0x49,0x10,0x21,
+0x27,0x83,0x90,0x10,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x00,0xa0,0x18,0x21,
+0xa0,0x45,0x00,0x03,0xa0,0x45,0x00,0x00,0x24,0x02,0x00,0x08,0x12,0x02,0x00,0x0b,
+0x24,0x02,0x00,0x01,0x00,0x60,0x28,0x21,0x02,0x40,0x20,0x21,0x0c,0x00,0x1f,0x6f,
+0xaf,0xa2,0x00,0x10,0x30,0x54,0xff,0xff,0x92,0x42,0x00,0x16,0x00,0x00,0x00,0x00,
+0x02,0x02,0x10,0x25,0x08,0x00,0x0a,0x3f,0xa2,0x42,0x00,0x16,0x00,0x60,0x28,0x21,
+0x02,0x40,0x20,0x21,0x0c,0x00,0x1f,0x20,0xaf,0xa0,0x00,0x10,0x08,0x00,0x0a,0xc2,
+0x30,0x54,0xff,0xff,0x08,0x00,0x0a,0xaa,0x00,0x60,0x10,0x21,0x14,0x80,0xff,0xfd,
+0x00,0x00,0x00,0x00,0x00,0x06,0x11,0x00,0x00,0x62,0x10,0x21,0x08,0x00,0x0a,0xaa,
+0x24,0x42,0x00,0x04,0x27,0x82,0x90,0x10,0x01,0x02,0x10,0x21,0x90,0x43,0x00,0x00,
+0x08,0x00,0x0a,0xba,0xa0,0x43,0x00,0x03,0x96,0x69,0x00,0x14,0x02,0xc0,0xb8,0x21,
+0x24,0x0b,0x00,0x01,0x00,0x09,0x10,0xc0,0x00,0x49,0x18,0x21,0x00,0x03,0x40,0x80,
+0x00,0x40,0x50,0x21,0x27,0x82,0x90,0x04,0x01,0x02,0x10,0x21,0x8c,0x43,0x00,0x18,
+0x00,0x00,0x00,0x00,0x8c,0x65,0x00,0x08,0x8c,0x62,0x00,0x0c,0x8c,0x62,0x00,0x04,
+0x00,0x05,0x24,0x42,0x00,0x05,0x1c,0x82,0x30,0x42,0x00,0x10,0x30,0x66,0x00,0x01,
+0x10,0x40,0x00,0x0d,0x30,0x87,0x00,0x01,0x27,0x82,0x90,0x18,0x01,0x02,0x10,0x21,
+0x80,0x43,0x00,0x00,0x00,0x00,0x58,0x21,0x00,0x03,0x11,0x00,0x00,0x43,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x23,0x00,0x02,0x10,0x80,0x27,0x83,0xb5,0x70,
+0x00,0x43,0x10,0x21,0xa0,0x40,0x00,0x04,0x11,0x60,0x00,0x4f,0x00,0x00,0x00,0x00,
+0x01,0x49,0x10,0x21,0x00,0x02,0x20,0x80,0x27,0x85,0x90,0x10,0x00,0x85,0x10,0x21,
+0x80,0x43,0x00,0x05,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x42,0x01,0x49,0x10,0x21,
+0x27,0x82,0x90,0x18,0x00,0x82,0x10,0x21,0x80,0x44,0x00,0x00,0x27,0x82,0xb5,0x78,
+0x00,0x04,0x19,0x00,0x00,0x64,0x18,0x23,0x00,0x03,0x18,0x80,0x00,0x64,0x18,0x23,
+0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,0x90,0x45,0x00,0x05,0x27,0x84,0xb4,0xa0,
+0x00,0x64,0x18,0x21,0x90,0x63,0x00,0x00,0x10,0xa0,0x00,0x2c,0x2c,0x64,0x00,0x0c,
+0x14,0x80,0x00,0x04,0x00,0x60,0x10,0x21,0x00,0x06,0x11,0x00,0x00,0x62,0x10,0x21,
+0x24,0x42,0x00,0x24,0x3c,0x01,0xb0,0x03,0xa0,0x22,0x00,0xe1,0x14,0x80,0x00,0x06,
+0x00,0x60,0x28,0x21,0x00,0x07,0x10,0x40,0x00,0x46,0x10,0x21,0x00,0x02,0x11,0x00,
+0x00,0x62,0x10,0x21,0x24,0x45,0x00,0x04,0x01,0x49,0x10,0x21,0x27,0x83,0x90,0x10,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x00,0xa0,0x18,0x21,0xa0,0x45,0x00,0x03,
+0xa0,0x45,0x00,0x00,0x8f,0xa4,0x00,0x18,0x24,0x02,0x00,0x08,0x10,0x82,0x00,0x0c,
+0x00,0x60,0x28,0x21,0x24,0x02,0x00,0x01,0x02,0x60,0x20,0x21,0x0c,0x00,0x1f,0x6f,
+0xaf,0xa2,0x00,0x10,0x8f,0xa3,0x00,0x18,0x30,0x54,0xff,0xff,0x92,0x62,0x00,0x16,
+0x00,0x00,0x00,0x00,0x00,0x62,0x10,0x25,0x08,0x00,0x0a,0x3f,0xa2,0x62,0x00,0x16,
+0x02,0x60,0x20,0x21,0x0c,0x00,0x1f,0x20,0xaf,0xa0,0x00,0x10,0x08,0x00,0x0b,0x31,
+0x00,0x00,0x00,0x00,0x08,0x00,0x0b,0x19,0x00,0x60,0x10,0x21,0x14,0x80,0xff,0xfd,
+0x00,0x00,0x00,0x00,0x00,0x06,0x11,0x00,0x00,0x62,0x10,0x21,0x08,0x00,0x0b,0x19,
+0x24,0x42,0x00,0x04,0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,0x90,0x43,0x00,0x00,
+0x08,0x00,0x0b,0x29,0xa0,0x43,0x00,0x03,0x27,0x85,0x90,0x10,0x08,0x00,0x0b,0x45,
+0x01,0x49,0x10,0x21,0x3c,0x02,0x80,0x00,0x00,0x62,0x18,0x26,0x08,0x00,0x0a,0x7a,
+0x00,0xc2,0x30,0x26,0x12,0x00,0xff,0x2d,0x24,0x02,0x00,0x01,0x08,0x00,0x0a,0x7f,
+0x24,0x11,0x00,0x02,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xd0,
+0x24,0x42,0x2d,0x54,0x34,0x63,0x00,0x20,0x3c,0x05,0xb0,0x05,0xaf,0xb3,0x00,0x24,
+0xaf,0xb2,0x00,0x20,0xaf,0xb1,0x00,0x1c,0xaf,0xbf,0x00,0x28,0xaf,0xb0,0x00,0x18,
+0xac,0x62,0x00,0x00,0x34,0xa5,0x02,0x42,0x90,0xa2,0x00,0x00,0x00,0x80,0x90,0x21,
+0x24,0x11,0x00,0x10,0x30,0x53,0x00,0xff,0x24,0x02,0x00,0x10,0x12,0x22,0x00,0xcf,
+0x00,0x00,0x18,0x21,0x24,0x02,0x00,0x11,0x12,0x22,0x00,0xc1,0x24,0x02,0x00,0x12,
+0x12,0x22,0x00,0xb4,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0xad,0xae,0x43,0x00,0x40,
+0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2c,0x8c,0x44,0x00,0x00,0x3c,0x03,0x00,0x02,
+0x34,0x63,0x00,0xff,0x00,0x83,0x80,0x24,0x00,0x10,0x14,0x43,0x10,0x40,0x00,0x05,
+0x00,0x00,0x00,0x00,0x8e,0x42,0x00,0x34,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x92,
+0x00,0x00,0x00,0x00,0x93,0x83,0x8b,0x71,0x00,0x00,0x00,0x00,0x30,0x62,0x00,0x02,
+0x10,0x40,0x00,0x04,0x32,0x10,0x00,0xff,0x00,0x10,0x11,0xc3,0x14,0x40,0x00,0x86,
+0x00,0x00,0x00,0x00,0x16,0x00,0x00,0x15,0x02,0x00,0x10,0x21,0x26,0x22,0x00,0x01,
+0x30,0x51,0x00,0xff,0x2e,0x23,0x00,0x13,0x14,0x60,0xff,0xdb,0x24,0x03,0x00,0x02,
+0x12,0x63,0x00,0x73,0x24,0x02,0x00,0x05,0x2a,0x62,0x00,0x03,0x10,0x40,0x00,0x58,
+0x24,0x02,0x00,0x04,0x24,0x02,0x00,0x01,0x12,0x62,0x00,0x4b,0x02,0x40,0x20,0x21,
+0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2c,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x70,0x00,0xff,0x12,0x00,0x00,0x06,0x02,0x00,0x10,0x21,0x8f,0xbf,0x00,0x28,
+0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,
+0x92,0x46,0x00,0x04,0x8e,0x43,0x00,0x24,0x24,0x02,0x00,0x07,0x02,0x40,0x20,0x21,
+0x00,0x00,0x28,0x21,0x24,0x07,0x00,0x06,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x09,0xea,
+0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x24,0x3c,0x02,0xb0,0x05,0x8c,0x42,0x02,0x2c,
+0x00,0x00,0x00,0x00,0x30,0x50,0x00,0xff,0x16,0x00,0xff,0xec,0x02,0x00,0x10,0x21,
+0x92,0x46,0x00,0x05,0x8e,0x43,0x00,0x28,0x24,0x02,0x00,0x05,0x02,0x40,0x20,0x21,
+0x24,0x05,0x00,0x01,0x24,0x07,0x00,0x04,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x09,0xea,
+0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x28,0x3c,0x02,0xb0,0x05,0x8c,0x42,0x02,0x2c,
+0x00,0x00,0x00,0x00,0x30,0x50,0x00,0xff,0x16,0x00,0xff,0xdc,0x02,0x00,0x10,0x21,
+0x92,0x46,0x00,0x06,0x8e,0x43,0x00,0x2c,0x24,0x02,0x00,0x03,0x02,0x40,0x20,0x21,
+0x24,0x05,0x00,0x02,0x00,0x00,0x38,0x21,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x09,0xea,
+0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x2c,0x3c,0x02,0xb0,0x05,0x8c,0x42,0x02,0x2c,
+0x00,0x00,0x00,0x00,0x30,0x50,0x00,0xff,0x16,0x00,0xff,0xcc,0x02,0x00,0x10,0x21,
+0x92,0x46,0x00,0x07,0x8e,0x43,0x00,0x30,0x24,0x02,0x00,0x02,0x02,0x40,0x20,0x21,
+0x24,0x05,0x00,0x03,0x24,0x07,0x00,0x01,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x09,0xea,
+0xaf,0xa3,0x00,0x14,0xae,0x42,0x00,0x30,0x3c,0x02,0xb0,0x05,0x8c,0x42,0x02,0x2c,
+0x08,0x00,0x0b,0x9b,0x30,0x42,0x00,0xff,0x92,0x46,0x00,0x04,0x8e,0x43,0x00,0x24,
+0x24,0x02,0x00,0x07,0x00,0x00,0x28,0x21,0x24,0x07,0x00,0x06,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x09,0xea,0xaf,0xa3,0x00,0x14,0x08,0x00,0x0b,0x94,0xae,0x42,0x00,0x24,
+0x12,0x62,0x00,0x0d,0x24,0x02,0x00,0x03,0x24,0x02,0x00,0x08,0x16,0x62,0xff,0xa8,
+0x02,0x40,0x20,0x21,0x92,0x46,0x00,0x07,0x8e,0x42,0x00,0x30,0x24,0x05,0x00,0x03,
+0x24,0x07,0x00,0x01,0xaf,0xa3,0x00,0x10,0x0c,0x00,0x09,0xea,0xaf,0xa2,0x00,0x14,
+0x08,0x00,0x0b,0x94,0xae,0x42,0x00,0x30,0x92,0x46,0x00,0x06,0x8e,0x43,0x00,0x2c,
+0x02,0x40,0x20,0x21,0x24,0x05,0x00,0x02,0x00,0x00,0x38,0x21,0xaf,0xa2,0x00,0x10,
+0x0c,0x00,0x09,0xea,0xaf,0xa3,0x00,0x14,0x08,0x00,0x0b,0x94,0xae,0x42,0x00,0x2c,
+0x92,0x46,0x00,0x05,0x8e,0x43,0x00,0x28,0x02,0x40,0x20,0x21,0x24,0x05,0x00,0x01,
+0x24,0x07,0x00,0x04,0xaf,0xa2,0x00,0x10,0x0c,0x00,0x09,0xea,0xaf,0xa3,0x00,0x14,
+0x08,0x00,0x0b,0x94,0xae,0x42,0x00,0x28,0x0c,0x00,0x01,0x57,0x24,0x04,0x00,0x01,
+0x08,0x00,0x0b,0x85,0x00,0x00,0x00,0x00,0x8f,0x84,0xb4,0x40,0xae,0x40,0x00,0x34,
+0x94,0x85,0x00,0x14,0x0c,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,0x93,0x83,0x8b,0x71,
+0x00,0x00,0x00,0x00,0x30,0x62,0x00,0x02,0x10,0x40,0xff,0x69,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x01,0x57,0x00,0x00,0x20,0x21,0x08,0x00,0x0b,0x7d,0x00,0x00,0x00,0x00,
+0x02,0x40,0x20,0x21,0x0c,0x00,0x09,0x61,0x02,0x20,0x28,0x21,0x08,0x00,0x0b,0x71,
+0x3c,0x02,0xb0,0x05,0x8e,0x42,0x00,0x3c,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x4a,
+0x00,0x00,0x00,0x00,0x8f,0x82,0xb4,0x48,0x00,0x00,0x00,0x00,0x90,0x42,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x00,0x02,0x18,0x2b,0x08,0x00,0x0b,0x6e,0xae,0x43,0x00,0x3c,
+0x8e,0x42,0x00,0x38,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x3d,0x24,0x02,0x00,0x12,
+0x8f,0x82,0xb4,0x44,0x00,0x00,0x00,0x00,0x90,0x42,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x00,0x02,0x18,0x2b,0x08,0x00,0x0b,0x6e,0xae,0x43,0x00,0x38,0x8e,0x42,0x00,0x34,
+0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x30,0x24,0x02,0x00,0x11,0x8f,0x82,0xb4,0x40,
+0x00,0x00,0x00,0x00,0x90,0x42,0x00,0x0a,0x00,0x00,0x00,0x00,0x00,0x02,0x18,0x2b,
+0x08,0x00,0x0b,0x6e,0xae,0x43,0x00,0x34,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x27,0xbd,0xff,0xe0,0x34,0x63,0x00,0x20,0x24,0x42,0x31,0x08,0x3c,0x08,0xb0,0x03,
+0xaf,0xb1,0x00,0x14,0xac,0x62,0x00,0x00,0x35,0x08,0x01,0x00,0xaf,0xbf,0x00,0x18,
+0xaf,0xb0,0x00,0x10,0x91,0x03,0x00,0x00,0x00,0xa0,0x48,0x21,0x24,0x11,0x00,0x0a,
+0x2c,0xa5,0x00,0x04,0x24,0x02,0x00,0x10,0x00,0x45,0x88,0x0a,0x30,0x63,0x00,0x01,
+0x00,0xc0,0x28,0x21,0x14,0x60,0x00,0x02,0x00,0x11,0x40,0x40,0x02,0x20,0x40,0x21,
+0x84,0x83,0x00,0x0c,0x31,0x11,0x00,0xff,0x01,0x20,0x20,0x21,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x08,0x00,0x43,0x10,0x21,
+0x84,0x43,0x00,0x04,0x24,0x06,0x00,0x0e,0x10,0xe0,0x00,0x06,0x02,0x23,0x80,0x21,
+0x02,0x00,0x10,0x21,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x0c,0x00,0x08,0xe3,0x00,0x00,0x00,0x00,0x02,0x11,0x18,0x21,
+0x08,0x00,0x0c,0x64,0x00,0x62,0x80,0x21,0x27,0xbd,0xff,0xd0,0xaf,0xbf,0x00,0x28,
+0xaf,0xb4,0x00,0x20,0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,0xaf,0xb5,0x00,0x24,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x84,0x82,0x00,0x0c,0x3c,0x06,0xb0,0x03,
+0x34,0xc6,0x00,0x20,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x80,
+0x27,0x82,0x90,0x04,0x00,0x62,0x10,0x21,0x8c,0x55,0x00,0x18,0x3c,0x02,0x80,0x00,
+0x24,0x42,0x31,0xb8,0xac,0xc2,0x00,0x00,0x8e,0xb0,0x00,0x08,0x27,0x82,0x90,0x08,
+0x00,0x62,0x18,0x21,0x90,0x71,0x00,0x07,0x00,0x10,0x86,0x43,0x32,0x10,0x00,0x01,
+0x00,0xa0,0x38,0x21,0x02,0x00,0x30,0x21,0x00,0xa0,0x98,0x21,0x02,0x20,0x28,0x21,
+0x0c,0x00,0x0c,0x42,0x00,0x80,0x90,0x21,0x02,0x20,0x20,0x21,0x02,0x00,0x28,0x21,
+0x24,0x06,0x00,0x14,0x0c,0x00,0x08,0xe3,0x00,0x40,0xa0,0x21,0x86,0x43,0x00,0x0c,
+0x3c,0x09,0xb0,0x09,0x3c,0x08,0xb0,0x09,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,0x80,0x43,0x00,0x06,
+0x3c,0x07,0xb0,0x09,0x3c,0x05,0xb0,0x09,0x28,0x62,0x00,0x00,0x24,0x64,0x00,0x03,
+0x00,0x82,0x18,0x0b,0x00,0x03,0x18,0x83,0x3c,0x02,0xb0,0x09,0x00,0x03,0x18,0x80,
+0x34,0x42,0x01,0x02,0x35,0x29,0x01,0x10,0x35,0x08,0x01,0x14,0x34,0xe7,0x01,0x20,
+0x34,0xa5,0x01,0x24,0xa4,0x54,0x00,0x00,0x12,0x60,0x00,0x11,0x02,0xa3,0xa8,0x21,
+0x8e,0xa2,0x00,0x0c,0x8e,0xa3,0x00,0x08,0x00,0x02,0x14,0x00,0x00,0x03,0x1c,0x02,
+0x00,0x43,0x10,0x21,0xad,0x22,0x00,0x00,0x8e,0xa3,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x1c,0x02,0xa5,0x03,0x00,0x00,0x8f,0xbf,0x00,0x28,0x7b,0xb4,0x01,0x3c,
+0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,
+0x8e,0xa2,0x00,0x04,0x00,0x00,0x00,0x00,0xad,0x22,0x00,0x00,0x8e,0xa4,0x00,0x08,
+0x00,0x00,0x00,0x00,0xa5,0x04,0x00,0x00,0x7a,0xa2,0x00,0x7c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x1c,0x00,0x00,0x02,0x14,0x02,0x00,0x62,0x18,0x21,0xac,0xe3,0x00,0x00,
+0x8e,0xa2,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x14,0x02,0x08,0x00,0x0c,0xb6,
+0xa4,0xa2,0x00,0x00,0x27,0xbd,0xff,0xe0,0xaf,0xb2,0x00,0x18,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x1c,0xaf,0xb1,0x00,0x14,0x84,0x82,0x00,0x0c,0x00,0x80,0x90,0x21,
+0x3c,0x05,0xb0,0x03,0x00,0x02,0x20,0xc0,0x00,0x82,0x20,0x21,0x00,0x04,0x20,0x80,
+0x27,0x82,0x90,0x04,0x00,0x82,0x10,0x21,0x8c,0x51,0x00,0x18,0x3c,0x02,0x80,0x00,
+0x34,0xa5,0x00,0x20,0x24,0x42,0x33,0x34,0x27,0x83,0x90,0x08,0xac,0xa2,0x00,0x00,
+0x00,0x83,0x20,0x21,0x3c,0x02,0xb0,0x03,0x90,0x86,0x00,0x07,0x34,0x42,0x01,0x00,
+0x8e,0x23,0x00,0x08,0x90,0x44,0x00,0x00,0x2c,0xc5,0x00,0x04,0x24,0x02,0x00,0x10,
+0x24,0x10,0x00,0x0a,0x00,0x45,0x80,0x0a,0x00,0x03,0x1e,0x43,0x30,0x84,0x00,0x01,
+0x30,0x65,0x00,0x01,0x14,0x80,0x00,0x02,0x00,0x10,0x10,0x40,0x02,0x00,0x10,0x21,
+0x00,0xc0,0x20,0x21,0x24,0x06,0x00,0x20,0x0c,0x00,0x08,0xe3,0x30,0x50,0x00,0xff,
+0x86,0x44,0x00,0x0c,0x27,0x85,0x90,0x10,0x3c,0x06,0xb0,0x09,0x00,0x04,0x18,0xc0,
+0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x65,0x18,0x21,0x80,0x64,0x00,0x06,
+0x00,0x50,0x10,0x21,0x34,0xc6,0x01,0x02,0x24,0x85,0x00,0x03,0x28,0x83,0x00,0x00,
+0x00,0xa3,0x20,0x0b,0x00,0x04,0x20,0x83,0x00,0x04,0x20,0x80,0xa4,0xc2,0x00,0x00,
+0x02,0x24,0x20,0x21,0x8c,0x83,0x00,0x04,0x3c,0x02,0xb0,0x09,0x34,0x42,0x01,0x10,
+0xac,0x43,0x00,0x00,0x8c,0x86,0x00,0x08,0x3c,0x02,0xb0,0x09,0x34,0x42,0x01,0x14,
+0xa4,0x46,0x00,0x00,0x8c,0x85,0x00,0x0c,0x8c,0x82,0x00,0x08,0x3c,0x06,0xb0,0x09,
+0x00,0x05,0x2c,0x00,0x00,0x02,0x14,0x02,0x00,0xa2,0x28,0x21,0x34,0xc6,0x01,0x20,
+0xac,0xc5,0x00,0x00,0x8c,0x83,0x00,0x0c,0x3c,0x05,0xb0,0x09,0x34,0xa5,0x01,0x24,
+0x00,0x03,0x1c,0x02,0xa4,0xa3,0x00,0x00,0x92,0x42,0x00,0x0a,0x3c,0x03,0xb0,0x09,
+0x34,0x63,0x01,0x30,0x00,0x02,0x13,0x00,0x24,0x42,0x00,0x04,0x30,0x42,0xff,0xff,
+0xa4,0x62,0x00,0x00,0x86,0x44,0x00,0x0c,0x27,0x83,0x90,0x18,0x8f,0xbf,0x00,0x1c,
+0x00,0x04,0x10,0xc0,0x00,0x44,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,
+0x94,0x44,0x00,0x02,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x3c,0x05,0xb0,0x09,
+0x34,0xa5,0x01,0x32,0xa4,0xa4,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,
+0x27,0xbd,0xff,0xe0,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x00,0xaf,0xb0,0x00,0x10,
+0x34,0x42,0x00,0x20,0x00,0xa0,0x80,0x21,0x24,0x63,0x34,0xc0,0x00,0x05,0x2c,0x43,
+0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x18,0xac,0x43,0x00,0x00,0x10,0xa0,0x00,0x05,
+0x00,0x80,0x88,0x21,0x8c,0x82,0x00,0x34,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0xb6,
+0x00,0x00,0x00,0x00,0x32,0x10,0x00,0xff,0x12,0x00,0x00,0x4c,0x00,0x00,0x10,0x21,
+0x24,0x02,0x00,0x08,0x12,0x02,0x00,0xa3,0x2a,0x02,0x00,0x09,0x10,0x40,0x00,0x89,
+0x24,0x02,0x00,0x40,0x24,0x04,0x00,0x02,0x12,0x04,0x00,0x79,0x2a,0x02,0x00,0x03,
+0x10,0x40,0x00,0x69,0x24,0x02,0x00,0x04,0x24,0x02,0x00,0x01,0x12,0x02,0x00,0x5a,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x05,0x34,0x42,0x00,0x08,0x3c,0x03,0x80,0x00,
+0xa2,0x20,0x00,0x4e,0xac,0x43,0x00,0x00,0x82,0x24,0x00,0x11,0x92,0x27,0x00,0x11,
+0x10,0x80,0x00,0x4e,0x00,0x00,0x00,0x00,0x92,0x26,0x00,0x0a,0x24,0x02,0x00,0x12,
+0x10,0x46,0x00,0x09,0x30,0xc2,0x00,0xff,0x27,0x83,0xb4,0x00,0x00,0x02,0x10,0x80,
+0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x94,0x83,0x00,0x14,
+0x00,0x00,0x00,0x00,0xa6,0x23,0x00,0x0c,0x3c,0x02,0xb0,0x09,0x34,0x42,0x00,0x40,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x03,0xa2,0x23,0x00,0x10,
+0x14,0x60,0x00,0x2b,0x30,0x65,0x00,0x01,0x30,0xc2,0x00,0xff,0x27,0x83,0xb4,0x00,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x82,0x23,0x00,0x12,
+0x90,0x82,0x00,0x16,0x00,0x00,0x00,0x00,0x00,0x02,0x11,0x42,0x30,0x42,0x00,0x01,
+0x00,0x62,0x18,0x21,0x00,0x03,0x26,0x00,0x14,0x80,0x00,0x18,0xa2,0x23,0x00,0x12,
+0x00,0x07,0x16,0x00,0x14,0x40,0x00,0x11,0x24,0x02,0x00,0x01,0x96,0x23,0x00,0x0c,
+0x27,0x84,0x90,0x10,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x44,0x10,0x21,0x80,0x45,0x00,0x06,0x00,0x03,0x1a,0x00,0x3c,0x02,0xb0,0x00,
+0x00,0x65,0x18,0x21,0x00,0x62,0x18,0x21,0x90,0x64,0x00,0x00,0x90,0x62,0x00,0x04,
+0xa2,0x20,0x00,0x15,0xa3,0x80,0x8b,0xd4,0x24,0x02,0x00,0x01,0x8f,0xbf,0x00,0x18,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x0c,0x00,0x0c,0xcd,
+0x02,0x20,0x20,0x21,0x92,0x27,0x00,0x11,0x08,0x00,0x0d,0x7d,0x00,0x07,0x16,0x00,
+0x0c,0x00,0x0c,0x6e,0x02,0x20,0x20,0x21,0x86,0x23,0x00,0x0c,0x27,0x84,0x90,0x08,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x44,0x20,0x21,
+0x90,0x85,0x00,0x07,0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,0xa2,0x25,0x00,0x13,
+0x90,0x83,0x00,0x07,0x08,0x00,0x0d,0x95,0xa0,0x43,0x00,0x02,0x92,0x26,0x00,0x0a,
+0x08,0x00,0x0d,0x5e,0x30,0xc2,0x00,0xff,0x8e,0x22,0x00,0x24,0x00,0x00,0x00,0x00,
+0x10,0x50,0x00,0x07,0xa2,0x20,0x00,0x08,0x24,0x02,0x00,0x07,0xa2,0x22,0x00,0x0a,
+0x92,0x22,0x00,0x27,0xae,0x20,0x00,0x24,0x08,0x00,0x0d,0x51,0xa2,0x22,0x00,0x04,
+0x08,0x00,0x0d,0xaf,0x24,0x02,0x00,0x06,0x16,0x02,0xff,0x9b,0x3c,0x02,0xb0,0x05,
+0x8e,0x23,0x00,0x2c,0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x07,0xa2,0x24,0x00,0x08,
+0x24,0x02,0x00,0x03,0xa2,0x22,0x00,0x0a,0x92,0x22,0x00,0x2f,0xae,0x20,0x00,0x2c,
+0x08,0x00,0x0d,0x51,0xa2,0x22,0x00,0x06,0x08,0x00,0x0d,0xbe,0xa2,0x20,0x00,0x0a,
+0x8e,0x22,0x00,0x28,0x24,0x03,0x00,0x01,0x24,0x04,0x00,0x01,0x10,0x44,0x00,0x07,
+0xa2,0x23,0x00,0x08,0x24,0x02,0x00,0x05,0xa2,0x22,0x00,0x0a,0x92,0x22,0x00,0x2b,
+0xae,0x20,0x00,0x28,0x08,0x00,0x0d,0x51,0xa2,0x22,0x00,0x05,0x08,0x00,0x0d,0xca,
+0x24,0x02,0x00,0x04,0x12,0x02,0x00,0x12,0x2a,0x02,0x00,0x41,0x10,0x40,0x00,0x09,
+0x24,0x02,0x00,0x80,0x24,0x02,0x00,0x20,0x16,0x02,0xff,0x7b,0x3c,0x02,0xb0,0x05,
+0x24,0x02,0x00,0x12,0xa2,0x22,0x00,0x0a,0xa2,0x22,0x00,0x08,0x08,0x00,0x0d,0x51,
+0xae,0x20,0x00,0x3c,0x16,0x02,0xff,0x74,0x3c,0x02,0xb0,0x05,0x24,0x02,0x00,0x10,
+0xa2,0x22,0x00,0x0a,0xa2,0x22,0x00,0x08,0x08,0x00,0x0d,0x51,0xae,0x20,0x00,0x34,
+0x24,0x02,0x00,0x11,0xa2,0x22,0x00,0x0a,0xa2,0x22,0x00,0x08,0x08,0x00,0x0d,0x51,
+0xae,0x20,0x00,0x38,0x8e,0x24,0x00,0x30,0x24,0x02,0x00,0x03,0x24,0x03,0x00,0x01,
+0x10,0x83,0x00,0x07,0xa2,0x22,0x00,0x08,0x24,0x02,0x00,0x02,0xa2,0x22,0x00,0x0a,
+0x92,0x22,0x00,0x33,0xae,0x20,0x00,0x30,0x08,0x00,0x0d,0x51,0xa2,0x22,0x00,0x07,
+0x08,0x00,0x0d,0xf0,0xa2,0x24,0x00,0x0a,0x8f,0x84,0xb4,0x40,0xae,0x20,0x00,0x34,
+0x94,0x85,0x00,0x14,0x0c,0x00,0x1b,0x66,0x32,0x10,0x00,0xff,0x08,0x00,0x0d,0x42,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x24,0x42,0x37,0xf4,
+0x34,0x63,0x00,0x20,0xac,0x62,0x00,0x00,0x80,0xa2,0x00,0x15,0x3c,0x06,0xb0,0x05,
+0x10,0x40,0x00,0x0a,0x34,0xc6,0x02,0x54,0x83,0x83,0x8b,0xd4,0x00,0x00,0x00,0x00,
+0xac,0x83,0x00,0x24,0x8c,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x17,0x42,
+0x30,0x42,0x00,0x01,0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x28,0x8c,0x82,0x00,0x2c,
+0x3c,0x06,0xb0,0x05,0x34,0xc6,0x04,0x50,0x00,0x02,0x18,0x43,0x30,0x63,0x00,0x01,
+0x10,0x40,0x00,0x04,0x30,0x45,0x00,0x01,0xac,0x83,0x00,0x28,0x03,0xe0,0x00,0x08,
+0xac,0x85,0x00,0x24,0x90,0xc2,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,
+0x30,0x43,0x00,0x02,0x30,0x42,0x00,0x01,0xac,0x83,0x00,0x28,0x03,0xe0,0x00,0x08,
+0xac,0x82,0x00,0x24,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xd8,
+0x34,0x63,0x00,0x20,0x24,0x42,0x38,0x84,0xac,0x62,0x00,0x00,0xaf,0xb1,0x00,0x1c,
+0xaf,0xbf,0x00,0x20,0xaf,0xb0,0x00,0x18,0x90,0xa6,0x00,0x0a,0x27,0x83,0xb4,0x00,
+0x00,0xa0,0x88,0x21,0x00,0x06,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x50,0x00,0x00,
+0x80,0xa5,0x00,0x11,0x92,0x03,0x00,0x12,0x10,0xa0,0x00,0x04,0xa2,0x20,0x00,0x15,
+0x24,0x02,0x00,0x12,0x10,0xc2,0x00,0xda,0x00,0x00,0x00,0x00,0x82,0x22,0x00,0x12,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x67,0x00,0x00,0x00,0x00,0xa2,0x20,0x00,0x12,
+0xa2,0x00,0x00,0x19,0x86,0x23,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x20,0x00,0x43,0x10,0x21,
+0xa0,0x40,0x00,0x00,0x92,0x03,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0xdf,
+0xa2,0x03,0x00,0x16,0x82,0x02,0x00,0x12,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x20,
+0x00,0x00,0x00,0x00,0x92,0x23,0x00,0x08,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x45,
+0x24,0x02,0x00,0x01,0xa2,0x20,0x00,0x04,0x92,0x08,0x00,0x04,0x00,0x00,0x00,0x00,
+0x15,0x00,0x00,0x1e,0x24,0x02,0x00,0x01,0x92,0x07,0x00,0x0a,0xa2,0x02,0x00,0x17,
+0x92,0x02,0x00,0x16,0x30,0xe3,0x00,0xff,0x30,0x42,0x00,0xe4,0x10,0x60,0x00,0x03,
+0xa2,0x02,0x00,0x16,0x34,0x42,0x00,0x01,0xa2,0x02,0x00,0x16,0x11,0x00,0x00,0x05,
+0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x16,0x00,0x00,0x00,0x00,0x34,0x42,0x00,0x02,
+0xa2,0x02,0x00,0x16,0x92,0x02,0x00,0x17,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x08,
+0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x06,0x00,0x00,0x00,0x00,0xa6,0x02,0x00,0x14,
+0x8f,0xbf,0x00,0x20,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,
+0x96,0x02,0x00,0x00,0x08,0x00,0x0e,0x6c,0xa6,0x02,0x00,0x14,0x92,0x07,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x0e,0x58,
+0xa2,0x00,0x00,0x17,0x96,0x04,0x00,0x00,0x96,0x05,0x00,0x06,0x27,0x86,0x90,0x00,
+0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x05,0x10,0xc0,0x00,0x45,0x10,0x21,
+0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x00,0x02,0x10,0x80,0x00,0x46,0x10,0x21,
+0x8c,0x66,0x00,0x08,0x8c,0x45,0x00,0x08,0x3c,0x03,0x80,0x00,0x00,0xc3,0x20,0x24,
+0x10,0x80,0x00,0x08,0x00,0xa3,0x10,0x24,0x10,0x40,0x00,0x04,0x00,0x00,0x18,0x21,
+0x10,0x80,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0xa6,0x18,0x2b,0x08,0x00,0x0e,0x58,
+0xa2,0x03,0x00,0x17,0x10,0x40,0xff,0xfd,0x00,0xa6,0x18,0x2b,0x08,0x00,0x0e,0x8c,
+0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x09,0x24,0x02,0x00,0x02,0x10,0x62,0x00,0x05,
+0x24,0x02,0x00,0x03,0x14,0x62,0xff,0xb8,0x00,0x00,0x00,0x00,0x08,0x00,0x0e,0x52,
+0xa2,0x20,0x00,0x07,0x08,0x00,0x0e,0x52,0xa2,0x20,0x00,0x06,0x08,0x00,0x0e,0x52,
+0xa2,0x20,0x00,0x05,0x82,0x22,0x00,0x10,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x69,
+0x2c,0x62,0x00,0x02,0x10,0x40,0x00,0x49,0x3c,0x02,0xb0,0x09,0x92,0x25,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0xa6,0x00,0xff,0x2c,0xc2,0x00,0x04,0x10,0x40,0x00,0x3b,
+0x2c,0xc2,0x00,0x10,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,
+0x24,0x02,0x00,0x01,0x00,0xc2,0x10,0x04,0x00,0x02,0x10,0x27,0x00,0x62,0x18,0x24,
+0xa0,0x83,0x00,0x00,0x86,0x23,0x00,0x0c,0x96,0x26,0x00,0x0c,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x28,0x80,0x27,0x83,0x90,0x04,0x00,0xa3,0x18,0x21,
+0x8c,0x64,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x04,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x10,0x10,0x40,0x00,0x18,0x24,0x07,0x00,0x01,0x93,0x82,0x8b,0x71,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x0a,0x24,0x05,0x00,0x24,
+0x00,0x06,0x2c,0x00,0x00,0x05,0x2c,0x03,0x0c,0x00,0x1b,0x66,0x02,0x00,0x20,0x21,
+0x92,0x02,0x00,0x16,0xa2,0x00,0x00,0x12,0x30,0x42,0x00,0xe7,0x08,0x00,0x0e,0x49,
+0xa2,0x02,0x00,0x16,0xf0,0xc5,0x00,0x06,0x00,0x00,0x28,0x12,0x27,0x82,0x90,0x00,
+0x00,0xa2,0x28,0x21,0x0c,0x00,0x01,0x49,0x3c,0x04,0x00,0x80,0x96,0x26,0x00,0x0c,
+0x08,0x00,0x0e,0xc9,0x00,0x06,0x2c,0x00,0x27,0x83,0x90,0x10,0x27,0x82,0x90,0x18,
+0x00,0xa2,0x10,0x21,0x00,0xa3,0x18,0x21,0x90,0x44,0x00,0x00,0x90,0x65,0x00,0x05,
+0x93,0x82,0x80,0x10,0x00,0x00,0x30,0x21,0x0c,0x00,0x21,0x9a,0xaf,0xa2,0x00,0x10,
+0x96,0x26,0x00,0x0c,0x08,0x00,0x0e,0xc3,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xcd,
+0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x30,0xa5,0x00,0x0f,
+0x24,0x02,0x00,0x80,0x08,0x00,0x0e,0xb2,0x00,0xa2,0x10,0x07,0x86,0x26,0x00,0x0c,
+0x3c,0x03,0xb0,0x09,0x34,0x42,0x01,0x72,0x34,0x63,0x01,0x78,0x94,0x47,0x00,0x00,
+0x8c,0x65,0x00,0x00,0x00,0x06,0x10,0xc0,0x00,0x46,0x10,0x21,0x3c,0x04,0xb0,0x09,
+0xae,0x25,0x00,0x1c,0x34,0x84,0x01,0x7c,0x27,0x83,0x90,0x04,0x00,0x02,0x10,0x80,
+0x8c,0x85,0x00,0x00,0x00,0x43,0x10,0x21,0x8c,0x43,0x00,0x18,0xae,0x25,0x00,0x20,
+0xa6,0x27,0x00,0x18,0x8c,0x66,0x00,0x08,0x02,0x20,0x20,0x21,0x0c,0x00,0x0f,0x19,
+0x00,0x00,0x28,0x21,0x86,0x25,0x00,0x18,0x8e,0x26,0x00,0x1c,0x8e,0x27,0x00,0x20,
+0x02,0x20,0x20,0x21,0x0c,0x00,0x1c,0x68,0xaf,0xa2,0x00,0x10,0x08,0x00,0x0e,0x49,
+0xa2,0x02,0x00,0x12,0x92,0x22,0x00,0x08,0x08,0x00,0x0e,0x49,0xa2,0x22,0x00,0x09,
+0xa2,0x20,0x00,0x11,0x80,0x82,0x00,0x50,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x03,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xd0,0xac,0x40,0x00,0x00,0x08,0x00,0x0e,0x49,
+0xa0,0x80,0x00,0x50,0x94,0x8a,0x00,0x0c,0x24,0x03,0x00,0x24,0x00,0x80,0x70,0x21,
+0x3c,0x02,0x80,0x00,0x3c,0x04,0xb0,0x03,0x24,0x42,0x3c,0x64,0xf1,0x43,0x00,0x06,
+0x34,0x84,0x00,0x20,0x00,0x00,0x18,0x12,0x00,0xa0,0x68,0x21,0xac,0x82,0x00,0x00,
+0x27,0x85,0x90,0x10,0x27,0x82,0x90,0x0f,0x27,0xbd,0xff,0xf8,0x00,0x62,0x60,0x21,
+0x00,0x65,0x58,0x21,0x00,0x00,0xc0,0x21,0x11,0xa0,0x00,0xcc,0x00,0x00,0x78,0x21,
+0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x45,0x10,0x21,0x91,0x87,0x00,0x00,0x80,0x48,0x00,0x04,
+0x03,0xa0,0x60,0x21,0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x48,0x80,0x27,0x83,0x90,0x04,0xa3,0xa7,0x00,0x00,
+0x01,0x23,0x18,0x21,0x8c,0x64,0x00,0x18,0x25,0x02,0xff,0xff,0x00,0x48,0x40,0x0b,
+0x8c,0x83,0x00,0x04,0x2d,0x05,0x00,0x07,0x24,0x02,0x00,0x06,0x30,0x63,0x00,0x08,
+0x14,0x60,0x00,0x35,0x00,0x45,0x40,0x0a,0x93,0xa7,0x00,0x00,0x27,0x82,0x90,0x18,
+0x01,0x22,0x10,0x21,0x30,0xe3,0x00,0xf0,0x38,0x63,0x00,0x50,0x30,0xe5,0x00,0xff,
+0x00,0x05,0x20,0x2b,0x00,0x03,0x18,0x2b,0x00,0x64,0x18,0x24,0x90,0x49,0x00,0x00,
+0x10,0x60,0x00,0x16,0x30,0xe4,0x00,0x0f,0x24,0x02,0x00,0x04,0x10,0xa2,0x00,0x9d,
+0x00,0x00,0x00,0x00,0x11,0xa0,0x00,0x3a,0x2c,0xa2,0x00,0x0c,0x10,0x40,0x00,0x02,
+0x24,0x84,0x00,0x0c,0x00,0xe0,0x20,0x21,0x30,0x84,0x00,0xff,0x00,0x04,0x10,0x40,
+0x27,0x83,0xbb,0x1c,0x00,0x44,0x10,0x21,0x00,0x43,0x10,0x21,0x90,0x47,0x00,0x00,
+0x00,0x00,0x00,0x00,0x2c,0xe3,0x00,0x0c,0xa3,0xa7,0x00,0x00,0x10,0x60,0x00,0x02,
+0x24,0xe2,0x00,0x04,0x00,0xe0,0x10,0x21,0xa3,0xa2,0x00,0x00,0x91,0x65,0x00,0x00,
+0x91,0x82,0x00,0x00,0x30,0xa3,0x00,0xff,0x00,0x62,0x10,0x2b,0x10,0x40,0x00,0x0e,
+0x2c,0x62,0x00,0x0c,0x14,0x40,0x00,0x03,0x00,0x60,0x20,0x21,0x30,0xa2,0x00,0x0f,
+0x24,0x44,0x00,0x0c,0x00,0x04,0x10,0x40,0x00,0x44,0x20,0x21,0x27,0x83,0xbb,0x1c,
+0x00,0x83,0x18,0x21,0x90,0x62,0x00,0x02,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x05,
+0x00,0x09,0x11,0x00,0xa1,0x85,0x00,0x00,0x93,0xa2,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x08,0x00,0x49,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x49,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x27,0x83,0xb4,0xa8,0x00,0x43,0x10,0x21,
+0x90,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x83,0x00,0x0c,0x14,0x60,0x00,0x06,
+0x00,0x80,0x10,0x21,0x00,0x18,0x10,0x40,0x00,0x4f,0x10,0x21,0x00,0x02,0x11,0x00,
+0x00,0x82,0x10,0x21,0x24,0x42,0x00,0x04,0x08,0x00,0x0f,0x7a,0xa1,0x82,0x00,0x00,
+0x8f,0x8d,0x81,0x5c,0x00,0x00,0x00,0x00,0x01,0xa8,0x10,0x21,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x10,0x60,0xff,0xd1,0x00,0x00,0x28,0x21,0x00,0x06,0x74,0x82,
+0x30,0xe2,0x00,0xff,0x2c,0x42,0x00,0x0c,0x14,0x40,0x00,0x03,0x00,0xe0,0x10,0x21,
+0x30,0xe2,0x00,0x0f,0x24,0x42,0x00,0x0c,0x30,0x44,0x00,0xff,0xa3,0xa2,0x00,0x00,
+0x24,0x02,0x00,0x0c,0x10,0x82,0x00,0x0d,0x00,0x09,0x11,0x00,0x00,0x49,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x04,0x18,0x40,0x00,0x49,0x10,0x23,0x00,0x64,0x18,0x21,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x27,0x84,0xb4,0xa8,0x00,0x44,0x10,0x21,
+0x90,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0xa3,0xa7,0x00,0x00,0x00,0x0a,0x1c,0x00,
+0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x83,0x90,0x04,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x18,0x00,0x00,0x00,0x00,
+0x8c,0x83,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x10,0x14,0x60,0x00,0x33,
+0x00,0x06,0x14,0x42,0x00,0x09,0x11,0x00,0x00,0x49,0x10,0x23,0x00,0x02,0x10,0x80,
+0x00,0x49,0x10,0x23,0x27,0x83,0xb5,0x78,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,
+0x90,0x44,0x00,0x04,0x90,0x43,0x00,0x05,0x00,0x00,0x00,0x00,0x00,0x64,0xc0,0x24,
+0x93,0xa7,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0xe2,0x00,0x0f,0x10,0x40,0x00,0x0f,
+0x31,0xcf,0x00,0x01,0x00,0x0a,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x84,0x90,0x00,0x00,0x44,0x10,0x21,
+0x84,0x43,0x00,0x06,0x00,0x00,0x00,0x00,0x28,0x63,0x06,0x41,0x14,0x60,0x00,0x04,
+0x30,0xe2,0x00,0xff,0x24,0x07,0x00,0x0f,0xa3,0xa7,0x00,0x00,0x30,0xe2,0x00,0xff,
+0x2c,0x42,0x00,0x0c,0x14,0x40,0x00,0x06,0x00,0xe0,0x10,0x21,0x00,0x18,0x10,0x40,
+0x00,0x4f,0x10,0x21,0x00,0x02,0x11,0x00,0x00,0x47,0x10,0x21,0x24,0x42,0x00,0x04,
+0xa3,0xa2,0x00,0x00,0x00,0x40,0x38,0x21,0x01,0xa8,0x10,0x21,0x90,0x43,0x00,0x00,
+0x24,0xa4,0x00,0x01,0x30,0x85,0xff,0xff,0x00,0xa3,0x18,0x2b,0x14,0x60,0xff,0xad,
+0x30,0xe2,0x00,0xff,0x08,0x00,0x0f,0x67,0x00,0x00,0x00,0x00,0x08,0x00,0x0f,0xc8,
+0x30,0x58,0x00,0x01,0x81,0xc2,0x00,0x48,0x00,0x00,0x00,0x00,0x10,0x40,0xff,0x73,
+0x00,0x00,0x00,0x00,0x08,0x00,0x0f,0x55,0x00,0x00,0x00,0x00,0x00,0x0a,0x1c,0x00,
+0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x45,0x10,0x21,0x80,0x48,0x00,0x05,0x91,0x67,0x00,0x00,0x08,0x00,0x0f,0x35,
+0x03,0xa0,0x58,0x21,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,
+0x24,0x42,0x40,0x04,0x03,0xe0,0x00,0x08,0xac,0x62,0x00,0x00,0x27,0xbd,0xff,0xc0,
+0xaf,0xb7,0x00,0x34,0xaf,0xb6,0x00,0x30,0xaf,0xb5,0x00,0x2c,0xaf,0xb4,0x00,0x28,
+0xaf,0xb3,0x00,0x24,0xaf,0xb2,0x00,0x20,0xaf,0xbf,0x00,0x3c,0xaf,0xbe,0x00,0x38,
+0xaf,0xb1,0x00,0x1c,0xaf,0xb0,0x00,0x18,0x84,0x82,0x00,0x0c,0x27,0x93,0x90,0x04,
+0x3c,0x05,0xb0,0x03,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x80,
+0x00,0x73,0x10,0x21,0x8c,0x5e,0x00,0x18,0x3c,0x02,0x80,0x00,0x34,0xa5,0x00,0x20,
+0x24,0x42,0x40,0x1c,0xac,0xa2,0x00,0x00,0x8f,0xd0,0x00,0x08,0x27,0x95,0x90,0x10,
+0x00,0x75,0x18,0x21,0x00,0x00,0x28,0x21,0x02,0x00,0x30,0x21,0x90,0x71,0x00,0x00,
+0x0c,0x00,0x0f,0x19,0x00,0x80,0xb0,0x21,0x00,0x40,0x90,0x21,0x00,0x10,0x14,0x42,
+0x30,0x54,0x00,0x01,0x02,0x40,0x20,0x21,0x00,0x10,0x14,0x82,0x02,0x80,0x28,0x21,
+0x12,0x51,0x00,0x23,0x00,0x10,0xbf,0xc2,0x86,0xc3,0x00,0x0c,0x30,0x50,0x00,0x01,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x55,0x10,0x21,
+0xa0,0x52,0x00,0x00,0x86,0xc3,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x10,0xc0,
+0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x53,0x30,0x21,0x8c,0xc7,0x00,0x18,
+0x27,0x83,0x90,0x00,0x00,0x43,0x10,0x21,0x8c,0xe3,0x00,0x04,0x84,0x46,0x00,0x06,
+0x00,0x03,0x19,0x42,0x0c,0x00,0x08,0xe3,0x30,0x73,0x00,0x01,0x00,0x40,0x88,0x21,
+0x02,0x40,0x20,0x21,0x02,0x80,0x28,0x21,0x16,0xe0,0x00,0x10,0x02,0x00,0x30,0x21,
+0x86,0xc2,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,
+0x00,0x03,0x18,0x80,0x27,0x82,0x90,0x08,0x00,0x62,0x18,0x21,0xa4,0x71,0x00,0x04,
+0x7b,0xbe,0x01,0xfc,0x7b,0xb6,0x01,0xbc,0x7b,0xb4,0x01,0x7c,0x7b,0xb2,0x01,0x3c,
+0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,0x86,0xc3,0x00,0x0c,
+0xaf,0xb3,0x00,0x10,0xaf,0xa0,0x00,0x14,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x55,0x10,0x21,0x80,0x47,0x00,0x06,0x00,0x00,0x00,0x00,
+0x24,0xe7,0x00,0x02,0x00,0x07,0x17,0xc2,0x00,0xe2,0x38,0x21,0x00,0x07,0x38,0x43,
+0x00,0x07,0x38,0x40,0x0c,0x00,0x09,0x0a,0x03,0xc7,0x38,0x21,0x08,0x00,0x10,0x48,
+0x02,0x22,0x88,0x21,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0xd0,
+0x34,0x63,0x00,0x20,0x24,0x42,0x41,0xa4,0xaf,0xb2,0x00,0x20,0xac,0x62,0x00,0x00,
+0xaf,0xbf,0x00,0x28,0xaf,0xb3,0x00,0x24,0xaf,0xb1,0x00,0x1c,0xaf,0xb0,0x00,0x18,
+0x3c,0x02,0xb0,0x03,0x90,0x83,0x00,0x0a,0x34,0x42,0x01,0x04,0x94,0x45,0x00,0x00,
+0x00,0x03,0x18,0x80,0x27,0x82,0xb4,0x00,0x00,0x62,0x18,0x21,0x30,0xa6,0xff,0xff,
+0x8c,0x71,0x00,0x00,0x80,0x85,0x00,0x12,0x30,0xc9,0x00,0xff,0x00,0x06,0x32,0x02,
+0xa4,0x86,0x00,0x44,0xa4,0x89,0x00,0x46,0x82,0x22,0x00,0x12,0x00,0x80,0x90,0x21,
+0x10,0xa0,0x00,0x1b,0xa0,0x80,0x00,0x15,0x00,0xc5,0x10,0x2a,0x10,0x40,0x00,0x14,
+0x00,0x00,0x00,0x00,0xa2,0x20,0x00,0x19,0x84,0x83,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x20,
+0x00,0x43,0x10,0x21,0xa0,0x40,0x00,0x00,0xa0,0x80,0x00,0x12,0x92,0x22,0x00,0x16,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xdf,0xa2,0x22,0x00,0x16,0x8f,0xbf,0x00,0x28,
+0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x30,
+0x0c,0x00,0x10,0x01,0x00,0x00,0x00,0x00,0x08,0x00,0x10,0x97,0x00,0x00,0x00,0x00,
+0x28,0x42,0x00,0x02,0x10,0x40,0x01,0x76,0x00,0x00,0x28,0x21,0x94,0x87,0x00,0x0c,
+0x00,0x00,0x00,0x00,0x00,0xe0,0x10,0x21,0x00,0x02,0x14,0x00,0x00,0x02,0x14,0x03,
+0x00,0x07,0x24,0x00,0x00,0x04,0x24,0x03,0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,
+0x00,0x04,0x28,0xc0,0x00,0xa4,0x28,0x21,0x27,0x82,0x90,0x20,0x00,0x03,0x18,0x80,
+0x00,0x62,0x18,0x21,0x00,0x05,0x28,0x80,0x27,0x82,0x90,0x08,0x00,0xa2,0x10,0x21,
+0x8c,0x68,0x00,0x00,0x80,0x44,0x00,0x06,0x27,0x82,0x90,0x10,0x00,0x08,0x1d,0x02,
+0x00,0xa2,0x28,0x21,0x38,0x84,0x00,0x00,0x30,0x63,0x00,0x01,0x01,0x24,0x30,0x0b,
+0x80,0xaa,0x00,0x04,0x80,0xa9,0x00,0x05,0x10,0x60,0x00,0x02,0x00,0x08,0x14,0x02,
+0x30,0x46,0x00,0x0f,0x15,0x20,0x00,0x28,0x01,0x49,0x10,0x21,0x15,0x40,0x00,0x11,
+0x30,0xe3,0xff,0xff,0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0xa8,0x00,0xff,
+0x2d,0x02,0x00,0x04,0x10,0x40,0x01,0x46,0x2d,0x02,0x00,0x10,0x3c,0x04,0xb0,0x05,
+0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x24,0x02,0x00,0x01,0x01,0x02,0x10,0x04,
+0x00,0x62,0x18,0x25,0xa0,0x83,0x00,0x00,0x96,0x47,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x30,0xe3,0xff,0xff,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x27,0x84,0x90,0x10,
+0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x80,0x45,0x00,0x06,0x00,0x03,0x1a,0x00,
+0x3c,0x04,0xb0,0x00,0x00,0x65,0x18,0x21,0x00,0x64,0x20,0x21,0x94,0x82,0x00,0x00,
+0x82,0x43,0x00,0x10,0x00,0x02,0x14,0x00,0x14,0x60,0x00,0x06,0x00,0x02,0x3c,0x03,
+0x30,0xe2,0x00,0x04,0x14,0x40,0x00,0x04,0x01,0x49,0x10,0x21,0x34,0xe2,0x08,0x00,
+0xa4,0x82,0x00,0x00,0x01,0x49,0x10,0x21,0x00,0x02,0x16,0x00,0x00,0x02,0x16,0x03,
+0x00,0x46,0x10,0x2a,0x10,0x40,0x00,0x7c,0x00,0x00,0x00,0x00,0x82,0x42,0x00,0x10,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0e,0x00,0x00,0x00,0x00,0x86,0x43,0x00,0x0c,
+0x25,0x44,0x00,0x01,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,0xa0,0x44,0x00,0x04,0x92,0x23,0x00,0x16,
+0x02,0x40,0x20,0x21,0x30,0x63,0x00,0xfb,0x08,0x00,0x10,0x9c,0xa2,0x23,0x00,0x16,
+0x86,0x43,0x00,0x0c,0x25,0x24,0x00,0x01,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,0xa0,0x44,0x00,0x05,
+0x86,0x45,0x00,0x0c,0x0c,0x00,0x1e,0xea,0x02,0x20,0x20,0x21,0x10,0x40,0x00,0x5a,
+0x00,0x00,0x00,0x00,0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0xa6,0x00,0xff,
+0x2c,0xc2,0x00,0x04,0x10,0x40,0x00,0x4c,0x2c,0xc2,0x00,0x10,0x3c,0x04,0xb0,0x05,
+0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x24,0x02,0x00,0x01,0x00,0xc2,0x10,0x04,
+0x00,0x02,0x10,0x27,0x00,0x62,0x18,0x24,0xa0,0x83,0x00,0x00,0x92,0x45,0x00,0x08,
+0x00,0x00,0x00,0x00,0x30,0xa5,0x00,0xff,0x14,0xa0,0x00,0x33,0x24,0x02,0x00,0x01,
+0xa2,0x40,0x00,0x04,0x92,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x0c,
+0x24,0x02,0x00,0x01,0xa2,0x22,0x00,0x17,0x92,0x22,0x00,0x17,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0x96,0x22,0x00,0x06,0x08,0x00,0x10,0x97,
+0xa6,0x22,0x00,0x14,0x96,0x22,0x00,0x00,0x08,0x00,0x10,0x97,0xa6,0x22,0x00,0x14,
+0x92,0x22,0x00,0x0a,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x03,0x00,0x00,0x00,0x00,
+0x08,0x00,0x11,0x26,0xa2,0x20,0x00,0x17,0x96,0x24,0x00,0x00,0x96,0x25,0x00,0x06,
+0x27,0x86,0x90,0x00,0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x05,0x10,0xc0,
+0x00,0x45,0x10,0x21,0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x00,0x02,0x10,0x80,
+0x00,0x46,0x10,0x21,0x8c,0x65,0x00,0x08,0x8c,0x44,0x00,0x08,0x3c,0x03,0x80,0x00,
+0x00,0xa3,0x30,0x24,0x10,0xc0,0x00,0x08,0x00,0x83,0x10,0x24,0x10,0x40,0x00,0x04,
+0x00,0x00,0x18,0x21,0x10,0xc0,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0x85,0x18,0x2b,
+0x08,0x00,0x11,0x26,0xa2,0x23,0x00,0x17,0x10,0x40,0xff,0xfd,0x00,0x85,0x18,0x2b,
+0x08,0x00,0x11,0x49,0x00,0x00,0x00,0x00,0x10,0xa2,0x00,0x09,0x24,0x02,0x00,0x02,
+0x10,0xa2,0x00,0x05,0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xca,0x00,0x00,0x00,0x00,
+0x08,0x00,0x11,0x21,0xa2,0x40,0x00,0x07,0x08,0x00,0x11,0x21,0xa2,0x40,0x00,0x06,
+0x08,0x00,0x11,0x21,0xa2,0x40,0x00,0x05,0x14,0x40,0xff,0xbe,0x3c,0x04,0xb0,0x05,
+0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x30,0xa5,0x00,0x0f,0x24,0x02,0x00,0x80,
+0x08,0x00,0x11,0x18,0x00,0xa2,0x10,0x07,0x0c,0x00,0x10,0x07,0x02,0x40,0x20,0x21,
+0x08,0x00,0x10,0x97,0x00,0x00,0x00,0x00,0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,
+0x30,0xa6,0x00,0xff,0x2c,0xc2,0x00,0x04,0x10,0x40,0x00,0x99,0x2c,0xc2,0x00,0x10,
+0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,0x24,0x02,0x00,0x01,
+0x00,0xc2,0x10,0x04,0x00,0x02,0x10,0x27,0x00,0x62,0x18,0x24,0xa0,0x83,0x00,0x00,
+0x92,0x45,0x00,0x08,0x00,0x00,0x00,0x00,0x30,0xa5,0x00,0xff,0x14,0xa0,0x00,0x80,
+0x24,0x02,0x00,0x01,0xa2,0x40,0x00,0x04,0x86,0x43,0x00,0x0c,0x27,0x93,0x90,0x04,
+0x96,0x47,0x00,0x0c,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x28,0x80,
+0x00,0xb3,0x18,0x21,0x8c,0x64,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x10,0x10,0x40,0x00,0x64,0x00,0x00,0x30,0x21,
+0x00,0x07,0x1c,0x00,0x00,0x03,0x1c,0x03,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x53,0x10,0x21,0x8c,0x43,0x00,0x18,0x93,0x82,0x8b,0x71,
+0x8c,0x64,0x00,0x04,0x30,0x42,0x00,0x01,0x00,0x04,0x21,0x42,0x14,0x40,0x00,0x4d,
+0x30,0x90,0x00,0x01,0x00,0x07,0x2c,0x00,0x00,0x05,0x2c,0x03,0x0c,0x00,0x1b,0x66,
+0x02,0x20,0x20,0x21,0x96,0x26,0x00,0x06,0x12,0x00,0x00,0x14,0x30,0xc5,0xff,0xff,
+0x02,0x60,0x90,0x21,0x00,0x05,0x10,0xc0,0x00,0x45,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x52,0x18,0x21,0x92,0x22,0x00,0x0a,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0b,
+0x02,0x20,0x20,0x21,0x8c,0x63,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x62,0x00,0x04,
+0x00,0x00,0x00,0x00,0x00,0x02,0x11,0x42,0x0c,0x00,0x1b,0x66,0x30,0x50,0x00,0x01,
+0x96,0x26,0x00,0x06,0x16,0x00,0xff,0xef,0x30,0xc5,0xff,0xff,0x92,0x22,0x00,0x04,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x0d,0x24,0x02,0x00,0x01,0xa2,0x22,0x00,0x17,
+0x92,0x22,0x00,0x17,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x05,0x00,0x00,0x00,0x00,
+0xa6,0x26,0x00,0x14,0x92,0x22,0x00,0x16,0x08,0x00,0x10,0x96,0x30,0x42,0x00,0xc3,
+0x96,0x22,0x00,0x00,0x08,0x00,0x11,0xbd,0xa6,0x22,0x00,0x14,0x92,0x22,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x11,0xb8,
+0xa2,0x20,0x00,0x17,0x96,0x24,0x00,0x00,0x30,0xc5,0xff,0xff,0x00,0x05,0x18,0xc0,
+0x00,0x04,0x10,0xc0,0x00,0x44,0x10,0x21,0x00,0x65,0x18,0x21,0x27,0x84,0x90,0x00,
+0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x21,0x00,0x03,0x18,0x80,0x8c,0x45,0x00,0x08,
+0x00,0x64,0x18,0x21,0x8c,0x64,0x00,0x08,0x3c,0x02,0x80,0x00,0x00,0xa2,0x38,0x24,
+0x10,0xe0,0x00,0x08,0x00,0x82,0x10,0x24,0x10,0x40,0x00,0x04,0x00,0x00,0x18,0x21,
+0x10,0xe0,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0x85,0x18,0x2b,0x08,0x00,0x11,0xb8,
+0xa2,0x23,0x00,0x17,0x10,0x40,0xff,0xfd,0x00,0x85,0x18,0x2b,0x08,0x00,0x11,0xdc,
+0x00,0x00,0x00,0x00,0x24,0x05,0x00,0x24,0xf0,0xe5,0x00,0x06,0x00,0x00,0x28,0x12,
+0x27,0x82,0x90,0x00,0x00,0xa2,0x28,0x21,0x0c,0x00,0x01,0x49,0x00,0x00,0x20,0x21,
+0x96,0x47,0x00,0x0c,0x08,0x00,0x11,0x9a,0x00,0x07,0x2c,0x00,0x27,0x83,0x90,0x10,
+0x27,0x82,0x90,0x18,0x00,0xa2,0x10,0x21,0x00,0xa3,0x18,0x21,0x90,0x44,0x00,0x00,
+0x90,0x65,0x00,0x05,0x93,0x82,0x80,0x10,0x24,0x07,0x00,0x01,0x0c,0x00,0x21,0x9a,
+0xaf,0xa2,0x00,0x10,0x96,0x47,0x00,0x0c,0x08,0x00,0x11,0x8d,0x00,0x07,0x1c,0x00,
+0x10,0xa2,0x00,0x09,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x05,0x24,0x02,0x00,0x03,
+0x14,0xa2,0xff,0x7d,0x00,0x00,0x00,0x00,0x08,0x00,0x11,0x7e,0xa2,0x40,0x00,0x07,
+0x08,0x00,0x11,0x7e,0xa2,0x40,0x00,0x06,0x08,0x00,0x11,0x7e,0xa2,0x40,0x00,0x05,
+0x14,0x40,0xff,0x71,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,
+0x30,0xa5,0x00,0x0f,0x24,0x02,0x00,0x80,0x08,0x00,0x11,0x75,0x00,0xa2,0x10,0x07,
+0x14,0x40,0xfe,0xc3,0x3c,0x04,0xb0,0x05,0x34,0x84,0x02,0x29,0x90,0x83,0x00,0x00,
+0x30,0xa5,0x00,0x0f,0x24,0x02,0x00,0x80,0x08,0x00,0x10,0xd0,0x00,0xa2,0x10,0x07,
+0x84,0x83,0x00,0x0c,0x00,0x00,0x00,0x00,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x04,0x00,0x43,0x10,0x21,0x8c,0x47,0x00,0x18,
+0x00,0x00,0x00,0x00,0x8c,0xe6,0x00,0x08,0x0c,0x00,0x0f,0x19,0x00,0x00,0x00,0x00,
+0x02,0x40,0x20,0x21,0x00,0x00,0x28,0x21,0x00,0x00,0x30,0x21,0x00,0x00,0x38,0x21,
+0x0c,0x00,0x1c,0x68,0xaf,0xa2,0x00,0x10,0x00,0x02,0x1e,0x00,0x14,0x60,0xfe,0x6b,
+0xa2,0x22,0x00,0x12,0x92,0x43,0x00,0x08,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x40,
+0x24,0x02,0x00,0x01,0xa2,0x40,0x00,0x04,0x92,0x28,0x00,0x04,0x00,0x00,0x00,0x00,
+0x15,0x00,0x00,0x19,0x24,0x02,0x00,0x01,0x92,0x27,0x00,0x0a,0xa2,0x22,0x00,0x17,
+0x92,0x22,0x00,0x17,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x10,0x00,0x00,0x00,0x00,
+0x96,0x22,0x00,0x06,0x00,0x00,0x00,0x00,0xa6,0x22,0x00,0x14,0x92,0x22,0x00,0x16,
+0x30,0xe3,0x00,0xff,0x30,0x42,0x00,0xc0,0x10,0x60,0x00,0x03,0xa2,0x22,0x00,0x16,
+0x34,0x42,0x00,0x01,0xa2,0x22,0x00,0x16,0x11,0x00,0xfe,0x50,0x00,0x00,0x00,0x00,
+0x92,0x22,0x00,0x16,0x08,0x00,0x10,0x96,0x34,0x42,0x00,0x02,0x96,0x22,0x00,0x00,
+0x08,0x00,0x12,0x3f,0xa6,0x22,0x00,0x14,0x92,0x27,0x00,0x0a,0x00,0x00,0x00,0x00,
+0x14,0xe0,0x00,0x03,0x00,0x00,0x00,0x00,0x08,0x00,0x12,0x38,0xa2,0x20,0x00,0x17,
+0x96,0x24,0x00,0x00,0x96,0x25,0x00,0x06,0x27,0x86,0x90,0x00,0x00,0x04,0x18,0xc0,
+0x00,0x64,0x18,0x21,0x00,0x05,0x10,0xc0,0x00,0x45,0x10,0x21,0x00,0x03,0x18,0x80,
+0x00,0x66,0x18,0x21,0x00,0x02,0x10,0x80,0x00,0x46,0x10,0x21,0x8c,0x65,0x00,0x08,
+0x8c,0x44,0x00,0x08,0x3c,0x03,0x80,0x00,0x00,0xa3,0x30,0x24,0x10,0xc0,0x00,0x08,
+0x00,0x83,0x10,0x24,0x10,0x40,0x00,0x04,0x00,0x00,0x18,0x21,0x10,0xc0,0x00,0x02,
+0x24,0x03,0x00,0x01,0x00,0x85,0x18,0x2b,0x08,0x00,0x12,0x38,0xa2,0x23,0x00,0x17,
+0x10,0x40,0xff,0xfd,0x00,0x85,0x18,0x2b,0x08,0x00,0x12,0x67,0x00,0x00,0x00,0x00,
+0x10,0x62,0x00,0x09,0x24,0x02,0x00,0x02,0x10,0x62,0x00,0x05,0x24,0x02,0x00,0x03,
+0x14,0x62,0xff,0xbd,0x00,0x00,0x00,0x00,0x08,0x00,0x12,0x32,0xa2,0x40,0x00,0x07,
+0x08,0x00,0x12,0x32,0xa2,0x40,0x00,0x06,0x08,0x00,0x12,0x32,0xa2,0x40,0x00,0x05,
+0x3c,0x02,0x80,0x00,0x00,0x82,0x30,0x24,0x10,0xc0,0x00,0x08,0x00,0xa2,0x18,0x24,
+0x10,0x60,0x00,0x04,0x00,0x00,0x10,0x21,0x10,0xc0,0x00,0x02,0x24,0x02,0x00,0x01,
+0x00,0xa4,0x10,0x2b,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x10,0x60,0xff,0xfd,
+0x00,0xa4,0x10,0x2b,0x08,0x00,0x12,0x82,0x00,0x00,0x00,0x00,0x30,0x82,0xff,0xff,
+0x00,0x02,0x18,0xc0,0x00,0x62,0x18,0x21,0x27,0x84,0x90,0x10,0x00,0x03,0x18,0x80,
+0x00,0x64,0x18,0x21,0x80,0x66,0x00,0x06,0x00,0x02,0x12,0x00,0x3c,0x03,0xb0,0x00,
+0x00,0x46,0x10,0x21,0x00,0x45,0x10,0x21,0x03,0xe0,0x00,0x08,0x00,0x43,0x10,0x21,
+0x27,0xbd,0xff,0xe0,0x30,0x82,0x00,0x7c,0x30,0x84,0xff,0x00,0xaf,0xbf,0x00,0x1c,
+0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x14,0x40,0x00,0x41,
+0x00,0x04,0x22,0x03,0x24,0x02,0x00,0x04,0x3c,0x10,0xb0,0x03,0x8e,0x10,0x00,0x00,
+0x10,0x82,0x00,0x32,0x24,0x02,0x00,0x08,0x10,0x82,0x00,0x03,0x32,0x02,0x00,0x20,
+0x08,0x00,0x12,0xa8,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x17,0x3c,0x02,0xb0,0x06,
+0x34,0x42,0x80,0x24,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x67,0x00,0xff,
+0x10,0xe0,0x00,0x23,0x00,0x00,0x88,0x21,0x8f,0x85,0x8f,0xe0,0x00,0x40,0x30,0x21,
+0x94,0xa2,0x00,0x08,0x8c,0xc3,0x00,0x00,0x26,0x31,0x00,0x01,0x24,0x42,0x00,0x02,
+0x30,0x42,0x01,0xff,0x34,0x63,0x01,0x00,0x02,0x27,0x20,0x2a,0xa4,0xa2,0x00,0x08,
+0x14,0x80,0xff,0xf7,0xac,0xc3,0x00,0x00,0x84,0xa3,0x00,0x08,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x00,0x30,0xac,0x43,0x00,0x00,0x27,0x92,0xb4,0x00,0x24,0x11,0x00,0x12,
+0x8e,0x44,0x00,0x00,0x26,0x31,0xff,0xff,0x90,0x82,0x00,0x10,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x03,0x26,0x52,0x00,0x04,0x0c,0x00,0x18,0xd0,0x00,0x00,0x00,0x00,
+0x06,0x21,0xff,0xf7,0x24,0x02,0xff,0xdf,0x02,0x02,0x80,0x24,0x3c,0x01,0xb0,0x03,
+0x0c,0x00,0x13,0x1c,0xac,0x30,0x00,0x00,0x08,0x00,0x12,0xa8,0x00,0x00,0x00,0x00,
+0x8f,0x85,0x8f,0xe0,0x08,0x00,0x12,0xbe,0x00,0x00,0x00,0x00,0x24,0x02,0xff,0x95,
+0x3c,0x03,0xb0,0x03,0x02,0x02,0x80,0x24,0x34,0x63,0x00,0x30,0x3c,0x01,0xb0,0x03,
+0xac,0x30,0x00,0x00,0x0c,0x00,0x12,0xe5,0xac,0x60,0x00,0x00,0x08,0x00,0x12,0xa8,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x50,0x08,0x00,0x12,0xa8,
+0xac,0x46,0x00,0x00,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x4b,0x94,0x3c,0x0b,0xb0,0x03,
+0xad,0x6a,0x00,0x20,0x3c,0x08,0x80,0x01,0x25,0x08,0x00,0x00,0x3c,0x09,0x80,0x01,
+0x25,0x29,0x03,0x50,0x11,0x09,0x00,0x10,0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,
+0x25,0x4a,0x4b,0xbc,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0x3c,0x08,0xb0,0x06,
+0x35,0x08,0x80,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x8d,0x09,0x00,0x00,
+0x00,0x00,0x00,0x00,0x31,0x29,0x00,0x01,0x00,0x00,0x00,0x00,0x24,0x01,0x00,0x01,
+0x15,0x21,0xff,0xf2,0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x4b,0xf8,
+0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,0x3c,0x02,0xb0,0x03,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x34,0x63,0x00,0x40,0x00,0x00,0x00,0x00,0xac,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x4c,0x24,0x3c,0x0b,0xb0,0x03,
+0xad,0x6a,0x00,0x20,0x3c,0x02,0x80,0x01,0x24,0x42,0x00,0x00,0x3c,0x03,0x80,0x01,
+0x24,0x63,0x03,0x50,0x3c,0x04,0xb0,0x00,0x8c,0x85,0x00,0x00,0x00,0x00,0x00,0x00,
+0xac,0x45,0x00,0x00,0x24,0x42,0x00,0x04,0x24,0x84,0x00,0x04,0x00,0x43,0x08,0x2a,
+0x14,0x20,0xff,0xf9,0x00,0x00,0x00,0x00,0x0c,0x00,0x13,0x1c,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0x80,0x00,0x25,0x4a,0x4c,0x70,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,
+0x3c,0x02,0x80,0x01,0x24,0x42,0x03,0x50,0x3c,0x03,0x80,0x01,0x24,0x63,0x3f,0x24,
+0xac,0x40,0x00,0x00,0xac,0x40,0x00,0x04,0xac,0x40,0x00,0x08,0xac,0x40,0x00,0x0c,
+0x24,0x42,0x00,0x10,0x00,0x43,0x08,0x2a,0x14,0x20,0xff,0xf9,0x00,0x00,0x00,0x00,
+0x3c,0x0a,0x80,0x00,0x25,0x4a,0x4c,0xb0,0x3c,0x0b,0xb0,0x03,0xad,0x6a,0x00,0x20,
+0x3c,0x1c,0x80,0x01,0x27,0x9c,0x7f,0xf0,0x27,0x9d,0x8b,0xe0,0x00,0x00,0x00,0x00,
+0x27,0x9d,0x8f,0xc8,0x3c,0x0a,0x80,0x00,0x25,0x4a,0x4c,0xd4,0x3c,0x0b,0xb0,0x03,
+0xad,0x6a,0x00,0x20,0x40,0x80,0x68,0x00,0x40,0x08,0x60,0x00,0x00,0x00,0x00,0x00,
+0x35,0x08,0xff,0x01,0x40,0x88,0x60,0x00,0x00,0x00,0x00,0x00,0x0c,0x00,0x15,0x62,
+0x00,0x00,0x00,0x00,0x24,0x84,0xf8,0x00,0x30,0x87,0x00,0x03,0x00,0x04,0x30,0x40,
+0x00,0xc7,0x20,0x23,0x3c,0x02,0xb0,0x0a,0x27,0xbd,0xff,0xe0,0x24,0x03,0xff,0xff,
+0x00,0x82,0x20,0x21,0xaf,0xb1,0x00,0x14,0xac,0x83,0x10,0x00,0xaf,0xbf,0x00,0x18,
+0xaf,0xb0,0x00,0x10,0x00,0xa0,0x88,0x21,0x24,0x03,0x00,0x01,0x8c,0x82,0x10,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0xc7,0x10,0x23,0x3c,0x03,0xb0,0x0a,
+0x00,0x43,0x10,0x21,0x8c,0x50,0x00,0x00,0x0c,0x00,0x13,0x99,0x02,0x20,0x20,0x21,
+0x02,0x11,0x80,0x24,0x00,0x50,0x80,0x06,0x02,0x00,0x10,0x21,0x8f,0xbf,0x00,0x18,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x27,0xbd,0xff,0xd8,
+0xaf,0xb2,0x00,0x18,0x00,0xa0,0x90,0x21,0x24,0x05,0xff,0xff,0xaf,0xb3,0x00,0x1c,
+0xaf,0xbf,0x00,0x20,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0x00,0xc0,0x98,0x21,
+0x12,0x45,0x00,0x23,0x24,0x84,0xf8,0x00,0x30,0x83,0x00,0x03,0x00,0x04,0x10,0x40,
+0x00,0x40,0x88,0x21,0x00,0x60,0x20,0x21,0x00,0x43,0x10,0x23,0x3c,0x03,0xb0,0x0a,
+0x00,0x43,0x10,0x21,0xac,0x45,0x10,0x00,0x00,0x40,0x18,0x21,0x24,0x05,0x00,0x01,
+0x8c,0x62,0x10,0x00,0x00,0x00,0x00,0x00,0x14,0x45,0xff,0xfd,0x3c,0x02,0xb0,0x0a,
+0x02,0x24,0x88,0x23,0x02,0x22,0x88,0x21,0x8e,0x30,0x00,0x00,0x0c,0x00,0x13,0x99,
+0x02,0x40,0x20,0x21,0x00,0x12,0x18,0x27,0x02,0x03,0x80,0x24,0x00,0x53,0x10,0x04,
+0x02,0x02,0x80,0x25,0xae,0x30,0x00,0x00,0x24,0x03,0x00,0x01,0x8e,0x22,0x10,0x00,
+0x00,0x00,0x00,0x00,0x14,0x43,0xff,0xfd,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x20,
+0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,
+0x30,0x82,0x00,0x03,0x00,0x04,0x18,0x40,0x00,0x62,0x18,0x23,0x3c,0x04,0xb0,0x0a,
+0x00,0x64,0x18,0x21,0xac,0x66,0x00,0x00,0x24,0x04,0x00,0x01,0x8c,0x62,0x10,0x00,
+0x00,0x00,0x00,0x00,0x14,0x44,0xff,0xfd,0x00,0x00,0x00,0x00,0x08,0x00,0x13,0x87,
+0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x21,0x00,0x64,0x10,0x06,0x30,0x42,0x00,0x01,
+0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,0x24,0x63,0x00,0x01,0x2c,0x62,0x00,0x20,
+0x14,0x40,0xff,0xf9,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,
+0x27,0xbd,0xff,0xe0,0x3c,0x03,0xb0,0x05,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x1c,0x00,0x80,0x90,0x21,0x00,0xa0,0x80,0x21,
+0x00,0xc0,0x88,0x21,0x34,0x63,0x02,0x2e,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x01,0x14,0x40,0xff,0xfc,0x24,0x04,0x08,0x24,0x3c,0x05,0x00,0xc0,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x03,0x24,0x04,0x08,0x34,0x3c,0x05,0x00,0xc0,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x03,0x3c,0x02,0xc0,0x00,0x00,0x10,0x1c,0x00,
+0x34,0x42,0x04,0x00,0x3c,0x04,0xb0,0x05,0x3c,0x05,0xb0,0x05,0x24,0x63,0x16,0x09,
+0x02,0x22,0x10,0x21,0x34,0x84,0x04,0x20,0x34,0xa5,0x04,0x24,0x3c,0x06,0xb0,0x05,
+0xac,0x83,0x00,0x00,0x24,0x07,0x00,0x01,0xac,0xa2,0x00,0x00,0x34,0xc6,0x02,0x28,
+0x24,0x02,0x00,0x20,0xae,0x47,0x00,0x3c,0x24,0x04,0x08,0x24,0xa0,0xc2,0x00,0x00,
+0x3c,0x05,0x00,0xc0,0xa2,0x47,0x00,0x11,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x01,
+0x24,0x04,0x08,0x34,0x3c,0x05,0x00,0xc0,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x01,
+0x8f,0xbf,0x00,0x1c,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x20,0x24,0x02,0x00,0x06,0xac,0x82,0x00,0x0c,0xa0,0x80,0x00,0x50,
+0xac,0x80,0x00,0x00,0xac,0x80,0x00,0x04,0xac,0x80,0x00,0x08,0xac,0x80,0x00,0x14,
+0xac,0x80,0x00,0x18,0xac,0x80,0x00,0x1c,0xa4,0x80,0x00,0x20,0xac,0x80,0x00,0x24,
+0xac,0x80,0x00,0x28,0xac,0x80,0x00,0x2c,0xa0,0x80,0x00,0x30,0xa0,0x80,0x00,0x31,
+0xac,0x80,0x00,0x34,0xac,0x80,0x00,0x38,0xa0,0x80,0x00,0x3c,0xac,0x82,0x00,0x10,
+0xa0,0x80,0x00,0x44,0xac,0x80,0x00,0x48,0x03,0xe0,0x00,0x08,0xac,0x80,0x00,0x4c,
+0x3c,0x04,0xb0,0x06,0x34,0x84,0x80,0x00,0x8c,0x83,0x00,0x00,0x3c,0x02,0x12,0x00,
+0x3c,0x05,0xb0,0x03,0x00,0x62,0x18,0x25,0x34,0xa5,0x00,0x8b,0x24,0x02,0xff,0x80,
+0xac,0x83,0x00,0x00,0x03,0xe0,0x00,0x08,0xa0,0xa2,0x00,0x00,0x3c,0x04,0xb0,0x03,
+0x34,0x84,0x00,0x0b,0x24,0x02,0x00,0x22,0x3c,0x05,0xb0,0x01,0x3c,0x06,0x45,0x67,
+0x3c,0x0a,0xb0,0x09,0xa0,0x82,0x00,0x00,0x34,0xa5,0x00,0x04,0x34,0xc6,0x89,0xaa,
+0x35,0x4a,0x00,0x04,0x24,0x02,0x01,0x23,0x3c,0x0b,0xb0,0x09,0x3c,0x07,0x01,0x23,
+0x3c,0x0c,0xb0,0x09,0x3c,0x01,0xb0,0x01,0xac,0x20,0x00,0x00,0x27,0xbd,0xff,0xe0,
+0xac,0xa0,0x00,0x00,0x35,0x6b,0x00,0x08,0x3c,0x01,0xb0,0x09,0xac,0x26,0x00,0x00,
+0x34,0xe7,0x45,0x66,0xa5,0x42,0x00,0x00,0x35,0x8c,0x00,0x0c,0x24,0x02,0xcd,0xef,
+0x3c,0x0d,0xb0,0x09,0x3c,0x08,0xcd,0xef,0x3c,0x0e,0xb0,0x09,0xad,0x67,0x00,0x00,
+0xaf,0xb7,0x00,0x1c,0xa5,0x82,0x00,0x00,0xaf,0xb6,0x00,0x18,0xaf,0xb5,0x00,0x14,
+0xaf,0xb4,0x00,0x10,0xaf,0xb3,0x00,0x0c,0xaf,0xb2,0x00,0x08,0xaf,0xb1,0x00,0x04,
+0xaf,0xb0,0x00,0x00,0x35,0xad,0x00,0x10,0x35,0x08,0x01,0x22,0x35,0xce,0x00,0x14,
+0x24,0x02,0x89,0xab,0x3c,0x0f,0xb0,0x09,0x3c,0x09,0x89,0xab,0x3c,0x10,0xb0,0x09,
+0x3c,0x11,0xb0,0x09,0x3c,0x12,0xb0,0x09,0x3c,0x13,0xb0,0x09,0x3c,0x14,0xb0,0x09,
+0x3c,0x15,0xb0,0x09,0x3c,0x16,0xb0,0x09,0x3c,0x17,0xb0,0x09,0xad,0xa8,0x00,0x00,
+0x24,0x03,0xff,0xff,0xa5,0xc2,0x00,0x00,0x35,0xef,0x00,0x18,0x35,0x29,0xcd,0xee,
+0x36,0x10,0x00,0x1c,0x36,0x31,0x00,0x20,0x36,0x52,0x00,0x24,0x36,0x73,0x00,0x28,
+0x36,0x94,0x00,0x2c,0x36,0xb5,0x00,0x30,0x36,0xd6,0x00,0x34,0x36,0xf7,0x00,0x38,
+0x24,0x02,0x45,0x67,0xad,0xe9,0x00,0x00,0xa6,0x02,0x00,0x00,0xae,0x23,0x00,0x00,
+0x8f,0xb0,0x00,0x00,0xa6,0x43,0x00,0x00,0x8f,0xb1,0x00,0x04,0xae,0x63,0x00,0x00,
+0x8f,0xb2,0x00,0x08,0xa6,0x83,0x00,0x00,0x8f,0xb3,0x00,0x0c,0xae,0xa3,0x00,0x00,
+0x8f,0xb4,0x00,0x10,0xa6,0xc3,0x00,0x00,0x8f,0xb5,0x00,0x14,0xae,0xe3,0x00,0x00,
+0x7b,0xb6,0x00,0xfc,0x3c,0x18,0xb0,0x09,0x37,0x18,0x00,0x3c,0xa7,0x03,0x00,0x00,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x51,0x48,0xac,0x62,0x00,0x00,0x8c,0x83,0x00,0x34,
+0x34,0x02,0xff,0xff,0x00,0x43,0x10,0x2a,0x14,0x40,0x01,0x04,0x00,0x80,0x28,0x21,
+0x8c,0x86,0x00,0x08,0x24,0x02,0x00,0x03,0x10,0xc2,0x00,0xf7,0x00,0x00,0x00,0x00,
+0x8c,0xa2,0x00,0x2c,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x4f,0x24,0x02,0x00,0x06,
+0x3c,0x03,0xb0,0x05,0x34,0x63,0x04,0x50,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0x14,0x40,0x00,0xdd,0xac,0xa2,0x00,0x2c,0x24,0x02,0x00,0x01,
+0x10,0xc2,0x00,0xdc,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xc2,0x00,0xca,
+0x00,0x00,0x00,0x00,0x8c,0xa7,0x00,0x04,0x24,0x02,0x00,0x02,0x10,0xe2,0x00,0xc0,
+0x00,0x00,0x00,0x00,0x8c,0xa2,0x00,0x14,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x09,
+0x24,0x02,0x00,0x01,0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x60,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x10,0x40,0x00,0x05,0xac,0xa2,0x00,0x14,
+0x24,0x02,0x00,0x01,0xac,0xa2,0x00,0x00,0x03,0xe0,0x00,0x08,0xac,0xa0,0x00,0x14,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xd0,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x04,0x61,0x00,0x19,0x3c,0x02,0xb0,0x03,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x2e,
+0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0x12,
+0x3c,0x02,0xb0,0x03,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x42,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x0c,0x3c,0x02,0xb0,0x03,0x80,0xa2,0x00,0x50,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x08,0x3c,0x02,0xb0,0x03,0x14,0xc0,0x00,0x07,
+0x34,0x42,0x00,0x3f,0x24,0x02,0x00,0x0e,0x24,0x03,0x00,0x01,0xac,0xa2,0x00,0x00,
+0x03,0xe0,0x00,0x08,0xa0,0xa3,0x00,0x50,0x34,0x42,0x00,0x3f,0x90,0x44,0x00,0x00,
+0x24,0x03,0x00,0x01,0x10,0x64,0x00,0x7f,0x3c,0x03,0xb0,0x05,0x80,0xa2,0x00,0x31,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0a,0x3c,0x02,0xb0,0x06,0x34,0x42,0x80,0x18,
+0x8c,0x43,0x00,0x00,0x3c,0x04,0xf0,0x00,0x3c,0x02,0x80,0x00,0x00,0x64,0x18,0x24,
+0x10,0x62,0x00,0x03,0x24,0x02,0x00,0x09,0x03,0xe0,0x00,0x08,0xac,0xa2,0x00,0x00,
+0x8c,0xa2,0x00,0x40,0x00,0x00,0x00,0x00,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x10,0x60,0x00,0x09,0x3c,0x03,0xb0,0x03,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2c,
+0x8c,0x43,0x00,0x00,0x3c,0x04,0x00,0x02,0x00,0x64,0x18,0x24,0x14,0x60,0xff,0xf2,
+0x24,0x02,0x00,0x10,0x3c,0x03,0xb0,0x03,0x34,0x63,0x02,0x01,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x80,0x10,0x40,0x00,0x0e,0x00,0x00,0x00,0x00,
+0x8c,0xa3,0x00,0x0c,0x00,0x00,0x00,0x00,0xac,0xa3,0x00,0x10,0x3c,0x02,0xb0,0x03,
+0x90,0x42,0x02,0x01,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x0f,0xac,0xa2,0x00,0x0c,
+0x90,0xa3,0x00,0x0f,0x24,0x02,0x00,0x0d,0x3c,0x01,0xb0,0x03,0x08,0x00,0x14,0xb2,
+0xa0,0x23,0x02,0x01,0x3c,0x02,0xb0,0x09,0x34,0x42,0x01,0x80,0x90,0x44,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x04,0x1e,0x00,0x00,0x03,0x1e,0x03,0x10,0x60,0x00,0x15,
+0xa0,0xa4,0x00,0x44,0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x0b,0x24,0x02,0x00,0x02,
+0x10,0x62,0x00,0x03,0x24,0x03,0x00,0x0d,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x8c,0xa2,0x00,0x0c,0xac,0xa3,0x00,0x00,0x24,0x03,0x00,0x04,0xac,0xa2,0x00,0x10,
+0x03,0xe0,0x00,0x08,0xac,0xa3,0x00,0x0c,0x24,0x02,0x00,0x0d,0xac,0xa2,0x00,0x00,
+0x24,0x03,0x00,0x04,0x24,0x02,0x00,0x06,0xac,0xa3,0x00,0x10,0x03,0xe0,0x00,0x08,
+0xac,0xa2,0x00,0x0c,0x8c,0xa3,0x00,0x38,0x24,0x04,0x00,0x01,0x10,0x64,0x00,0x2d,
+0x24,0x02,0x00,0x02,0x10,0x60,0x00,0x19,0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x10,
+0x24,0x02,0x00,0x04,0x10,0x62,0x00,0x04,0x00,0x00,0x00,0x00,0xac,0xa0,0x00,0x38,
+0x03,0xe0,0x00,0x08,0xac,0xa0,0x00,0x00,0x10,0xe4,0x00,0x07,0x24,0x02,0x00,0x03,
+0x80,0xa2,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x02,0x18,0x0b,0xac,0xa3,0x00,0x00,
+0x03,0xe0,0x00,0x08,0xac,0xa0,0x00,0x38,0x08,0x00,0x15,0x04,0xac,0xa2,0x00,0x00,
+0x10,0xe4,0x00,0x02,0x24,0x02,0x00,0x03,0x24,0x02,0x00,0x0c,0xac,0xa2,0x00,0x00,
+0x24,0x02,0x00,0x04,0x03,0xe0,0x00,0x08,0xac,0xa2,0x00,0x38,0x10,0xe4,0x00,0x0e,
+0x3c,0x03,0xb0,0x06,0x34,0x63,0x80,0x24,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0x10,0x40,0x00,0x06,0xac,0xa2,0x00,0x18,0x24,0x02,0x00,0x02,
+0xac,0xa2,0x00,0x00,0xac,0xa0,0x00,0x18,0x08,0x00,0x15,0x0d,0x24,0x02,0x00,0x01,
+0x08,0x00,0x15,0x1a,0xac,0xa0,0x00,0x00,0x24,0x02,0x00,0x03,0x08,0x00,0x15,0x1a,
+0xac,0xa2,0x00,0x00,0x24,0x03,0x00,0x0b,0xac,0xa2,0x00,0x38,0x03,0xe0,0x00,0x08,
+0xac,0xa3,0x00,0x00,0x34,0x63,0x02,0x2e,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x01,0x14,0x40,0xff,0x7d,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x42,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x60,0xff,0x78,0x00,0x00,0x00,0x00,
+0x10,0xc0,0xff,0x81,0x24,0x02,0x00,0x0e,0x08,0x00,0x14,0xa7,0x00,0x00,0x00,0x00,
+0x80,0xa2,0x00,0x30,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x3e,0x24,0x02,0x00,0x04,
+0x08,0x00,0x14,0xb2,0x00,0x00,0x00,0x00,0x84,0xa2,0x00,0x20,0x00,0x00,0x00,0x00,
+0x10,0x40,0xff,0x75,0x24,0x02,0x00,0x06,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2e,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,0x30,0x63,0x00,0xff,
+0x00,0x60,0x10,0x21,0x14,0x40,0xff,0x2b,0xa4,0xa3,0x00,0x20,0x08,0x00,0x14,0xb2,
+0x24,0x02,0x00,0x06,0x8c,0xa2,0x00,0x1c,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0x66,
+0x24,0x02,0x00,0x05,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x2c,0x8c,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0x10,0x40,0xff,0x1b,0xac,0xa2,0x00,0x1c,
+0x08,0x00,0x14,0xb2,0x24,0x02,0x00,0x05,0x3c,0x02,0xb0,0x05,0x8c,0x42,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x02,0x17,0x42,0x30,0x42,0x00,0x01,0x14,0x40,0xff,0x56,
+0x24,0x02,0x00,0x06,0x08,0x00,0x14,0x60,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x0a,
+0x03,0xe0,0x00,0x08,0xac,0x82,0x00,0x00,0x27,0xbd,0xff,0xd8,0xaf,0xb0,0x00,0x10,
+0x27,0x90,0x86,0x58,0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,
+0x0c,0x00,0x29,0xd5,0xaf,0xb1,0x00,0x14,0xaf,0x90,0x8f,0xe0,0x48,0x02,0x00,0x00,
+0x0c,0x00,0x13,0xf0,0x00,0x00,0x00,0x00,0x0c,0x00,0x18,0x1f,0x02,0x00,0x20,0x21,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x3a,0x94,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0xa3,0x83,0x8f,0xe4,0x0c,0x00,0x00,0x34,0x00,0x00,0x00,0x00,0x0c,0x00,0x13,0xfb,
+0x00,0x00,0x00,0x00,0x27,0x84,0x84,0x98,0x0c,0x00,0x27,0x59,0x00,0x00,0x00,0x00,
+0x93,0x84,0x80,0x10,0x0c,0x00,0x21,0x3f,0x00,0x00,0x00,0x00,0x27,0x84,0x89,0x18,
+0x0c,0x00,0x06,0xe5,0x00,0x00,0x00,0x00,0x0c,0x00,0x01,0x39,0x00,0x00,0x00,0x00,
+0x27,0x84,0x84,0x40,0x0c,0x00,0x13,0xd9,0x00,0x00,0x00,0x00,0x27,0x82,0x89,0x4c,
+0xaf,0x82,0x84,0x80,0x0c,0x00,0x00,0x5f,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x34,0x63,0x01,0x08,0x3c,0x04,0xb0,0x09,0x3c,0x05,0xb0,0x09,0x8c,0x66,0x00,0x00,
+0x34,0x84,0x01,0x68,0x34,0xa5,0x01,0x40,0x24,0x02,0xc8,0x80,0x24,0x03,0x00,0x0a,
+0xa4,0x82,0x00,0x00,0xa4,0xa3,0x00,0x00,0x3c,0x04,0xb0,0x03,0x8c,0x82,0x00,0x00,
+0x8f,0x85,0x84,0x40,0xaf,0x86,0x84,0x38,0x34,0x42,0x00,0x20,0xac,0x82,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x58,0x8c,0x43,0x00,0x00,0x2c,0xa4,0x00,0x11,
+0x34,0x63,0x01,0x00,0xac,0x43,0x00,0x00,0x10,0x80,0xff,0xfa,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x01,0x00,0x05,0x10,0x80,0x24,0x63,0x02,0x00,0x00,0x43,0x10,0x21,
+0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,
+0x27,0x84,0x84,0x98,0x0c,0x00,0x26,0x8e,0x00,0x00,0x00,0x00,0x27,0x84,0x84,0x40,
+0x0c,0x00,0x14,0x52,0x00,0x00,0x00,0x00,0x93,0x83,0x81,0xf1,0x24,0x02,0x00,0x01,
+0x10,0x62,0x00,0x08,0x00,0x00,0x00,0x00,0x8f,0x85,0x84,0x40,0x8f,0x82,0x84,0x74,
+0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x01,0xaf,0x82,0x84,0x74,0x08,0x00,0x15,0x9d,
+0x3c,0x02,0xb0,0x03,0x27,0x84,0x84,0x98,0x0c,0x00,0x27,0x0d,0x00,0x00,0x00,0x00,
+0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,0x27,0x84,0x84,0x98,0x0c,0x00,0x28,0xdd,
+0x00,0x00,0x00,0x00,0xa3,0x82,0x84,0x71,0x8f,0x82,0x84,0x74,0xaf,0x80,0x84,0x40,
+0x24,0x42,0x00,0x01,0xaf,0x82,0x84,0x74,0x08,0x00,0x15,0x9c,0x00,0x00,0x28,0x21,
+0x27,0x84,0x86,0x58,0x0c,0x00,0x19,0x5b,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,
+0x14,0x40,0x00,0x05,0x3c,0x03,0xb0,0x05,0xaf,0x80,0x84,0x40,0xaf,0x80,0x84,0x44,
+0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,0x34,0x63,0x04,0x50,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0xaf,0x82,0x84,0x6c,0x14,0x40,0x00,0x20,
+0x24,0x02,0x00,0x01,0x8f,0x84,0x84,0x48,0x00,0x00,0x00,0x00,0x10,0x82,0x00,0x20,
+0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x60,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0xaf,0x82,0x84,0x54,0x14,0x40,0x00,0x15,0x24,0x02,0x00,0x01,
+0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x07,0x00,0x00,0x00,0x00,0x24,0x05,0x00,0x03,
+0x24,0x02,0x00,0x01,0xaf,0x82,0x84,0x44,0xaf,0x85,0x84,0x40,0x08,0x00,0x15,0xb6,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2e,0x90,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,0x30,0x63,0x00,0xff,0x00,0x60,0x10,0x21,
+0xa7,0x83,0x84,0x60,0x14,0x40,0xff,0xf1,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0xaf,0x82,0x84,0x44,0xaf,0x80,0x84,0x40,0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x2c,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0xaf,0x82,0x84,0x5c,0x14,0x40,0xff,0xf5,0x24,0x02,0x00,0x01,
+0x08,0x00,0x15,0xe1,0x3c,0x03,0xb0,0x09,0x27,0x84,0x86,0x58,0x0c,0x00,0x1a,0xd1,
+0x00,0x00,0x00,0x00,0x83,0x82,0x84,0x70,0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xec,
+0x24,0x02,0x00,0x02,0x3c,0x03,0xb0,0x05,0x34,0x63,0x04,0x50,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0xaf,0x82,0x84,0x6c,0x14,0x40,0xff,0xe4,
+0x24,0x02,0x00,0x02,0x8f,0x84,0x84,0x48,0x24,0x02,0x00,0x01,0x10,0x82,0x00,0x12,
+0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x04,0x00,0x00,0x00,0x00,0x24,0x05,0x00,0x04,
+0x08,0x00,0x15,0xed,0x24,0x02,0x00,0x02,0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2e,
+0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x01,0x30,0x63,0x00,0xff,
+0x00,0x60,0x10,0x21,0xa7,0x83,0x84,0x60,0x14,0x40,0xff,0xf4,0x00,0x00,0x00,0x00,
+0x08,0x00,0x15,0xfc,0x24,0x02,0x00,0x02,0x3c,0x03,0xb0,0x05,0x34,0x63,0x02,0x2c,
+0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xff,0xaf,0x82,0x84,0x5c,
+0x14,0x40,0xff,0xf7,0x00,0x00,0x00,0x00,0x08,0x00,0x16,0x1d,0x24,0x02,0x00,0x02,
+0x27,0x84,0x89,0x18,0x0c,0x00,0x0b,0x55,0x00,0x00,0x00,0x00,0x8f,0x83,0x84,0x44,
+0xaf,0x82,0x84,0x5c,0x38,0x64,0x00,0x02,0x00,0x04,0x18,0x0a,0xaf,0x83,0x84,0x44,
+0x14,0x40,0xff,0xad,0x24,0x05,0x00,0x05,0x8f,0x82,0x89,0x58,0xaf,0x80,0x84,0x40,
+0x10,0x40,0x00,0x02,0x24,0x04,0x00,0x01,0xaf,0x84,0x84,0x48,0x93,0x82,0x89,0x66,
+0x00,0x00,0x00,0x00,0x10,0x40,0xff,0x6c,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x05,
+0x34,0x42,0x00,0x08,0x8c,0x43,0x00,0x00,0x3c,0x04,0x20,0x00,0x00,0x64,0x18,0x24,
+0x10,0x60,0xff,0x65,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xa0,
+0x8c,0x43,0x00,0x00,0x3c,0x04,0x80,0x00,0xaf,0x80,0x89,0x40,0x24,0x63,0x00,0x01,
+0xac,0x43,0x00,0x00,0x3c,0x01,0xb0,0x05,0xac,0x24,0x00,0x08,0xaf,0x80,0x89,0x3c,
+0xaf,0x80,0x89,0x44,0xaf,0x80,0x89,0x48,0xaf,0x80,0x89,0x54,0xaf,0x80,0x89,0x4c,
+0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,0x83,0x82,0x84,0x90,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x02,0x24,0x02,0x00,0x20,0xaf,0x82,0x84,0x5c,0x8f,0x85,0x84,0x5c,
+0x27,0x84,0x89,0x18,0x0c,0x00,0x0d,0x30,0x00,0x00,0x00,0x00,0x00,0x02,0x1e,0x00,
+0xa3,0x82,0x84,0x70,0xaf,0x80,0x84,0x5c,0x10,0x60,0xff,0x8e,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x05,0x34,0x42,0x02,0x2e,0x90,0x43,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x63,0x00,0x01,0x30,0x63,0x00,0xff,0x00,0x60,0x10,0x21,0xa7,0x83,0x84,0x60,
+0x10,0x40,0x00,0x04,0x24,0x04,0x00,0x02,0xaf,0x84,0x84,0x48,0x08,0x00,0x15,0xfd,
+0x00,0x00,0x00,0x00,0x08,0x00,0x15,0xee,0x24,0x05,0x00,0x06,0x27,0x84,0x84,0x40,
+0x27,0x85,0x89,0x18,0x0c,0x00,0x0d,0xfd,0x00,0x00,0x00,0x00,0x8f,0x82,0x84,0x64,
+0xaf,0x80,0x84,0x6c,0x14,0x40,0x00,0x19,0x00,0x40,0x18,0x21,0x8f,0x82,0x84,0x68,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x15,0x24,0x02,0x00,0x02,0x8f,0x83,0x84,0x48,
+0x00,0x00,0x00,0x00,0x10,0x62,0x00,0x0b,0x3c,0x02,0x40,0x00,0x8f,0x83,0x84,0x44,
+0x24,0x02,0x00,0x01,0x10,0x62,0x00,0x02,0x24,0x05,0x00,0x03,0x24,0x05,0x00,0x06,
+0xaf,0x85,0x84,0x40,0x24,0x04,0x00,0x03,0xaf,0x84,0x84,0x48,0x08,0x00,0x15,0xb6,
+0x00,0x00,0x00,0x00,0x34,0x42,0x00,0x14,0x3c,0x01,0xb0,0x05,0xac,0x22,0x00,0x00,
+0xaf,0x80,0x84,0x40,0x08,0x00,0x16,0x96,0x24,0x04,0x00,0x03,0x10,0x60,0x00,0x10,
+0x00,0x00,0x00,0x00,0x27,0x85,0x89,0x18,0x27,0x84,0x84,0x40,0x0c,0x00,0x0e,0x21,
+0x00,0x00,0x00,0x00,0x8f,0x83,0x84,0x44,0x24,0x02,0x00,0x01,0xa3,0x80,0x84,0x70,
+0xaf,0x80,0x84,0x48,0x10,0x62,0x00,0x02,0x24,0x05,0x00,0x03,0x24,0x05,0x00,0x04,
+0xaf,0x85,0x84,0x40,0xaf,0x80,0x84,0x64,0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,
+0x83,0x82,0x84,0x90,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x04,0x00,0x00,0x00,0x00,
+0x27,0x84,0x89,0x18,0x0c,0x00,0x10,0x69,0x00,0x00,0x00,0x00,0x8f,0x82,0x84,0x44,
+0xa3,0x80,0x84,0x70,0xaf,0x80,0x84,0x40,0xaf,0x80,0x84,0x48,0x14,0x40,0x00,0x03,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0xaf,0x82,0x84,0x44,0xaf,0x80,0x84,0x68,
+0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,0x27,0x84,0x84,0x40,0x27,0x85,0x89,0x18,
+0x0c,0x00,0x0e,0x21,0x00,0x00,0x00,0x00,0x8f,0x82,0x84,0x44,0xa3,0x80,0x84,0x70,
+0xaf,0x80,0x84,0x40,0xaf,0x80,0x84,0x48,0x14,0x40,0xfe,0xeb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x02,0xaf,0x82,0x84,0x44,0x08,0x00,0x15,0xb6,0x00,0x00,0x00,0x00,
+0x27,0x84,0x89,0x18,0x0c,0x00,0x10,0x69,0x00,0x00,0x00,0x00,0x08,0x00,0x16,0xc6,
+0x00,0x00,0x00,0x00,0x27,0x84,0x84,0x98,0x0c,0x00,0x29,0x73,0x00,0x00,0x00,0x00,
+0x08,0x00,0x15,0xc5,0x00,0x00,0x00,0x00,0x0c,0x00,0x24,0x05,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x26,0xff,0x00,0x00,0x00,0x00,0x0c,0x00,0x18,0x11,0x00,0x00,0x00,0x00,
+0x93,0x83,0xbc,0x18,0x00,0x00,0x00,0x00,0x14,0x60,0x00,0x2b,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x01,0x08,0x8c,0x44,0x00,0x00,0x8f,0x83,0xbc,0x10,0x8f,0x82,0xbc,0x14,
+0x00,0x83,0x18,0x23,0x00,0x43,0x10,0x2b,0x10,0x40,0x00,0x23,0x3c,0x02,0xb0,0x03,
+0x24,0x04,0x05,0xa0,0x34,0x42,0x01,0x18,0x8c,0x42,0x00,0x00,0x0c,0x00,0x06,0xd1,
+0x00,0x00,0x00,0x00,0x24,0x04,0x05,0xa4,0x0c,0x00,0x06,0xd1,0x00,0x02,0x84,0x02,
+0x30,0x51,0xff,0xff,0x24,0x04,0x05,0xa8,0x00,0x02,0x94,0x02,0x0c,0x00,0x06,0xd1,
+0x3a,0x10,0xff,0xff,0x3a,0x31,0xff,0xff,0x30,0x42,0xff,0xff,0x2e,0x10,0x00,0x01,
+0x2e,0x31,0x00,0x01,0x3a,0x52,0xff,0xff,0x02,0x11,0x80,0x25,0x2e,0x52,0x00,0x01,
+0x38,0x42,0xff,0xff,0x02,0x12,0x80,0x25,0x2c,0x42,0x00,0x01,0x02,0x02,0x80,0x25,
+0x16,0x00,0x00,0x02,0x24,0x04,0x00,0x02,0x00,0x00,0x20,0x21,0x0c,0x00,0x05,0x6e,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x08,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0xaf,0x83,0xbc,0x10,0x0c,0x00,0x01,0xe9,0x00,0x00,0x00,0x00,
+0xaf,0x80,0x84,0x40,0xaf,0x80,0x84,0x74,0x08,0x00,0x15,0x9c,0x00,0x00,0x28,0x21,
+0x27,0x90,0xb4,0x00,0x24,0x11,0x00,0x12,0x8e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+0x90,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x03,0x00,0x00,0x00,0x00,
+0x0c,0x00,0x18,0xd0,0x00,0x00,0x00,0x00,0x26,0x31,0xff,0xff,0x06,0x21,0xff,0xf6,
+0x26,0x10,0x00,0x04,0xaf,0x80,0x84,0x40,0x08,0x00,0x15,0xb7,0x00,0x00,0x28,0x21,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x08,0x8c,0x44,0x00,0x00,0x8f,0x82,0x84,0x38,
+0x00,0x04,0x19,0xc2,0x00,0x02,0x11,0xc2,0x10,0x62,0xff,0xf6,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x01,0x02,0x90,0x43,0x00,0x00,0x3c,0x12,0xb0,0x05,
+0xaf,0x84,0x84,0x38,0x30,0x63,0x00,0xff,0x00,0x03,0x11,0x40,0x00,0x43,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x00,0x02,0x99,0x00,0x00,0x00,0x88,0x21,
+0x36,0x52,0x02,0x2c,0x27,0x90,0xb4,0x00,0x8e,0x04,0x00,0x00,0x00,0x00,0x00,0x00,
+0x90,0x83,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x62,0x00,0x03,0x10,0x40,0x00,0x06,
+0x30,0x62,0x00,0x1c,0x14,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0x8f,0x85,0x84,0x38,
+0x0c,0x00,0x1e,0x94,0x02,0x60,0x30,0x21,0x8e,0x42,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0xff,0x14,0x40,0xff,0xd7,0x00,0x00,0x00,0x00,0x26,0x31,0x00,0x01,
+0x2a,0x22,0x00,0x13,0x14,0x40,0xff,0xec,0x26,0x10,0x00,0x04,0x08,0x00,0x17,0x21,
+0x00,0x00,0x00,0x00,0x8f,0x84,0x84,0x4c,0x27,0x85,0x89,0x18,0x0c,0x00,0x17,0xa4,
+0x00,0x00,0x00,0x00,0x8f,0x83,0x84,0x4c,0x24,0x02,0x00,0x04,0x14,0x62,0xfe,0xa5,
+0x00,0x00,0x00,0x00,0x08,0x00,0x15,0xee,0x24,0x05,0x00,0x05,0x3c,0x02,0xb0,0x03,
+0x34,0x42,0x00,0x3f,0x90,0x44,0x00,0x00,0x24,0x03,0x00,0x01,0x10,0x64,0x00,0x08,
+0x00,0x00,0x00,0x00,0x27,0x84,0x89,0x18,0x0c,0x00,0x24,0x2c,0x00,0x00,0x00,0x00,
+0x24,0x05,0x00,0x05,0xaf,0x85,0x84,0x40,0x08,0x00,0x15,0xb7,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x14,0x8c,0x44,0x00,0x00,0x0c,0x00,0x24,0x49,
+0x00,0x00,0x00,0x00,0x08,0x00,0x17,0x65,0x24,0x05,0x00,0x05,0x8f,0x82,0x89,0x4c,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0d,0x00,0x00,0x00,0x00,0x8f,0x84,0xb4,0x40,
+0xaf,0x80,0x89,0x4c,0x94,0x85,0x00,0x14,0x0c,0x00,0x1b,0x66,0x00,0x00,0x00,0x00,
+0x93,0x82,0x8b,0x71,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x02,0x10,0x40,0x00,0x03,
+0x00,0x00,0x00,0x00,0x0c,0x00,0x01,0x57,0x00,0x00,0x20,0x21,0x8f,0x84,0xb4,0x40,
+0x0c,0x00,0x18,0xd0,0x00,0x00,0x00,0x00,0x08,0x00,0x17,0x21,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xff,0x90,0x27,0xbd,0xff,0xe8,0x00,0x80,0x18,0x21,0x34,0x42,0x00,0x01,
+0x27,0x84,0x89,0x18,0x10,0x62,0x00,0x05,0xaf,0xbf,0x00,0x10,0x8f,0xbf,0x00,0x10,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x06,0xe5,
+0x00,0x00,0x00,0x00,0x27,0x84,0x86,0x58,0x0c,0x00,0x18,0x1f,0x00,0x00,0x00,0x00,
+0x27,0x84,0x84,0x40,0x0c,0x00,0x13,0xd9,0x00,0x00,0x00,0x00,0x08,0x00,0x17,0x8b,
+0x00,0x00,0x00,0x00,0x8f,0x82,0x89,0x58,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x05,
+0x00,0x00,0x18,0x21,0x8f,0x82,0x84,0x48,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x02,
+0x00,0x00,0x00,0x00,0x24,0x03,0x00,0x01,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,
+0x27,0xbd,0xff,0xe0,0x3c,0x06,0xb0,0x03,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,
+0x34,0xc6,0x00,0x5f,0xaf,0xbf,0x00,0x18,0x90,0xc3,0x00,0x00,0x3c,0x07,0xb0,0x03,
+0x34,0xe7,0x00,0x5d,0x34,0x63,0x00,0x01,0x3c,0x09,0xb0,0x03,0x24,0x02,0x00,0x01,
+0xa0,0xc3,0x00,0x00,0x00,0x80,0x80,0x21,0xa0,0xe2,0x00,0x00,0x00,0xa0,0x88,0x21,
+0x35,0x29,0x00,0x5e,0x00,0xe0,0x40,0x21,0x24,0x04,0x00,0x01,0x91,0x22,0x00,0x00,
+0x91,0x03,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x83,0x00,0x03,0x30,0x42,0x00,0x01,
+0x14,0x40,0xff,0xfa,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x04,0x12,0x02,0x00,0x2c,
+0x24,0x05,0x0f,0x00,0x24,0x02,0x00,0x06,0x12,0x02,0x00,0x08,0x24,0x05,0x00,0x0f,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x02,0x00,0xa0,0x50,0x00,0x00,0x8f,0xbf,0x00,0x18,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x24,0x04,0x0c,0x04,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x0f,0x24,0x04,0x0d,0x04,0x24,0x05,0x00,0x0f,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x0f,0x24,0x04,0x08,0x80,0x24,0x05,0x1e,0x00,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x0f,0x24,0x04,0x08,0x8c,0x24,0x05,0x0f,0x00,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x0f,0x24,0x04,0x08,0x24,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x02,0x24,0x04,0x08,0x2c,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x02,0x24,0x04,0x08,0x34,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x02,0x24,0x04,0x08,0x3c,0x3c,0x05,0x00,0x30,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x02,0x08,0x00,0x17,0xc5,0x3c,0x02,0xb0,0x03,
+0x24,0x04,0x08,0x8c,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x04,0x24,0x04,0x08,0x80,
+0x24,0x05,0x1e,0x00,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x04,0x24,0x04,0x0c,0x04,
+0x24,0x05,0x00,0x0f,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x04,0x24,0x04,0x0d,0x04,
+0x24,0x05,0x00,0x0f,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x04,0x24,0x04,0x08,0x24,
+0x3c,0x05,0x00,0x30,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x03,0x24,0x04,0x08,0x2c,
+0x3c,0x05,0x00,0x30,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x03,0x24,0x04,0x08,0x34,
+0x3c,0x05,0x00,0x30,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x02,0x3c,0x05,0x00,0x30,
+0x24,0x06,0x00,0x03,0x0c,0x00,0x13,0x5f,0x24,0x04,0x08,0x3c,0x02,0x20,0x20,0x21,
+0x24,0x05,0x00,0x14,0x0c,0x00,0x13,0xa4,0x24,0x06,0x01,0x07,0x08,0x00,0x17,0xc5,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x73,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x02,0x14,0x40,0x00,0x04,0x00,0x00,0x00,0x00,
+0xa3,0x80,0x81,0x58,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0xa3,0x82,0x81,0x58,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x00,0x80,0x70,0x21,0x34,0x63,0x00,0x20,0x24,0x42,0x60,0x7c,
+0x3c,0x04,0xb0,0x03,0xac,0x62,0x00,0x00,0x34,0x84,0x00,0x30,0xad,0xc0,0x02,0xb8,
+0x8c,0x83,0x00,0x00,0x24,0x02,0x00,0xff,0xa5,0xc0,0x00,0x0a,0x00,0x00,0x30,0x21,
+0xa7,0x82,0x8f,0xf0,0x27,0x88,0x90,0x00,0xa5,0xc3,0x00,0x08,0x3c,0x07,0xb0,0x08,
+0x30,0xc2,0xff,0xff,0x00,0x02,0x20,0xc0,0x24,0xc3,0x00,0x01,0x00,0x82,0x10,0x21,
+0x00,0x60,0x30,0x21,0x00,0x02,0x10,0x80,0x30,0x63,0xff,0xff,0x00,0x48,0x10,0x21,
+0x00,0x87,0x20,0x21,0x28,0xc5,0x00,0xff,0xac,0x83,0x00,0x00,0x14,0xa0,0xff,0xf4,
+0xa4,0x43,0x00,0x00,0x3c,0x02,0xb0,0x08,0x34,0x03,0xff,0xff,0x25,0xc4,0x00,0x0c,
+0x24,0x0a,0x00,0x02,0x34,0x42,0x07,0xf8,0x3c,0x06,0xb0,0x03,0xa7,0x83,0xb3,0xdc,
+0xac,0x43,0x00,0x00,0xaf,0x84,0xb4,0x00,0x34,0xc6,0x00,0x64,0xa0,0x8a,0x00,0x18,
+0x94,0xc5,0x00,0x00,0x8f,0x82,0xb4,0x00,0x25,0xc4,0x00,0x30,0x24,0x08,0x00,0x03,
+0x3c,0x03,0xb0,0x03,0xa0,0x45,0x00,0x21,0x34,0x63,0x00,0x66,0xaf,0x84,0xb4,0x04,
+0xa0,0x88,0x00,0x18,0x94,0x65,0x00,0x00,0x8f,0x82,0xb4,0x04,0x25,0xc4,0x00,0x54,
+0x25,0xc7,0x00,0x78,0xa0,0x45,0x00,0x21,0xaf,0x84,0xb4,0x08,0xa0,0x88,0x00,0x18,
+0x94,0x65,0x00,0x00,0x8f,0x82,0xb4,0x08,0x25,0xc8,0x00,0x9c,0x24,0x09,0x00,0x01,
+0xa0,0x45,0x00,0x21,0xaf,0x87,0xb4,0x0c,0xa0,0xea,0x00,0x18,0x94,0xc4,0x00,0x00,
+0x8f,0x82,0xb4,0x0c,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x62,0xa0,0x44,0x00,0x21,
+0xaf,0x88,0xb4,0x10,0xa1,0x09,0x00,0x18,0x94,0x65,0x00,0x00,0x8f,0x82,0xb4,0x10,
+0x25,0xc4,0x00,0xc0,0x3c,0x06,0xb0,0x03,0xa0,0x45,0x00,0x21,0xaf,0x84,0xb4,0x14,
+0xa0,0x89,0x00,0x18,0x94,0x65,0x00,0x00,0x8f,0x82,0xb4,0x14,0x25,0xc4,0x00,0xe4,
+0x34,0xc6,0x00,0x60,0xa0,0x45,0x00,0x21,0xaf,0x84,0xb4,0x18,0xa0,0x80,0x00,0x18,
+0x94,0xc5,0x00,0x00,0x8f,0x82,0xb4,0x18,0x25,0xc3,0x01,0x08,0x25,0xc7,0x01,0x2c,
+0xa0,0x45,0x00,0x21,0xaf,0x83,0xb4,0x1c,0xa0,0x60,0x00,0x18,0x94,0xc8,0x00,0x00,
+0x8f,0x82,0xb4,0x1c,0x25,0xc4,0x01,0x50,0x25,0xc5,0x01,0x74,0xa0,0x48,0x00,0x21,
+0x25,0xc6,0x01,0x98,0x25,0xc9,0x01,0xbc,0x25,0xca,0x01,0xe0,0x25,0xcb,0x02,0x04,
+0x25,0xcc,0x02,0x28,0x25,0xcd,0x02,0x4c,0x24,0x02,0x00,0x10,0x3c,0x03,0xb0,0x03,
+0xaf,0x87,0xb4,0x20,0x34,0x63,0x00,0x38,0xa0,0xe0,0x00,0x18,0xaf,0x84,0xb4,0x24,
+0xa0,0x80,0x00,0x18,0xaf,0x85,0xb4,0x28,0xa0,0xa0,0x00,0x18,0xaf,0x86,0xb4,0x2c,
+0xa0,0xc0,0x00,0x18,0xaf,0x89,0xb4,0x30,0xa1,0x20,0x00,0x18,0xaf,0x8a,0xb4,0x34,
+0xa1,0x40,0x00,0x18,0xaf,0x8b,0xb4,0x38,0xa1,0x60,0x00,0x18,0xaf,0x8c,0xb4,0x3c,
+0xa1,0x80,0x00,0x18,0xaf,0x8d,0xb4,0x40,0xa1,0xa2,0x00,0x18,0x94,0x64,0x00,0x00,
+0x8f,0x82,0xb4,0x40,0x25,0xc5,0x02,0x70,0x3c,0x03,0xb0,0x03,0xa0,0x44,0x00,0x21,
+0x24,0x02,0x00,0x11,0xaf,0x85,0xb4,0x44,0x34,0x63,0x00,0x6e,0xa0,0xa2,0x00,0x18,
+0x94,0x64,0x00,0x00,0x8f,0x82,0xb4,0x44,0x25,0xc5,0x02,0x94,0x3c,0x03,0xb0,0x03,
+0xa0,0x44,0x00,0x21,0x24,0x02,0x00,0x12,0xaf,0x85,0xb4,0x48,0x34,0x63,0x00,0x6c,
+0xa0,0xa2,0x00,0x18,0x94,0x64,0x00,0x00,0x8f,0x82,0xb4,0x48,0x24,0x05,0xff,0xff,
+0x24,0x07,0x00,0x01,0xa0,0x44,0x00,0x21,0x24,0x06,0x00,0x12,0x27,0x84,0xb4,0x00,
+0x8c,0x82,0x00,0x00,0x24,0xc6,0xff,0xff,0xa0,0x40,0x00,0x04,0x8c,0x83,0x00,0x00,
+0xa4,0x45,0x00,0x00,0xa4,0x45,0x00,0x02,0xa0,0x60,0x00,0x0a,0x8c,0x82,0x00,0x00,
+0xa4,0x65,0x00,0x06,0xa4,0x65,0x00,0x08,0xa0,0x40,0x00,0x10,0x8c,0x83,0x00,0x00,
+0xa4,0x45,0x00,0x0c,0xa4,0x45,0x00,0x0e,0xa0,0x60,0x00,0x12,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0xa0,0x40,0x00,0x16,0x8c,0x83,0x00,0x00,0xa4,0x45,0x00,0x14,
+0xa0,0x67,0x00,0x17,0x8c,0x82,0x00,0x00,0x24,0x84,0x00,0x04,0xa0,0x40,0x00,0x20,
+0x04,0xc1,0xff,0xe7,0xac,0x40,0x00,0x1c,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x00,0x34,0x42,0x00,0x20,0x24,0x63,0x63,0x40,
+0xac,0x43,0x00,0x00,0x90,0x82,0x00,0x10,0x00,0x80,0x60,0x21,0x10,0x40,0x00,0x56,
+0x00,0x00,0x70,0x21,0x97,0x82,0x8f,0xf0,0x94,0x8a,0x00,0x0c,0x27,0x87,0x90,0x00,
+0x00,0x02,0x40,0xc0,0x01,0x02,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x47,0x10,0x21,
+0x90,0x8b,0x00,0x18,0xa4,0x4a,0x00,0x00,0x94,0x83,0x00,0x0e,0x39,0x64,0x00,0x10,
+0x2c,0x84,0x00,0x01,0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x34,0x85,0x00,0x02,
+0x39,0x63,0x00,0x11,0x00,0x83,0x28,0x0b,0x34,0xa3,0x00,0x08,0x39,0x64,0x00,0x12,
+0x00,0x02,0x10,0x80,0x00,0xa4,0x18,0x0b,0x00,0x47,0x10,0x21,0x94,0x49,0x00,0x04,
+0x34,0x64,0x00,0x20,0x00,0x6b,0x20,0x0b,0x34,0x83,0x00,0x40,0x39,0x62,0x00,0x01,
+0x00,0x82,0x18,0x0b,0x00,0x09,0x30,0xc0,0x34,0x64,0x00,0x80,0x00,0xc9,0x28,0x21,
+0x39,0x62,0x00,0x02,0x00,0x60,0x68,0x21,0x00,0x82,0x68,0x0a,0x00,0x05,0x28,0x80,
+0x3c,0x02,0xb0,0x08,0x00,0xa7,0x28,0x21,0x00,0xc2,0x30,0x21,0x01,0x02,0x40,0x21,
+0x34,0x03,0xff,0xff,0x35,0xa4,0x01,0x00,0x39,0x62,0x00,0x03,0x2d,0x67,0x00,0x13,
+0xad,0x0a,0x00,0x00,0xa4,0xa3,0x00,0x00,0xac,0xc3,0x00,0x00,0xa7,0x89,0x8f,0xf0,
+0x10,0xe0,0x00,0x0f,0x00,0x82,0x68,0x0a,0x3c,0x03,0x80,0x01,0x00,0x0b,0x10,0x80,
+0x24,0x63,0x02,0x44,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x60,
+0x94,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x14,0x00,0x00,0x02,0x74,0x03,
+0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x3a,0x94,0x44,0x00,0x00,0x93,0x83,0x8f,0xe4,
+0x91,0x82,0x00,0x21,0x01,0xc4,0x20,0x21,0x91,0x85,0x00,0x10,0x00,0x04,0x24,0x00,
+0x00,0x62,0x18,0x21,0x00,0x04,0x74,0x03,0x00,0x6e,0x18,0x23,0x00,0x65,0x10,0x2a,
+0x00,0xa2,0x18,0x0a,0x00,0x0d,0x24,0x00,0x3c,0x02,0xb0,0x06,0x24,0x05,0xff,0xff,
+0x00,0x64,0x18,0x25,0x34,0x42,0x80,0x20,0xac,0x43,0x00,0x00,0xa5,0x85,0x00,0x0e,
+0xa1,0x80,0x00,0x10,0xa5,0x85,0x00,0x0c,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x03,0x08,0x00,0x19,0x14,0x34,0x63,0x00,0x62,0x3c,0x03,0xb0,0x03,
+0x08,0x00,0x19,0x14,0x34,0x63,0x00,0x64,0x3c,0x03,0xb0,0x03,0x08,0x00,0x19,0x14,
+0x34,0x63,0x00,0x66,0x3c,0x03,0xb0,0x03,0x08,0x00,0x19,0x14,0x34,0x63,0x00,0x38,
+0x3c,0x03,0xb0,0x03,0x08,0x00,0x19,0x14,0x34,0x63,0x00,0x6e,0x3c,0x03,0xb0,0x03,
+0x08,0x00,0x19,0x14,0x34,0x63,0x00,0x6c,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x65,0x08,0x00,0x05,0x28,0x40,0xac,0x62,0x00,0x00,
+0x00,0xa6,0x28,0x21,0x2c,0xe2,0x00,0x10,0x14,0x80,0x00,0x06,0x00,0x00,0x18,0x21,
+0x10,0x40,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0xe0,0x18,0x21,0x03,0xe0,0x00,0x08,
+0x00,0x60,0x10,0x21,0x24,0x02,0x00,0x20,0x10,0xe2,0x00,0x06,0x2c,0xe4,0x00,0x10,
+0x24,0xa2,0x00,0x01,0x10,0x80,0xff,0xf9,0x00,0x02,0x11,0x00,0x08,0x00,0x19,0x4f,
+0x00,0x47,0x18,0x21,0x08,0x00,0x19,0x4f,0x24,0xa3,0x00,0x50,0x27,0xbd,0xff,0xc8,
+0xaf,0xb3,0x00,0x1c,0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x30,
+0xaf,0xb7,0x00,0x2c,0xaf,0xb6,0x00,0x28,0xaf,0xb5,0x00,0x24,0xaf,0xb4,0x00,0x20,
+0xaf,0xb0,0x00,0x10,0x00,0x80,0x88,0x21,0x84,0x84,0x00,0x08,0x3c,0x05,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x34,0xa5,0x00,0x20,0x24,0x42,0x65,0x6c,0x3c,0x03,0xb0,0x06,
+0x00,0x04,0x20,0x80,0xac,0xa2,0x00,0x00,0x00,0x83,0x20,0x21,0x3c,0x06,0xb0,0x06,
+0x8c,0x82,0x00,0x00,0x34,0xc6,0x80,0x24,0x8c,0x88,0x00,0x00,0x8c,0xc4,0x00,0x00,
+0x96,0x25,0x00,0x08,0x30,0x52,0xff,0xff,0x00,0x08,0x44,0x02,0x34,0x84,0x01,0x00,
+0x3c,0x02,0xb0,0x00,0x00,0x08,0x18,0xc0,0x00,0x12,0x3a,0x00,0xac,0xc4,0x00,0x00,
+0x00,0xe2,0x38,0x21,0xae,0x32,0x02,0xb8,0x00,0x68,0x18,0x21,0x24,0xa5,0x00,0x02,
+0x8c,0xf6,0x00,0x00,0x30,0xa5,0x01,0xff,0x8c,0xf4,0x00,0x04,0x27,0x86,0x90,0x00,
+0x00,0x03,0x18,0x80,0x00,0x12,0x98,0xc0,0xa6,0x25,0x00,0x08,0x00,0x66,0x18,0x21,
+0x02,0x72,0x10,0x21,0x94,0x65,0x00,0x00,0x00,0x02,0x48,0x80,0x01,0x26,0x30,0x21,
+0x24,0x02,0xff,0xff,0x00,0x14,0x1a,0x02,0x27,0x84,0x90,0x10,0xa4,0xc2,0x00,0x02,
+0x30,0x63,0x00,0x1f,0x24,0x02,0x00,0x10,0x01,0x24,0x20,0x21,0xa4,0xc8,0x00,0x04,
+0x8c,0xf0,0x00,0x08,0xa6,0x23,0x00,0x06,0xa6,0x25,0x00,0x0a,0xa0,0x82,0x00,0x06,
+0x86,0x25,0x00,0x06,0x27,0x82,0x90,0x04,0x01,0x22,0x10,0x21,0x24,0x03,0x00,0x13,
+0x10,0xa3,0x00,0xee,0xac,0x47,0x00,0x18,0x3c,0x03,0xb0,0x03,0x34,0x63,0x01,0x00,
+0xa6,0x20,0x00,0x02,0x3c,0x02,0xb0,0x03,0x90,0x64,0x00,0x00,0x34,0x42,0x01,0x08,
+0x8c,0x45,0x00,0x00,0x00,0x10,0x1b,0xc2,0x00,0x04,0x20,0x82,0x30,0x63,0x00,0x01,
+0xac,0xc5,0x00,0x08,0x10,0x60,0x00,0xc7,0x30,0x97,0x00,0x01,0x00,0x10,0x16,0x82,
+0x30,0x46,0x00,0x01,0x00,0x10,0x12,0x02,0x00,0x10,0x19,0xc2,0x00,0x10,0x26,0x02,
+0x00,0x10,0x2e,0x42,0x30,0x48,0x00,0x7f,0x24,0x02,0x00,0x01,0x30,0x75,0x00,0x01,
+0x30,0x84,0x00,0x01,0x10,0xc2,0x00,0xb3,0x30,0xa3,0x00,0x01,0x00,0x60,0x28,0x21,
+0x0c,0x00,0x19,0x42,0x01,0x00,0x38,0x21,0x02,0x72,0x18,0x21,0x00,0x03,0x18,0x80,
+0x2c,0x46,0x00,0x54,0x27,0x85,0x90,0x10,0x27,0x84,0x90,0x08,0x00,0x06,0x10,0x0a,
+0x00,0x65,0x28,0x21,0x26,0xa6,0x00,0x02,0x00,0x64,0x18,0x21,0xa0,0xa2,0x00,0x02,
+0xa0,0x66,0x00,0x06,0xa0,0x62,0x00,0x07,0xa0,0xa2,0x00,0x01,0x02,0x72,0x28,0x21,
+0x00,0x05,0x28,0x80,0x27,0x82,0x90,0x04,0x00,0xa2,0x58,0x21,0x8d,0x64,0x00,0x18,
+0x00,0x10,0x15,0xc2,0x30,0x42,0x00,0x01,0x8c,0x83,0x00,0x0c,0x27,0x84,0x90,0x20,
+0x00,0xa4,0x48,0x21,0xa6,0x22,0x00,0x00,0xa6,0x36,0x00,0x04,0x8d,0x26,0x00,0x00,
+0x00,0x03,0x19,0x42,0x3c,0x02,0xff,0xef,0x34,0x42,0xff,0xff,0x30,0x63,0x00,0x01,
+0x00,0xc2,0x40,0x24,0x00,0x03,0x1d,0x00,0x01,0x03,0x40,0x25,0x00,0x08,0x15,0x02,
+0x00,0x14,0x19,0x82,0x00,0x14,0x25,0x82,0x00,0x10,0x34,0x42,0x00,0x10,0x3c,0x82,
+0x00,0x10,0x2c,0x02,0x30,0x42,0x00,0x01,0x30,0xcd,0x00,0x01,0x30,0x6c,0x00,0x01,
+0x30,0xe6,0x00,0x01,0x30,0x8a,0x00,0x03,0x32,0x94,0x00,0x07,0x30,0xa5,0x00,0x01,
+0xad,0x28,0x00,0x00,0x10,0x40,0x00,0x0b,0x32,0x07,0x00,0x7f,0x8d,0x64,0x00,0x18,
+0x3c,0x03,0xff,0xf0,0x34,0x63,0xff,0xff,0x8c,0x82,0x00,0x0c,0x01,0x03,0x18,0x24,
+0x00,0x02,0x13,0x82,0x30,0x42,0x00,0x0f,0x00,0x02,0x14,0x00,0x00,0x62,0x18,0x25,
+0xad,0x23,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xc2,0x00,0x6a,0x00,0x00,0x00,0x00,
+0x15,0x80,0x00,0x03,0x00,0x00,0x00,0x00,0x15,0x40,0x00,0x5b,0x24,0x02,0x00,0x01,
+0x96,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x04,0xa6,0x22,0x00,0x04,
+0x00,0xa0,0x20,0x21,0x0c,0x00,0x19,0x42,0x01,0xa0,0x28,0x21,0x02,0x72,0x18,0x21,
+0x00,0x03,0x40,0x80,0x2c,0x45,0x00,0x54,0x27,0x84,0x90,0x10,0x01,0x04,0x20,0x21,
+0x00,0x05,0x10,0x0a,0xa0,0x82,0x00,0x00,0xa0,0x80,0x00,0x04,0xa0,0x80,0x00,0x05,
+0x96,0x23,0x00,0x04,0x27,0x82,0x90,0x00,0x01,0x02,0x10,0x21,0xa4,0x43,0x00,0x06,
+0x27,0x82,0x90,0x04,0x92,0x26,0x00,0x01,0x01,0x02,0x10,0x21,0x8c,0x45,0x00,0x18,
+0x27,0x83,0x90,0x20,0x01,0x03,0x18,0x21,0xa0,0x60,0x00,0x00,0xa0,0x86,0x00,0x07,
+0x94,0xa2,0x00,0x10,0x24,0x03,0x00,0x04,0x30,0x42,0x00,0x0f,0x10,0x43,0x00,0x36,
+0x24,0xa5,0x00,0x10,0x94,0xa3,0x00,0x16,0x27,0x87,0x90,0x18,0x01,0x07,0x10,0x21,
+0xa4,0x43,0x00,0x02,0x94,0xa2,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,
+0x14,0x40,0x00,0x24,0x02,0x72,0x20,0x21,0x94,0xa2,0x00,0x00,0x24,0x03,0x00,0xa4,
+0x30,0x42,0x00,0xff,0x10,0x43,0x00,0x1f,0x00,0x00,0x00,0x00,0x94,0xa2,0x00,0x00,
+0x24,0x03,0x00,0x88,0x30,0x42,0x00,0x88,0x10,0x43,0x00,0x14,0x02,0x72,0x18,0x21,
+0x27,0x84,0x90,0x20,0x00,0x03,0x18,0x80,0x00,0x64,0x18,0x21,0x8c,0x62,0x00,0x00,
+0x3c,0x04,0x00,0x80,0x00,0x44,0x10,0x25,0xac,0x62,0x00,0x00,0x02,0x72,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x47,0x10,0x21,0xa0,0x54,0x00,0x00,0x8f,0xbf,0x00,0x30,
+0x7b,0xb6,0x01,0x7c,0x7b,0xb4,0x01,0x3c,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,
+0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0x94,0xa2,0x00,0x18,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x60,0x10,0x40,0xff,0xe9,0x02,0x72,0x18,0x21,
+0x02,0x72,0x20,0x21,0x27,0x82,0x90,0x20,0x00,0x04,0x20,0x80,0x00,0x82,0x20,0x21,
+0x8c,0x83,0x00,0x00,0x3c,0x02,0xff,0x7f,0x34,0x42,0xff,0xff,0x00,0x62,0x18,0x24,
+0x08,0x00,0x1a,0x37,0xac,0x83,0x00,0x00,0x27,0x87,0x90,0x18,0x01,0x07,0x10,0x21,
+0x08,0x00,0x1a,0x21,0xa4,0x40,0x00,0x02,0x11,0x42,0x00,0x07,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x02,0x14,0x40,0xff,0xa7,0x00,0xa0,0x20,0x21,0x96,0x22,0x00,0x04,
+0x08,0x00,0x19,0xff,0x24,0x42,0x00,0x0c,0x96,0x22,0x00,0x04,0x08,0x00,0x19,0xff,
+0x24,0x42,0x00,0x08,0x16,0xe6,0xff,0x96,0x3c,0x02,0xff,0xfb,0x8d,0x63,0x00,0x18,
+0x34,0x42,0xff,0xff,0x02,0x02,0x10,0x24,0xac,0x62,0x00,0x08,0x08,0x00,0x19,0xf8,
+0x00,0x00,0x30,0x21,0x16,0xe6,0xff,0x4e,0x00,0x60,0x28,0x21,0x3c,0x02,0xfb,0xff,
+0x34,0x42,0xff,0xff,0x02,0x02,0x10,0x24,0xac,0xe2,0x00,0x08,0x08,0x00,0x19,0xb7,
+0x00,0x00,0x30,0x21,0x93,0x87,0xbb,0x14,0x00,0x10,0x1e,0x42,0x00,0x10,0x26,0x82,
+0x27,0x82,0x90,0x08,0x2c,0xe5,0x00,0x0c,0x01,0x22,0x48,0x21,0x30,0x63,0x00,0x01,
+0x30,0x86,0x00,0x01,0x14,0xa0,0x00,0x06,0x00,0xe0,0x40,0x21,0x00,0x03,0x10,0x40,
+0x00,0x46,0x10,0x21,0x00,0x02,0x11,0x00,0x00,0xe2,0x10,0x21,0x24,0x48,0x00,0x04,
+0x02,0x72,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x84,0x90,0x10,0x27,0x83,0x90,0x08,
+0x00,0x44,0x20,0x21,0x00,0x43,0x10,0x21,0xa1,0x28,0x00,0x07,0xa0,0x40,0x00,0x06,
+0xa0,0x80,0x00,0x02,0x08,0x00,0x19,0xc7,0xa0,0x80,0x00,0x01,0x24,0x02,0x00,0x01,
+0xa6,0x22,0x00,0x02,0x0c,0x00,0x01,0xc2,0x00,0xe0,0x20,0x21,0x08,0x00,0x1a,0x3b,
+0x00,0x00,0x00,0x00,0x30,0xa7,0xff,0xff,0x00,0x07,0x18,0xc0,0x00,0x67,0x18,0x21,
+0x3c,0x06,0xb0,0x03,0x3c,0x02,0x80,0x00,0x24,0x42,0x6a,0x44,0x27,0x85,0x90,0x10,
+0x00,0x03,0x18,0x80,0x34,0xc6,0x00,0x20,0x00,0x65,0x18,0x21,0xac,0xc2,0x00,0x00,
+0x80,0x62,0x00,0x07,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x29,0x00,0x80,0x28,0x21,
+0x90,0x82,0x00,0x16,0x00,0x00,0x00,0x00,0x34,0x42,0x00,0x02,0x30,0x43,0x00,0x01,
+0x14,0x60,0x00,0x02,0xa0,0x82,0x00,0x16,0xa0,0x80,0x00,0x17,0x90,0xa2,0x00,0x04,
+0x3c,0x03,0xb0,0x03,0x27,0x86,0x90,0x00,0x14,0x40,0x00,0x06,0x34,0x63,0x00,0x20,
+0x24,0x02,0x00,0x01,0xa0,0xa2,0x00,0x04,0xa4,0xa7,0x00,0x02,0x03,0xe0,0x00,0x08,
+0xa4,0xa7,0x00,0x00,0x94,0xa4,0x00,0x02,0x3c,0x02,0x80,0x01,0x24,0x42,0x82,0x6c,
+0xac,0x62,0x00,0x00,0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,
+0x00,0x66,0x18,0x21,0x94,0x62,0x00,0x04,0xa4,0x67,0x00,0x02,0x3c,0x03,0xb0,0x08,
+0x00,0x02,0x20,0xc0,0x00,0x82,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x46,0x10,0x21,
+0x00,0x83,0x20,0x21,0xa4,0x47,0x00,0x00,0xac,0x87,0x00,0x00,0x90,0xa2,0x00,0x04,
+0xa4,0xa7,0x00,0x02,0x24,0x42,0x00,0x01,0x03,0xe0,0x00,0x08,0xa0,0xa2,0x00,0x04,
+0x90,0x82,0x00,0x16,0x24,0x85,0x00,0x06,0x34,0x42,0x00,0x01,0x30,0x43,0x00,0x02,
+0x14,0x60,0xff,0xda,0xa0,0x82,0x00,0x16,0x24,0x02,0x00,0x01,0x08,0x00,0x1a,0xa7,
+0xa0,0x82,0x00,0x17,0x27,0xbd,0xff,0xe8,0xaf,0xbf,0x00,0x10,0x00,0x80,0x38,0x21,
+0x84,0x84,0x00,0x02,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x3c,0x0a,0xb0,0x06,
+0x34,0x63,0x00,0x20,0x24,0x42,0x6b,0x44,0x3c,0x0b,0xb0,0x08,0x27,0x89,0x90,0x00,
+0x34,0x0c,0xff,0xff,0x35,0x4a,0x80,0x20,0x10,0x80,0x00,0x30,0xac,0x62,0x00,0x00,
+0x97,0x82,0x8f,0xf0,0x94,0xe6,0x02,0xba,0x00,0x02,0x18,0xc0,0x00,0x6b,0x28,0x21,
+0xac,0xa6,0x00,0x00,0x8c,0xe4,0x02,0xb8,0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x80,
+0x00,0x04,0x10,0xc0,0x00,0x44,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x49,0x10,0x21,
+0x94,0x48,0x00,0x04,0x00,0x69,0x18,0x21,0xa4,0x66,0x00,0x00,0x00,0x08,0x28,0xc0,
+0x00,0xab,0x10,0x21,0xac,0x4c,0x00,0x00,0x8c,0xe4,0x02,0xb8,0x27,0x82,0x90,0x04,
+0x00,0xa8,0x28,0x21,0x00,0x04,0x18,0xc0,0x00,0x64,0x18,0x21,0x00,0x03,0x18,0x80,
+0x00,0x62,0x10,0x21,0x8c,0x46,0x00,0x18,0x27,0x84,0x90,0x10,0x00,0x64,0x18,0x21,
+0x8c,0xc2,0x00,0x00,0x80,0x67,0x00,0x06,0x00,0x05,0x28,0x80,0x30,0x42,0xff,0xff,
+0x00,0x47,0x10,0x21,0x30,0x43,0x00,0xff,0x00,0x03,0x18,0x2b,0x00,0x02,0x12,0x02,
+0x00,0x43,0x10,0x21,0x3c,0x04,0x00,0x04,0x00,0xa9,0x28,0x21,0x00,0x44,0x10,0x25,
+0xa4,0xac,0x00,0x00,0xad,0x42,0x00,0x00,0xa7,0x88,0x8f,0xf0,0x8f,0xbf,0x00,0x10,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x84,0xe3,0x00,0x06,
+0x27,0x82,0xb4,0x00,0x94,0xe5,0x02,0xba,0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,
+0x8c,0x64,0x00,0x00,0x0c,0x00,0x1a,0x91,0x00,0x00,0x00,0x00,0x08,0x00,0x1b,0x0b,
+0x00,0x00,0x00,0x00,0x94,0x88,0x00,0x00,0x00,0x80,0x58,0x21,0x27,0x8a,0x90,0x00,
+0x00,0x08,0x18,0xc0,0x00,0x68,0x18,0x21,0x3c,0x04,0xb0,0x03,0x00,0x03,0x18,0x80,
+0x3c,0x02,0x80,0x00,0x00,0x6a,0x18,0x21,0x34,0x84,0x00,0x20,0x24,0x42,0x6c,0x64,
+0x30,0xa5,0xff,0xff,0xac,0x82,0x00,0x00,0x94,0x67,0x00,0x02,0x11,0x05,0x00,0x35,
+0x24,0x04,0x00,0x01,0x91,0x66,0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x86,0x10,0x2a,
+0x10,0x40,0x00,0x10,0x00,0xc0,0x48,0x21,0x3c,0x0d,0xb0,0x03,0x01,0x40,0x60,0x21,
+0x35,0xad,0x00,0x20,0x10,0xe5,0x00,0x0d,0x24,0x84,0x00,0x01,0x00,0x07,0x10,0xc0,
+0x00,0x47,0x10,0x21,0x00,0x02,0x10,0x80,0x01,0x20,0x30,0x21,0x00,0x4a,0x10,0x21,
+0x00,0x86,0x18,0x2a,0x00,0xe0,0x40,0x21,0x94,0x47,0x00,0x02,0x14,0x60,0xff,0xf5,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x10,0x21,0x00,0x08,0x20,0xc0,
+0x00,0x88,0x20,0x21,0x24,0xc2,0xff,0xff,0x00,0x04,0x20,0x80,0xa1,0x62,0x00,0x04,
+0x00,0x8c,0x20,0x21,0x94,0x83,0x00,0x04,0x00,0x07,0x10,0xc0,0x00,0x47,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x4c,0x10,0x21,0x00,0x03,0x28,0xc0,0x94,0x46,0x00,0x02,
+0x00,0xa3,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x6c,0x18,0x21,0xa4,0x66,0x00,0x00,
+0xa4,0x86,0x00,0x02,0x95,0x64,0x00,0x02,0x3c,0x03,0xb0,0x08,0x3c,0x02,0x80,0x01,
+0x00,0xa3,0x28,0x21,0x24,0x42,0x82,0x6c,0xad,0xa2,0x00,0x00,0x10,0x87,0x00,0x03,
+0xac,0xa6,0x00,0x00,0x03,0xe0,0x00,0x08,0x24,0x02,0x00,0x01,0x08,0x00,0x1b,0x59,
+0xa5,0x68,0x00,0x02,0x91,0x62,0x00,0x04,0xa5,0x67,0x00,0x00,0x24,0x42,0xff,0xff,
+0x30,0x43,0x00,0xff,0x14,0x60,0xff,0xf7,0xa1,0x62,0x00,0x04,0x24,0x02,0xff,0xff,
+0x08,0x00,0x1b,0x59,0xa5,0x62,0x00,0x02,0x00,0x05,0x40,0xc0,0x01,0x05,0x30,0x21,
+0x27,0xbd,0xff,0xd8,0x00,0x06,0x30,0x80,0x27,0x82,0x90,0x04,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,0xaf,0xb0,0x00,0x10,
+0x00,0xc2,0x10,0x21,0x8c,0x47,0x00,0x18,0x00,0xa0,0x90,0x21,0x3c,0x02,0x80,0x00,
+0x3c,0x05,0xb0,0x03,0x34,0xa5,0x00,0x20,0x24,0x42,0x6d,0x98,0xac,0xa2,0x00,0x00,
+0x27,0x83,0x90,0x10,0x00,0xc3,0x30,0x21,0x8c,0xe2,0x00,0x00,0x80,0xc5,0x00,0x06,
+0x00,0x80,0x88,0x21,0x30,0x42,0xff,0xff,0x00,0x45,0x10,0x21,0x30,0x43,0x00,0xff,
+0x10,0x60,0x00,0x02,0x00,0x02,0x12,0x02,0x24,0x42,0x00,0x01,0x30,0x53,0x00,0xff,
+0x01,0x12,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x10,0x00,0x43,0x10,0x21,
+0x80,0x44,0x00,0x07,0x00,0x00,0x00,0x00,0x10,0x80,0x00,0x4b,0x26,0x24,0x00,0x06,
+0x32,0x50,0xff,0xff,0x02,0x20,0x20,0x21,0x0c,0x00,0x1b,0x19,0x02,0x00,0x28,0x21,
+0x92,0x22,0x00,0x10,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x2e,0x3c,0x03,0xb0,0x08,
+0x3c,0x09,0x80,0x01,0x27,0x88,0x90,0x00,0xa6,0x32,0x00,0x0c,0x00,0x10,0x20,0xc0,
+0x00,0x90,0x20,0x21,0x00,0x04,0x20,0x80,0x00,0x88,0x20,0x21,0x94,0x82,0x00,0x04,
+0x3c,0x03,0xb0,0x08,0x3c,0x07,0xb0,0x03,0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0x48,0x10,0x21,0x00,0xa3,0x28,0x21,0x25,0x26,0x82,0x6c,
+0x34,0x03,0xff,0xff,0x34,0xe7,0x00,0x20,0xac,0xe6,0x00,0x00,0xa4,0x83,0x00,0x02,
+0xa4,0x43,0x00,0x00,0xac,0xa3,0x00,0x00,0x92,0x22,0x00,0x10,0x92,0x23,0x00,0x0a,
+0xa6,0x32,0x00,0x0e,0x02,0x62,0x10,0x21,0x14,0x60,0x00,0x05,0xa2,0x22,0x00,0x10,
+0x92,0x22,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfe,0xa2,0x22,0x00,0x16,
+0x92,0x22,0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x05,0x00,0x00,0x00,0x00,
+0x92,0x22,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfd,0xa2,0x22,0x00,0x16,
+0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x28,0x96,0x22,0x00,0x0e,0x27,0x88,0x90,0x00,0x00,0x02,0x20,0xc0,
+0x00,0x82,0x20,0x21,0x00,0x04,0x20,0x80,0x00,0x88,0x20,0x21,0x94,0x82,0x00,0x04,
+0x3c,0x06,0xb0,0x03,0x3c,0x09,0x80,0x01,0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,
+0x00,0x02,0x10,0x80,0x00,0xa3,0x28,0x21,0x00,0x48,0x10,0x21,0x34,0xc6,0x00,0x20,
+0x25,0x23,0x82,0x6c,0xac,0xc3,0x00,0x00,0xa4,0x50,0x00,0x00,0xac,0xb0,0x00,0x00,
+0x08,0x00,0x1b,0x97,0xa4,0x90,0x00,0x02,0x08,0x00,0x1b,0x8e,0x32,0x50,0xff,0xff,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,0x24,0x42,0x6f,0x60,0x34,0x63,0x00,0x20,
+0xac,0x62,0x00,0x00,0x90,0x82,0x00,0x04,0x97,0xaa,0x00,0x12,0x00,0x80,0x60,0x21,
+0x30,0xa8,0xff,0xff,0x00,0x4a,0x20,0x23,0x34,0x09,0xff,0xff,0x30,0xcf,0xff,0xff,
+0x30,0xee,0xff,0xff,0x11,0x09,0x00,0x73,0xa1,0x84,0x00,0x04,0x00,0x0e,0xc0,0xc0,
+0x00,0x08,0x10,0xc0,0x00,0x48,0x10,0x21,0x03,0x0e,0x20,0x21,0x27,0x8d,0x90,0x00,
+0x00,0x04,0x20,0x80,0x00,0x02,0x10,0x80,0x00,0x4d,0x10,0x21,0x00,0x8d,0x20,0x21,
+0x94,0x86,0x00,0x02,0x94,0x43,0x00,0x04,0x3c,0x19,0x80,0x01,0xa4,0x46,0x00,0x02,
+0x00,0x03,0x28,0xc0,0x00,0xa3,0x18,0x21,0x94,0x87,0x00,0x02,0x3c,0x02,0xb0,0x08,
+0x00,0x03,0x18,0x80,0x00,0xa2,0x28,0x21,0x00,0x6d,0x18,0x21,0x27,0x22,0x82,0x6c,
+0x3c,0x01,0xb0,0x03,0xac,0x22,0x00,0x20,0xa4,0x66,0x00,0x00,0x10,0xe9,0x00,0x57,
+0xac,0xa6,0x00,0x00,0x01,0xe0,0x30,0x21,0x11,0x40,0x00,0x1d,0x00,0x00,0x48,0x21,
+0x01,0x40,0x38,0x21,0x27,0x8b,0x90,0x04,0x27,0x8a,0x90,0x10,0x00,0x06,0x40,0xc0,
+0x01,0x06,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x6b,0x10,0x21,0x8c,0x44,0x00,0x18,
+0x00,0x6a,0x18,0x21,0x80,0x65,0x00,0x06,0x8c,0x82,0x00,0x00,0x00,0x00,0x00,0x00,
+0x30,0x42,0xff,0xff,0x00,0x45,0x10,0x21,0x30,0x44,0x00,0xff,0x00,0x02,0x12,0x02,
+0x01,0x22,0x18,0x21,0x24,0x62,0x00,0x01,0x14,0x80,0x00,0x02,0x30,0x49,0x00,0xff,
+0x30,0x69,0x00,0xff,0x01,0x06,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x4d,0x10,0x21,
+0x24,0xe7,0xff,0xff,0x94,0x46,0x00,0x02,0x14,0xe0,0xff,0xe9,0x00,0x06,0x40,0xc0,
+0x91,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x20,0x3c,0x06,0xb0,0x03,
+0xa5,0x8f,0x00,0x0c,0x03,0x0e,0x20,0x21,0x00,0x04,0x20,0x80,0x00,0x8d,0x20,0x21,
+0x94,0x82,0x00,0x04,0x3c,0x03,0xb0,0x08,0x3c,0x07,0xb0,0x03,0x00,0x02,0x28,0xc0,
+0x00,0xa2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x4d,0x10,0x21,0x00,0xa3,0x28,0x21,
+0x27,0x26,0x82,0x6c,0x34,0x03,0xff,0xff,0x34,0xe7,0x00,0x20,0xac,0xe6,0x00,0x00,
+0xa4,0x83,0x00,0x02,0xa4,0x43,0x00,0x00,0xac,0xa3,0x00,0x00,0x91,0x82,0x00,0x10,
+0x91,0x83,0x00,0x04,0xa5,0x8e,0x00,0x0e,0x01,0x22,0x10,0x21,0x14,0x60,0x00,0x05,
+0xa1,0x82,0x00,0x10,0x91,0x82,0x00,0x16,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0xfd,
+0xa1,0x82,0x00,0x16,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x95,0x82,0x00,0x0e,
+0x3c,0x03,0xb0,0x08,0x00,0x02,0x20,0xc0,0x00,0x82,0x20,0x21,0x00,0x04,0x20,0x80,
+0x00,0x8d,0x20,0x21,0x94,0x82,0x00,0x04,0x34,0xc6,0x00,0x20,0x27,0x27,0x82,0x6c,
+0x00,0x02,0x28,0xc0,0x00,0xa2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0xa3,0x28,0x21,
+0x00,0x4d,0x10,0x21,0xac,0xc7,0x00,0x00,0xa4,0x8f,0x00,0x02,0xa4,0x4f,0x00,0x00,
+0xac,0xaf,0x00,0x00,0x08,0x00,0x1c,0x26,0x03,0x0e,0x20,0x21,0x08,0x00,0x1c,0x01,
+0xa5,0x88,0x00,0x02,0x00,0x0e,0xc0,0xc0,0x03,0x0e,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x8d,0x90,0x00,0x00,0x4d,0x10,0x21,0x94,0x43,0x00,0x02,0x30,0x84,0x00,0xff,
+0x14,0x80,0x00,0x05,0xa5,0x83,0x00,0x00,0x24,0x02,0xff,0xff,0x3c,0x19,0x80,0x01,
+0x08,0x00,0x1c,0x01,0xa5,0x82,0x00,0x02,0x08,0x00,0x1c,0x01,0x3c,0x19,0x80,0x01,
+0x3c,0x08,0xb0,0x03,0x3c,0x02,0x80,0x00,0x27,0xbd,0xff,0x78,0x35,0x08,0x00,0x20,
+0x24,0x42,0x71,0xa0,0xaf,0xb2,0x00,0x68,0xaf,0xb1,0x00,0x64,0xaf,0xb0,0x00,0x60,
+0xad,0x02,0x00,0x00,0xaf,0xbf,0x00,0x84,0xaf,0xbe,0x00,0x80,0xaf,0xb7,0x00,0x7c,
+0xaf,0xb6,0x00,0x78,0xaf,0xb5,0x00,0x74,0xaf,0xb4,0x00,0x70,0xaf,0xb3,0x00,0x6c,
+0xaf,0xa4,0x00,0x88,0x90,0x83,0x00,0x0a,0x27,0x82,0xb4,0x00,0xaf,0xa6,0x00,0x90,
+0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,0x8c,0x63,0x00,0x00,0xaf,0xa7,0x00,0x94,
+0x27,0x86,0x90,0x04,0xaf,0xa3,0x00,0x1c,0x94,0x63,0x00,0x14,0x30,0xb1,0xff,0xff,
+0x24,0x08,0x00,0x01,0x00,0x03,0x20,0xc0,0xaf,0xa3,0x00,0x18,0x00,0x83,0x18,0x21,
+0xaf,0xa4,0x00,0x54,0x00,0x03,0x18,0x80,0x27,0x84,0x90,0x10,0x00,0x64,0x20,0x21,
+0x80,0x82,0x00,0x06,0x00,0x66,0x18,0x21,0x8c,0x66,0x00,0x18,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x8c,0xc4,0x00,0x08,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,
+0x00,0x02,0x10,0x40,0x00,0x04,0x2f,0xc2,0x00,0x04,0x1c,0x82,0x00,0xc2,0x38,0x21,
+0x00,0x04,0x24,0x42,0x8f,0xa2,0x00,0x1c,0x30,0x63,0x00,0x01,0x30,0x84,0x00,0x01,
+0xaf,0xa5,0x00,0x3c,0xaf,0xa3,0x00,0x34,0xaf,0xa4,0x00,0x38,0xaf,0xa0,0x00,0x40,
+0xaf,0xa0,0x00,0x44,0xaf,0xa0,0x00,0x50,0xaf,0xa8,0x00,0x20,0x80,0x42,0x00,0x12,
+0x8f,0xb2,0x00,0x18,0xaf,0xa2,0x00,0x28,0x8c,0xd0,0x00,0x0c,0x14,0xa0,0x01,0xe4,
+0x00,0x60,0x30,0x21,0x00,0x10,0x10,0x82,0x30,0x45,0x00,0x07,0x10,0xa0,0x00,0x11,
+0xaf,0xa0,0x00,0x30,0x8f,0xa4,0x00,0x98,0x27,0x82,0x80,0x1c,0x00,0x04,0x18,0x40,
+0x00,0x62,0x18,0x21,0x24,0xa2,0x00,0x06,0x8f,0xa5,0x00,0x20,0x94,0x64,0x00,0x00,
+0x00,0x45,0x10,0x04,0x00,0x44,0x00,0x1a,0x14,0x80,0x00,0x02,0x00,0x00,0x00,0x00,
+0x00,0x07,0x00,0x0d,0x00,0x00,0x10,0x12,0x24,0x42,0x00,0x20,0x30,0x42,0xff,0xfc,
+0xaf,0xa2,0x00,0x30,0x8f,0xa3,0x00,0x18,0x8f,0xa4,0x00,0x28,0x34,0x02,0xff,0xff,
+0xaf,0xa0,0x00,0x2c,0xaf,0xa2,0x00,0x48,0xaf,0xa3,0x00,0x4c,0x00,0x60,0xf0,0x21,
+0x00,0x00,0xb8,0x21,0x18,0x80,0x00,0x48,0xaf,0xa0,0x00,0x24,0x00,0x11,0x89,0x02,
+0xaf,0xb1,0x00,0x58,0x00,0x80,0xa8,0x21,0x00,0x12,0x10,0xc0,0x00,0x52,0x18,0x21,
+0x00,0x03,0x80,0x80,0x27,0x85,0x90,0x00,0x02,0x40,0x20,0x21,0x00,0x40,0xa0,0x21,
+0x02,0x05,0x10,0x21,0x94,0x56,0x00,0x02,0x0c,0x00,0x12,0x8b,0x00,0x00,0x28,0x21,
+0x90,0x42,0x00,0x00,0x24,0x03,0x00,0x08,0x30,0x42,0x00,0x0c,0x10,0x43,0x01,0x9e,
+0x24,0x04,0x00,0x01,0x24,0x02,0x00,0x01,0x10,0x82,0x01,0x7c,0x3c,0x02,0xb0,0x03,
+0x8f,0xa6,0x00,0x88,0x34,0x42,0x01,0x04,0x84,0xc5,0x00,0x0c,0x02,0x92,0x18,0x21,
+0x94,0x46,0x00,0x00,0x00,0x05,0x20,0xc0,0x00,0x85,0x20,0x21,0x00,0x03,0x18,0x80,
+0x27,0x82,0x90,0x10,0x27,0x85,0x90,0x08,0x00,0x65,0x28,0x21,0x00,0x62,0x18,0x21,
+0x80,0x71,0x00,0x05,0x80,0x73,0x00,0x04,0x8f,0xa3,0x00,0x88,0x30,0xd0,0xff,0xff,
+0x00,0x10,0x3a,0x03,0x32,0x08,0x00,0xff,0x27,0x82,0x90,0x20,0x00,0x04,0x20,0x80,
+0x80,0xa6,0x00,0x06,0x00,0x82,0x20,0x21,0xa4,0x67,0x00,0x44,0xa4,0x68,0x00,0x46,
+0x8c,0x84,0x00,0x00,0x38,0xc6,0x00,0x00,0x01,0x00,0x80,0x21,0x00,0x04,0x15,0x02,
+0x30,0x42,0x00,0x01,0x10,0x40,0x00,0x03,0x00,0xe6,0x80,0x0a,0x00,0x04,0x14,0x02,
+0x30,0x50,0x00,0x0f,0x12,0x20,0x01,0x50,0x02,0x40,0x20,0x21,0x02,0x71,0x10,0x21,
+0x00,0x50,0x10,0x2a,0x14,0x40,0x00,0xed,0x02,0x92,0x10,0x21,0x93,0x82,0x8b,0x71,
+0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,0x14,0x40,0x00,0xe0,0x02,0x92,0x28,0x21,
+0x26,0xe2,0x00,0x01,0x30,0x57,0xff,0xff,0x02,0x40,0xf0,0x21,0x26,0xb5,0xff,0xff,
+0x16,0xa0,0xff,0xbd,0x02,0xc0,0x90,0x21,0x16,0xe0,0x00,0xd0,0x00,0x00,0x00,0x00,
+0x8f,0xa3,0x00,0x98,0x00,0x00,0x00,0x00,0x2c,0x62,0x00,0x10,0x10,0x40,0x00,0x2e,
+0x00,0x00,0x00,0x00,0x8f,0xa4,0x00,0x24,0x00,0x00,0x00,0x00,0x18,0x80,0x00,0x2a,
+0x24,0x03,0x00,0x01,0x8f,0xa5,0x00,0x1c,0x27,0x84,0x90,0x04,0x94,0xb2,0x00,0x14,
+0xa0,0xa3,0x00,0x12,0x8f,0xa6,0x00,0x3c,0x00,0x12,0x10,0xc0,0x00,0x52,0x10,0x21,
+0x00,0x02,0x80,0x80,0x27,0x82,0x90,0x10,0x02,0x02,0x10,0x21,0x80,0x43,0x00,0x06,
+0x02,0x04,0x20,0x21,0x8c,0x85,0x00,0x18,0x24,0x63,0x00,0x02,0x00,0x03,0x17,0xc2,
+0x00,0x62,0x18,0x21,0x00,0x03,0x18,0x43,0x00,0x03,0x18,0x40,0x14,0xc0,0x00,0x0e,
+0x00,0xa3,0x38,0x21,0x27,0x82,0x90,0x00,0x02,0x02,0x10,0x21,0x94,0x43,0x00,0x06,
+0x8f,0xa8,0x00,0x1c,0x24,0x02,0x00,0x01,0xa5,0x03,0x00,0x1a,0x7b,0xbe,0x04,0x3c,
+0x7b,0xb6,0x03,0xfc,0x7b,0xb4,0x03,0xbc,0x7b,0xb2,0x03,0x7c,0x7b,0xb0,0x03,0x3c,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x88,0x8f,0xa4,0x00,0x98,0x8f,0xa5,0x00,0x38,
+0x8f,0xa6,0x00,0x34,0xaf,0xa0,0x00,0x10,0x0c,0x00,0x09,0x0a,0xaf,0xa0,0x00,0x14,
+0x08,0x00,0x1d,0x2d,0x00,0x00,0x00,0x00,0x8f,0xa3,0x00,0x44,0x93,0x82,0x81,0x58,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x61,0x30,0x69,0x00,0x03,0x8f,0xa4,0x00,0x24,
+0x8f,0xa5,0x00,0x28,0x00,0x00,0x00,0x00,0x00,0x85,0x10,0x2a,0x10,0x40,0x00,0x8f,
+0x00,0x00,0x00,0x00,0x8f,0xa6,0x00,0x1c,0x00,0x00,0x00,0x00,0x90,0xc4,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x83,0x00,0xff,0x00,0xa3,0x10,0x2a,0x10,0x40,0x00,0x87,
+0x00,0x00,0x00,0x00,0x8f,0xa8,0x00,0x24,0x00,0x00,0x00,0x00,0x11,0x00,0x00,0x83,
+0x00,0x65,0x10,0x23,0x00,0xa8,0x18,0x23,0x00,0x62,0x10,0x2a,0x14,0x40,0x00,0x7d,
+0x30,0x63,0x00,0xff,0x00,0x85,0x10,0x23,0x30,0x42,0x00,0xff,0xaf,0xa2,0x00,0x50,
+0x8f,0xa2,0x00,0x50,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x73,0x00,0x00,0xa8,0x21,
+0x27,0x8c,0x90,0x00,0x3c,0x0b,0x80,0xff,0x24,0x10,0x00,0x04,0x27,0x91,0x90,0x04,
+0x35,0x6b,0xff,0xff,0x3c,0x0d,0x7f,0x00,0x27,0x8e,0x90,0x10,0x01,0x80,0x78,0x21,
+0x00,0x12,0x30,0xc0,0x00,0xd2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x4c,0x10,0x21,
+0x94,0x42,0x00,0x06,0x8f,0xa3,0x00,0x2c,0x8f,0xa4,0x00,0x30,0xaf,0xa2,0x00,0x44,
+0x8f,0xa5,0x00,0x44,0x30,0x49,0x00,0x03,0x02,0x09,0x10,0x23,0x30,0x42,0x00,0x03,
+0x00,0xa2,0x10,0x21,0x8f,0xa8,0x00,0x30,0x24,0x42,0x00,0x04,0x30,0x42,0xff,0xff,
+0x00,0x64,0x38,0x21,0x01,0x02,0x28,0x23,0x00,0x62,0x18,0x21,0x00,0x48,0x10,0x2b,
+0x10,0x40,0x00,0x52,0x00,0x00,0x20,0x21,0x30,0xe7,0xff,0xff,0x30,0xa4,0xff,0xff,
+0xaf,0xa7,0x00,0x2c,0x00,0xd2,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x51,0x18,0x21,
+0x8c,0x65,0x00,0x18,0x00,0x04,0x25,0x40,0x00,0x8d,0x20,0x24,0x8c,0xa8,0x00,0x04,
+0x00,0x4e,0x18,0x21,0x00,0x4f,0x50,0x21,0x01,0x0b,0x40,0x24,0x01,0x04,0x40,0x25,
+0xac,0xa8,0x00,0x04,0x8f,0xa4,0x00,0x98,0x8f,0xa2,0x00,0x50,0x26,0xb5,0x00,0x01,
+0xa0,0x64,0x00,0x00,0x8c,0xa4,0x00,0x08,0x00,0x00,0x00,0x00,0x04,0x81,0x00,0x0c,
+0x02,0xa2,0x30,0x2a,0x80,0x62,0x00,0x06,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,
+0x00,0xa2,0x38,0x21,0x8f,0xa5,0x00,0x40,0x00,0x00,0x00,0x00,0xa4,0xe5,0x00,0x00,
+0x95,0x52,0x00,0x02,0x14,0xc0,0xff,0xc7,0x00,0x12,0x30,0xc0,0x8f,0xa4,0x00,0x24,
+0x8f,0xa5,0x00,0x50,0x8f,0xa6,0x00,0x1c,0x8f,0xa3,0x00,0x2c,0x00,0x85,0x80,0x21,
+0xa0,0xd0,0x00,0x12,0x00,0x09,0x10,0x23,0x30,0x42,0x00,0x03,0x8f,0xa8,0x00,0x88,
+0x00,0x62,0x10,0x23,0xa4,0xc2,0x00,0x1a,0x85,0x03,0x00,0x0c,0x00,0x00,0x00,0x00,
+0x00,0x03,0x10,0xc0,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x04,
+0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x18,0x00,0x00,0x00,0x00,0x8c,0x83,0x00,0x04,
+0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x10,0x14,0x60,0xff,0x74,0x02,0x00,0x10,0x21,
+0x8f,0xa3,0x00,0x54,0x8f,0xa4,0x00,0x18,0x8f,0xa5,0x00,0x24,0x00,0x64,0x10,0x21,
+0x00,0x02,0x10,0x80,0x27,0x83,0x90,0x18,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x00,
+0x10,0xa0,0x00,0x03,0x00,0x00,0x30,0x21,0x08,0x00,0x1d,0x33,0x02,0x00,0x10,0x21,
+0x93,0x82,0x80,0x10,0x00,0x00,0x28,0x21,0x00,0x00,0x38,0x21,0x0c,0x00,0x21,0x9a,
+0xaf,0xa2,0x00,0x10,0x08,0x00,0x1d,0x33,0x02,0x00,0x10,0x21,0x30,0x63,0xff,0xff,
+0x08,0x00,0x1d,0x85,0xaf,0xa3,0x00,0x2c,0x8f,0xa8,0x00,0x44,0x08,0x00,0x1d,0xa7,
+0x31,0x09,0x00,0x03,0x08,0x00,0x1d,0x60,0xaf,0xa3,0x00,0x50,0x8f,0xa6,0x00,0x44,
+0xaf,0xa0,0x00,0x50,0x08,0x00,0x1d,0xa7,0x30,0xc9,0x00,0x03,0x8f,0xa5,0x00,0x48,
+0x8f,0xa6,0x00,0x4c,0x8f,0xa4,0x00,0x1c,0x03,0xc0,0x38,0x21,0x0c,0x00,0x1b,0xd8,
+0xaf,0xb7,0x00,0x10,0x08,0x00,0x1d,0x10,0x00,0x00,0x00,0x00,0x00,0x05,0x28,0x80,
+0x27,0x82,0x90,0x00,0x00,0xa2,0x28,0x21,0x00,0x00,0x20,0x21,0x0c,0x00,0x01,0x49,
+0x00,0x00,0x00,0x00,0x08,0x00,0x1d,0x09,0x26,0xe2,0x00,0x01,0x00,0x02,0x80,0x80,
+0x27,0x83,0x90,0x10,0x8f,0xa4,0x00,0x1c,0x02,0x03,0x18,0x21,0x26,0x31,0x00,0x01,
+0x02,0x40,0x28,0x21,0x0c,0x00,0x1e,0xea,0xa0,0x71,0x00,0x05,0x14,0x40,0xff,0x13,
+0x00,0x00,0x00,0x00,0x16,0xe0,0x00,0x4d,0x03,0xc0,0x38,0x21,0x8f,0xa4,0x00,0x24,
+0x8f,0xa5,0x00,0x20,0x24,0x02,0x00,0x01,0x24,0x84,0x00,0x01,0xaf,0xb2,0x00,0x48,
+0xaf,0xb6,0x00,0x4c,0x02,0xc0,0xf0,0x21,0x10,0xa2,0x00,0x41,0xaf,0xa4,0x00,0x24,
+0x27,0x82,0x90,0x00,0x02,0x02,0x10,0x21,0x94,0x42,0x00,0x06,0x8f,0xa4,0x00,0x30,
+0xaf,0xa0,0x00,0x20,0xaf,0xa2,0x00,0x44,0x30,0x49,0x00,0x03,0x8f,0xa8,0x00,0x44,
+0x00,0x09,0x10,0x23,0x30,0x42,0x00,0x03,0x01,0x02,0x10,0x21,0x24,0x42,0x00,0x04,
+0x30,0x42,0xff,0xff,0x00,0x44,0x18,0x2b,0x10,0x60,0x00,0x2b,0x00,0x00,0x00,0x00,
+0x8f,0xa5,0x00,0x2c,0x00,0x82,0x10,0x23,0x00,0xa4,0x18,0x21,0x30,0x63,0xff,0xff,
+0x30,0x44,0xff,0xff,0xaf,0xa3,0x00,0x2c,0x02,0x92,0x28,0x21,0x00,0x05,0x28,0x80,
+0x27,0x82,0x90,0x04,0x00,0xa2,0x10,0x21,0x8c,0x46,0x00,0x18,0x3c,0x03,0x80,0xff,
+0x3c,0x02,0x7f,0x00,0x8c,0xc8,0x00,0x04,0x00,0x04,0x25,0x40,0x34,0x63,0xff,0xff,
+0x00,0x82,0x20,0x24,0x01,0x03,0x40,0x24,0x01,0x04,0x40,0x25,0xac,0xc8,0x00,0x04,
+0x8f,0xa8,0x00,0x98,0x27,0x82,0x90,0x10,0x00,0xa2,0x10,0x21,0xa0,0x48,0x00,0x00,
+0x8c,0xc4,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x04,0x27,0xc2,0x10,0x80,0xfe,0xdb,
+0xaf,0xa4,0x00,0x3c,0x80,0x42,0x00,0x06,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,
+0x00,0xc2,0x38,0x21,0x8f,0xa2,0x00,0x40,0x00,0x00,0x00,0x00,0xa4,0xe2,0x00,0x00,
+0x08,0x00,0x1d,0x0c,0x26,0xb5,0xff,0xff,0x8f,0xa6,0x00,0x2c,0x00,0x00,0x20,0x21,
+0x00,0xc2,0x10,0x21,0x30,0x42,0xff,0xff,0x08,0x00,0x1e,0x1a,0xaf,0xa2,0x00,0x2c,
+0x8f,0xa6,0x00,0x1c,0x08,0x00,0x1e,0x04,0xa4,0xd2,0x00,0x14,0x8f,0xa5,0x00,0x48,
+0x8f,0xa6,0x00,0x4c,0x8f,0xa4,0x00,0x1c,0x0c,0x00,0x1b,0xd8,0xaf,0xb7,0x00,0x10,
+0x08,0x00,0x1d,0xfb,0x00,0x00,0xb8,0x21,0x0c,0x00,0x12,0x8b,0x00,0x00,0x28,0x21,
+0x00,0x40,0x18,0x21,0x94,0x42,0x00,0x00,0x00,0x00,0x00,0x00,0x34,0x42,0x08,0x00,
+0xa4,0x62,0x00,0x00,0x08,0x00,0x1d,0x00,0x02,0x71,0x10,0x21,0x02,0x92,0x18,0x21,
+0x00,0x03,0x80,0x80,0x27,0x82,0x90,0x04,0x02,0x02,0x10,0x21,0x8c,0x44,0x00,0x18,
+0x00,0x00,0x00,0x00,0x8c,0x83,0x00,0x04,0x00,0x00,0x00,0x00,0x30,0x63,0x00,0x10,
+0x10,0x60,0x00,0x09,0x24,0x06,0x00,0x01,0x93,0x82,0x8b,0x71,0x00,0x00,0x00,0x00,
+0x30,0x42,0x00,0x01,0x10,0x40,0xfe,0xa2,0x3c,0x04,0x00,0x80,0x27,0x85,0x90,0x00,
+0x08,0x00,0x1d,0xeb,0x02,0x05,0x28,0x21,0x27,0x83,0x90,0x18,0x27,0x82,0x90,0x10,
+0x02,0x03,0x18,0x21,0x02,0x02,0x10,0x21,0x90,0x64,0x00,0x00,0x90,0x45,0x00,0x05,
+0x93,0x83,0x80,0x10,0x00,0x00,0x38,0x21,0x0c,0x00,0x21,0x9a,0xaf,0xa3,0x00,0x10,
+0x08,0x00,0x1e,0x62,0x00,0x00,0x00,0x00,0x27,0x82,0x90,0x18,0x02,0x02,0x10,0x21,
+0x94,0x43,0x00,0x02,0x8f,0xa6,0x00,0x58,0x00,0x03,0x19,0x02,0x00,0x66,0x18,0x23,
+0x30,0x63,0x0f,0xff,0x28,0x62,0x00,0x20,0x10,0x40,0x00,0x06,0x28,0x62,0x00,0x40,
+0x8f,0xa8,0x00,0x90,0x00,0x00,0x00,0x00,0x00,0x68,0x10,0x06,0x08,0x00,0x1c,0xd9,
+0x30,0x44,0x00,0x01,0x10,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0x8f,0xa4,0x00,0x94,
+0x08,0x00,0x1e,0x83,0x00,0x64,0x10,0x06,0x08,0x00,0x1c,0xd9,0x00,0x00,0x20,0x21,
+0x8f,0xa4,0x00,0x98,0x8f,0xa5,0x00,0x38,0xaf,0xa0,0x00,0x10,0x0c,0x00,0x09,0x0a,
+0xaf,0xa8,0x00,0x14,0x30,0x42,0xff,0xff,0x08,0x00,0x1c,0xa9,0xaf,0xa2,0x00,0x40,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x00,0x27,0xbd,0xff,0xe0,0x34,0x42,0x00,0x20,
+0x24,0x63,0x7a,0x50,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x18,
+0xac,0x43,0x00,0x00,0x90,0x82,0x00,0x0a,0x00,0x80,0x80,0x21,0x14,0x40,0x00,0x45,
+0x00,0x00,0x88,0x21,0x92,0x02,0x00,0x04,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x3c,
+0x00,0x00,0x00,0x00,0x12,0x20,0x00,0x18,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x16,
+0x92,0x05,0x00,0x0a,0x30,0x42,0x00,0xfc,0x10,0xa0,0x00,0x03,0xa2,0x02,0x00,0x16,
+0x34,0x42,0x00,0x01,0xa2,0x02,0x00,0x16,0x92,0x04,0x00,0x04,0x00,0x00,0x00,0x00,
+0x30,0x83,0x00,0xff,0x10,0x60,0x00,0x05,0x00,0x00,0x00,0x00,0x92,0x02,0x00,0x16,
+0x00,0x00,0x00,0x00,0x34,0x42,0x00,0x02,0xa2,0x02,0x00,0x16,0x10,0x60,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x14,0xa0,0x00,0x08,0x00,0x00,0x00,0x00,0x96,0x02,0x00,0x00,
+0xa2,0x00,0x00,0x17,0xa6,0x02,0x00,0x14,0x8f,0xbf,0x00,0x18,0x7b,0xb0,0x00,0xbc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x14,0x80,0x00,0x05,0x24,0x02,0x00,0x01,
+0x96,0x03,0x00,0x06,0xa2,0x02,0x00,0x17,0x08,0x00,0x1e,0xbe,0xa6,0x03,0x00,0x14,
+0x96,0x04,0x00,0x00,0x96,0x05,0x00,0x06,0x27,0x86,0x90,0x00,0x00,0x04,0x10,0xc0,
+0x00,0x05,0x18,0xc0,0x00,0x44,0x10,0x21,0x00,0x65,0x18,0x21,0x00,0x02,0x10,0x80,
+0x00,0x03,0x18,0x80,0x00,0x66,0x18,0x21,0x00,0x46,0x10,0x21,0x8c,0x65,0x00,0x08,
+0x8c,0x44,0x00,0x08,0x0c,0x00,0x12,0x7c,0x00,0x00,0x00,0x00,0x30,0x43,0x00,0xff,
+0x10,0x60,0x00,0x04,0xa2,0x02,0x00,0x17,0x96,0x02,0x00,0x06,0x08,0x00,0x1e,0xbe,
+0xa6,0x02,0x00,0x14,0x96,0x02,0x00,0x00,0x08,0x00,0x1e,0xbe,0xa6,0x02,0x00,0x14,
+0x96,0x05,0x00,0x00,0x0c,0x00,0x1e,0xea,0x02,0x00,0x20,0x21,0x08,0x00,0x1e,0xa5,
+0x02,0x22,0x88,0x21,0x94,0x85,0x00,0x06,0x0c,0x00,0x1e,0xea,0x00,0x00,0x00,0x00,
+0x08,0x00,0x1e,0xa1,0x00,0x40,0x88,0x21,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x00,
+0x34,0x63,0x00,0x20,0x24,0x42,0x7b,0xa8,0x27,0xbd,0xff,0xf0,0xac,0x62,0x00,0x00,
+0x00,0x00,0x10,0x21,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x10,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x00,0x34,0x63,0x00,0x20,0x24,0x42,0x7b,0xcc,0xac,0x62,0x00,0x00,
+0x90,0x89,0x00,0x0a,0x00,0x80,0x30,0x21,0x11,0x20,0x00,0x05,0x00,0xa0,0x50,0x21,
+0x90,0x82,0x00,0x17,0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x1b,0x00,0x00,0x00,0x00,
+0x90,0xc7,0x00,0x04,0x00,0x00,0x00,0x00,0x10,0xe0,0x00,0x1b,0x00,0x00,0x00,0x00,
+0x94,0xc8,0x00,0x00,0x27,0x83,0x90,0x00,0x93,0x85,0x8b,0x70,0x00,0x08,0x10,0xc0,
+0x00,0x48,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x08,
+0x00,0xe5,0x28,0x2b,0x10,0xa0,0x00,0x06,0x01,0x44,0x18,0x23,0x8f,0x82,0x8b,0x88,
+0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x2b,0x10,0x40,0x00,0x05,0x00,0x00,0x00,0x00,
+0x24,0x03,0x00,0x10,0xa4,0xc8,0x00,0x14,0x03,0xe0,0x00,0x08,0x00,0x60,0x10,0x21,
+0x11,0x20,0x00,0x05,0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x06,0x24,0x03,0x00,0x08,
+0x08,0x00,0x1f,0x16,0xa4,0xc2,0x00,0x14,0x08,0x00,0x1f,0x16,0x00,0x00,0x18,0x21,
+0x27,0xbd,0xff,0xc8,0xaf,0xb5,0x00,0x2c,0xaf,0xb4,0x00,0x28,0xaf,0xb3,0x00,0x24,
+0xaf,0xb0,0x00,0x18,0xaf,0xbf,0x00,0x30,0xaf,0xb2,0x00,0x20,0xaf,0xb1,0x00,0x1c,
+0x94,0x91,0x00,0x06,0x00,0x80,0xa0,0x21,0x3c,0x02,0x80,0x00,0x3c,0x04,0xb0,0x03,
+0x00,0x11,0xa8,0xc0,0x34,0x84,0x00,0x20,0x24,0x42,0x7c,0x80,0x02,0xb1,0x48,0x21,
+0xac,0x82,0x00,0x00,0x00,0x09,0x48,0x80,0x24,0x03,0x00,0x01,0x27,0x82,0x90,0x10,
+0xa2,0x83,0x00,0x12,0x01,0x22,0x10,0x21,0x27,0x84,0x90,0x04,0x01,0x24,0x20,0x21,
+0x80,0x48,0x00,0x06,0x8c,0x8a,0x00,0x18,0x27,0x83,0x90,0x20,0x01,0x23,0x48,0x21,
+0x8d,0x24,0x00,0x00,0x25,0x08,0x00,0x02,0x8d,0x42,0x00,0x00,0x8d,0x49,0x00,0x04,
+0x00,0x08,0x17,0xc2,0x8d,0x43,0x00,0x08,0x01,0x02,0x40,0x21,0x00,0x04,0x25,0xc2,
+0x00,0x08,0x40,0x43,0x30,0x84,0x00,0x01,0x00,0x03,0x1f,0xc2,0x00,0x08,0x40,0x40,
+0x00,0xe0,0x80,0x21,0x00,0x64,0x18,0x24,0x00,0x09,0x49,0x42,0x01,0x48,0x10,0x21,
+0x00,0xa0,0x98,0x21,0x00,0xa0,0x20,0x21,0x00,0x40,0x38,0x21,0x02,0x00,0x28,0x21,
+0x14,0x60,0x00,0x19,0x31,0x29,0x00,0x01,0x94,0x42,0x00,0x00,0x02,0xb1,0x88,0x21,
+0x02,0x00,0x28,0x21,0x00,0x11,0x88,0x80,0x27,0x90,0x90,0x00,0x02,0x30,0x80,0x21,
+0x96,0x03,0x00,0x06,0x30,0x52,0xff,0xff,0x02,0x60,0x20,0x21,0x00,0x60,0x30,0x21,
+0xa6,0x83,0x00,0x1a,0x27,0x82,0x90,0x08,0x0c,0x00,0x08,0xe3,0x02,0x22,0x88,0x21,
+0x00,0x52,0x10,0x21,0x96,0x03,0x00,0x06,0xa6,0x22,0x00,0x04,0x8f,0xbf,0x00,0x30,
+0x7b,0xb4,0x01,0x7c,0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x00,0x60,0x10,0x21,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x38,0xaf,0xa9,0x00,0x10,0x0c,0x00,0x09,0x0a,
+0xaf,0xa0,0x00,0x14,0x08,0x00,0x1f,0x54,0x02,0xb1,0x88,0x21,0x27,0xbd,0xff,0xc0,
+0xaf,0xbe,0x00,0x38,0xaf,0xb7,0x00,0x34,0xaf,0xb6,0x00,0x30,0xaf,0xb5,0x00,0x2c,
+0xaf,0xb3,0x00,0x24,0xaf,0xb1,0x00,0x1c,0xaf,0xbf,0x00,0x3c,0xaf,0xb4,0x00,0x28,
+0xaf,0xb2,0x00,0x20,0xaf,0xb0,0x00,0x18,0x94,0x90,0x00,0x00,0x3c,0x08,0xb0,0x03,
+0x35,0x08,0x00,0x20,0x00,0x10,0x10,0xc0,0x00,0x50,0x18,0x21,0x00,0x40,0x88,0x21,
+0x3c,0x02,0x80,0x00,0x00,0x03,0x48,0x80,0x24,0x42,0x7d,0xbc,0x00,0x80,0x98,0x21,
+0x27,0x84,0x90,0x10,0x01,0x24,0x20,0x21,0x93,0xb7,0x00,0x53,0xad,0x02,0x00,0x00,
+0x80,0x83,0x00,0x06,0x27,0x82,0x90,0x04,0x01,0x22,0x10,0x21,0x8c,0x44,0x00,0x18,
+0x24,0x63,0x00,0x02,0x00,0x03,0x17,0xc2,0x8c,0x88,0x00,0x08,0x00,0x62,0x18,0x21,
+0x00,0x03,0x18,0x43,0x00,0x03,0x18,0x40,0xaf,0xa7,0x00,0x4c,0x2c,0xa2,0x00,0x10,
+0x00,0xa0,0xa8,0x21,0x00,0x83,0x50,0x21,0x00,0x08,0x47,0xc2,0x00,0xc0,0x58,0x21,
+0x00,0x00,0xb0,0x21,0x8c,0x92,0x00,0x0c,0x14,0x40,0x00,0x13,0x00,0x00,0xf0,0x21,
+0x92,0x67,0x00,0x04,0x24,0x14,0x00,0x01,0x12,0x87,0x00,0x10,0x02,0x30,0x10,0x21,
+0x27,0x83,0x90,0x18,0x01,0x23,0x18,0x21,0x80,0x64,0x00,0x00,0x27,0x83,0xb5,0x70,
+0x00,0x04,0x11,0x00,0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x23,
+0x00,0x02,0x10,0x80,0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x04,0x00,0x00,0x00,0x00,
+0x10,0x80,0x00,0x23,0x00,0x00,0x00,0x00,0x02,0x30,0x10,0x21,0x00,0x02,0x80,0x80,
+0x24,0x04,0x00,0x01,0x27,0x83,0x90,0x20,0xa2,0x64,0x00,0x12,0x02,0x03,0x18,0x21,
+0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x15,0xc2,0x30,0x42,0x00,0x01,
+0x01,0x02,0x10,0x24,0x14,0x40,0x00,0x0e,0x02,0xa0,0x20,0x21,0x27,0x82,0x90,0x00,
+0x02,0x02,0x10,0x21,0x94,0x43,0x00,0x06,0x00,0x00,0x00,0x00,0xa6,0x63,0x00,0x1a,
+0x94,0x42,0x00,0x06,0x7b,0xbe,0x01,0xfc,0x7b,0xb6,0x01,0xbc,0x7b,0xb4,0x01,0x7c,
+0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,
+0x8f,0xa5,0x00,0x4c,0x01,0x60,0x30,0x21,0x01,0x40,0x38,0x21,0xaf,0xa0,0x00,0x10,
+0x0c,0x00,0x09,0x0a,0xaf,0xa0,0x00,0x14,0x08,0x00,0x1f,0xbb,0x00,0x00,0x00,0x00,
+0x27,0x83,0x90,0x20,0x01,0x23,0x18,0x21,0x8c,0x62,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x02,0x15,0xc2,0x30,0x42,0x00,0x01,0x01,0x02,0x10,0x24,0x14,0x40,0x00,0xaf,
+0x00,0xa0,0x20,0x21,0x32,0x4f,0x00,0x03,0x00,0x12,0x10,0x82,0x25,0xe3,0x00,0x0d,
+0x30,0x45,0x00,0x07,0x00,0x74,0x78,0x04,0x10,0xa0,0x00,0x0e,0x00,0x00,0x90,0x21,
+0x27,0x82,0x80,0x1c,0x00,0x15,0x18,0x40,0x00,0x62,0x18,0x21,0x94,0x64,0x00,0x00,
+0x24,0xa2,0x00,0x06,0x00,0x54,0x10,0x04,0x00,0x44,0x00,0x1a,0x14,0x80,0x00,0x02,
+0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0d,0x00,0x00,0x10,0x12,0x24,0x42,0x00,0x20,
+0x30,0x52,0xff,0xfc,0x02,0x30,0x10,0x21,0x27,0x83,0x90,0x10,0x00,0x02,0x10,0x80,
+0x00,0x43,0x10,0x21,0x90,0x44,0x00,0x03,0x00,0x00,0x00,0x00,0x30,0x83,0x00,0xff,
+0x2c,0x62,0x00,0x0c,0x14,0x40,0x00,0x04,0x2c,0x62,0x00,0x19,0x30,0x82,0x00,0x0f,
+0x24,0x43,0x00,0x0c,0x2c,0x62,0x00,0x19,0x10,0x40,0x00,0x19,0x24,0x0e,0x00,0x20,
+0x24,0x62,0xff,0xe9,0x2c,0x42,0x00,0x02,0x14,0x40,0x00,0x15,0x24,0x0e,0x00,0x10,
+0x24,0x62,0xff,0xeb,0x2c,0x42,0x00,0x02,0x14,0x40,0x00,0x11,0x24,0x0e,0x00,0x08,
+0x24,0x02,0x00,0x14,0x10,0x62,0x00,0x0e,0x24,0x0e,0x00,0x02,0x24,0x62,0xff,0xef,
+0x2c,0x42,0x00,0x03,0x14,0x40,0x00,0x0a,0x24,0x0e,0x00,0x10,0x24,0x62,0xff,0xf1,
+0x2c,0x42,0x00,0x02,0x14,0x40,0x00,0x06,0x24,0x0e,0x00,0x08,0x24,0x62,0xff,0xf3,
+0x2c,0x42,0x00,0x02,0x24,0x0e,0x00,0x04,0x24,0x03,0x00,0x02,0x00,0x62,0x70,0x0a,
+0x30,0xe2,0x00,0xff,0x00,0x00,0x48,0x21,0x00,0x00,0x68,0x21,0x10,0x40,0x00,0x6d,
+0x00,0x00,0x58,0x21,0x3c,0x14,0x80,0xff,0x27,0x99,0x90,0x00,0x01,0xf2,0xc0,0x23,
+0x36,0x94,0xff,0xff,0x01,0xc9,0x10,0x2a,0x14,0x40,0x00,0x64,0x24,0x03,0x00,0x04,
+0x00,0x10,0x28,0xc0,0x00,0xb0,0x10,0x21,0x00,0x02,0x10,0x80,0x00,0x59,0x10,0x21,
+0x94,0x56,0x00,0x06,0x00,0x00,0x00,0x00,0x32,0xcc,0x00,0x03,0x00,0x6c,0x10,0x23,
+0x30,0x42,0x00,0x03,0x02,0xc2,0x10,0x21,0x24,0x42,0x00,0x04,0x30,0x51,0xff,0xff,
+0x02,0x32,0x18,0x2b,0x10,0x60,0x00,0x4d,0x01,0xf1,0x10,0x23,0x02,0x51,0x10,0x23,
+0x01,0x78,0x18,0x2b,0x10,0x60,0x00,0x34,0x30,0x44,0xff,0xff,0x29,0x22,0x00,0x40,
+0x10,0x40,0x00,0x31,0x01,0x72,0x18,0x21,0x25,0x22,0x00,0x01,0x00,0x02,0x16,0x00,
+0x00,0x02,0x4e,0x03,0x00,0xb0,0x10,0x21,0x00,0x02,0x30,0x80,0x27,0x82,0x90,0x04,
+0x30,0x6b,0xff,0xff,0x00,0xc2,0x18,0x21,0x8c,0x67,0x00,0x18,0x00,0x04,0x25,0x40,
+0x3c,0x03,0x7f,0x00,0x8c,0xe2,0x00,0x04,0x00,0x83,0x20,0x24,0x27,0x83,0x90,0x10,
+0x00,0x54,0x10,0x24,0x00,0xc3,0x28,0x21,0x00,0x44,0x10,0x25,0xac,0xe2,0x00,0x04,
+0x16,0xe0,0x00,0x02,0xa0,0xb5,0x00,0x00,0xa0,0xb5,0x00,0x03,0x27,0x84,0x90,0x20,
+0x00,0xc4,0x18,0x21,0x8c,0x62,0x00,0x00,0x8c,0xe8,0x00,0x08,0x00,0x02,0x15,0xc2,
+0x00,0x08,0x47,0xc2,0x30,0x42,0x00,0x01,0x01,0x02,0x10,0x24,0x10,0x40,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x80,0xa2,0x00,0x06,0x00,0x00,0x00,0x00,0x24,0x42,0x00,0x02,
+0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,0x00,0x02,0x10,0x40,
+0x00,0xe2,0x50,0x21,0xa5,0x5e,0x00,0x00,0x92,0x62,0x00,0x04,0x25,0xad,0x00,0x01,
+0x27,0x84,0x90,0x00,0x00,0xc4,0x18,0x21,0x01,0xa2,0x10,0x2a,0x94,0x70,0x00,0x02,
+0x14,0x40,0xff,0xb8,0x00,0x00,0x00,0x00,0x96,0x63,0x00,0x14,0x00,0x0c,0x10,0x23,
+0xa2,0x69,0x00,0x12,0x30,0x42,0x00,0x03,0x01,0x62,0x10,0x23,0x00,0x03,0x80,0xc0,
+0x8f,0xa5,0x00,0x4c,0x30,0x4b,0xff,0xff,0x02,0x03,0x80,0x21,0x27,0x82,0x90,0x08,
+0x00,0x10,0x80,0x80,0xa6,0x6b,0x00,0x1a,0x02,0xa0,0x20,0x21,0x01,0x60,0x30,0x21,
+0x01,0x60,0x88,0x21,0x0c,0x00,0x08,0xe3,0x02,0x02,0x80,0x21,0x00,0x5e,0x10,0x21,
+0xa6,0x02,0x00,0x04,0x08,0x00,0x1f,0xc1,0x02,0x20,0x10,0x21,0x01,0x62,0x10,0x2b,
+0x10,0x40,0xff,0xe9,0x00,0x00,0x20,0x21,0x29,0x22,0x00,0x40,0x10,0x40,0xff,0xe6,
+0x01,0x71,0x18,0x21,0x08,0x00,0x20,0x37,0x25,0x22,0x00,0x01,0x08,0x00,0x20,0x66,
+0x32,0xcc,0x00,0x03,0x08,0x00,0x20,0x66,0x00,0x00,0x60,0x21,0x8f,0xa5,0x00,0x4c,
+0x01,0x40,0x38,0x21,0xaf,0xa0,0x00,0x10,0x0c,0x00,0x09,0x0a,0xaf,0xb4,0x00,0x14,
+0x92,0x67,0x00,0x04,0x08,0x00,0x1f,0xd9,0x30,0x5e,0xff,0xff,0x30,0x84,0xff,0xff,
+0x00,0x04,0x30,0xc0,0x00,0xc4,0x20,0x21,0x00,0x04,0x20,0x80,0x27,0x82,0x90,0x00,
+0x3c,0x03,0xb0,0x08,0x30,0xa5,0xff,0xff,0x00,0x82,0x20,0x21,0x00,0xc3,0x30,0x21,
+0xac,0xc5,0x00,0x00,0x03,0xe0,0x00,0x08,0xa4,0x85,0x00,0x00,0x30,0x84,0xff,0xff,
+0x00,0x04,0x30,0xc0,0x00,0xc4,0x30,0x21,0x27,0x88,0x90,0x00,0x00,0x06,0x30,0x80,
+0x00,0xc8,0x30,0x21,0x94,0xc3,0x00,0x04,0x3c,0x02,0xb0,0x08,0x3c,0x07,0xb0,0x03,
+0x00,0x03,0x20,0xc0,0x00,0x83,0x18,0x21,0x00,0x03,0x18,0x80,0x00,0x82,0x20,0x21,
+0x3c,0x02,0x80,0x01,0x30,0xa5,0xff,0xff,0x00,0x68,0x18,0x21,0x34,0xe7,0x00,0x20,
+0x24,0x42,0x82,0x6c,0xac,0xe2,0x00,0x00,0xa4,0xc5,0x00,0x02,0xa4,0x65,0x00,0x00,
+0x03,0xe0,0x00,0x08,0xac,0x85,0x00,0x00,0x30,0x84,0xff,0xff,0x00,0x04,0x10,0xc0,
+0x00,0x44,0x10,0x21,0x27,0x89,0x90,0x00,0x00,0x02,0x10,0x80,0x00,0x49,0x10,0x21,
+0x97,0x83,0x8f,0xf0,0x94,0x4a,0x00,0x04,0x3c,0x02,0xb0,0x08,0x00,0x03,0x38,0xc0,
+0x00,0x0a,0x40,0xc0,0x00,0xe3,0x18,0x21,0x01,0x0a,0x28,0x21,0x00,0xe2,0x38,0x21,
+0x01,0x02,0x40,0x21,0x00,0x03,0x18,0x80,0x00,0x05,0x28,0x80,0x3c,0x06,0xb0,0x03,
+0x3c,0x02,0x80,0x01,0x00,0xa9,0x28,0x21,0x00,0x69,0x18,0x21,0x34,0xc6,0x00,0x20,
+0x34,0x09,0xff,0xff,0x24,0x42,0x82,0xc8,0xac,0xc2,0x00,0x00,0xa4,0x64,0x00,0x00,
+0xac,0xe4,0x00,0x00,0xa4,0xa9,0x00,0x00,0xad,0x09,0x00,0x00,0xa7,0x8a,0x8f,0xf0,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x63,0x00,0x20,0x24,0x42,0x83,0x48,0x3c,0x04,0xb0,0x03,0xac,0x62,0x00,0x00,
+0x34,0x84,0x01,0x10,0x8c,0x82,0x00,0x00,0x97,0x83,0x81,0x60,0x30,0x42,0xff,0xff,
+0x10,0x62,0x00,0x16,0x24,0x0a,0x00,0x01,0xa7,0x82,0x81,0x60,0xaf,0x80,0xb4,0x50,
+0x00,0x40,0x28,0x21,0x24,0x06,0x00,0x01,0x27,0x84,0xb4,0x54,0x25,0x43,0xff,0xff,
+0x00,0x66,0x10,0x04,0x00,0xa2,0x10,0x24,0x14,0x40,0x00,0x07,0x00,0x00,0x00,0x00,
+0x8c,0x83,0xff,0xfc,0x00,0x00,0x00,0x00,0x00,0x66,0x10,0x04,0x00,0xa2,0x10,0x24,
+0x38,0x42,0x00,0x00,0x01,0x42,0x18,0x0a,0x25,0x4a,0x00,0x01,0x2d,0x42,0x00,0x14,
+0xac,0x83,0x00,0x00,0x14,0x40,0xff,0xf1,0x24,0x84,0x00,0x04,0x3c,0x0b,0xb0,0x03,
+0x00,0x00,0x50,0x21,0x3c,0x0c,0x80,0x00,0x27,0x89,0xb4,0xa0,0x35,0x6b,0x01,0x20,
+0x8d,0x68,0x00,0x00,0x8d,0x23,0x00,0x04,0x01,0x0c,0x10,0x24,0x00,0x02,0x17,0xc2,
+0x11,0x03,0x00,0x37,0xa1,0x22,0x00,0xdc,0xa1,0x20,0x00,0xd5,0xa1,0x20,0x00,0xd6,
+0x01,0x20,0x30,0x21,0x00,0x00,0x38,0x21,0x00,0x00,0x28,0x21,0x01,0x20,0x20,0x21,
+0x00,0xa8,0x10,0x06,0x30,0x42,0x00,0x01,0x10,0xe0,0x00,0x10,0xa0,0x82,0x00,0x0a,
+0x90,0x82,0x00,0x07,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x31,0x24,0xa2,0xff,0xff,
+0xa0,0x82,0x00,0x08,0x90,0x82,0x00,0x0a,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x09,
+0x00,0x00,0x00,0x00,0x90,0x83,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x03,0x10,0x40,
+0x00,0x43,0x10,0x21,0x00,0x46,0x10,0x21,0xa0,0x45,0x00,0x09,0x90,0x82,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x07,0x00,0x00,0x00,0x00,0x14,0xe0,0x00,0x04,
+0x00,0x00,0x00,0x00,0xa0,0xc5,0x00,0xd5,0x24,0x07,0x00,0x01,0xa0,0x85,0x00,0x08,
+0xa0,0xc5,0x00,0xd6,0x24,0xa5,0x00,0x01,0x2c,0xa2,0x00,0x1c,0x14,0x40,0xff,0xe0,
+0x24,0x84,0x00,0x03,0x90,0xc4,0x00,0xd5,0x00,0x00,0x28,0x21,0x00,0xa4,0x10,0x2b,
+0x10,0x40,0x00,0x0b,0x00,0x00,0x00,0x00,0x00,0xc0,0x18,0x21,0xa0,0x64,0x00,0x08,
+0x90,0xc2,0x00,0xd5,0x24,0xa5,0x00,0x01,0xa0,0x62,0x00,0x09,0x90,0xc4,0x00,0xd5,
+0x00,0x00,0x00,0x00,0x00,0xa4,0x10,0x2b,0x14,0x40,0xff,0xf8,0x24,0x63,0x00,0x03,
+0x25,0x4a,0x00,0x01,0x2d,0x42,0x00,0x08,0xad,0x28,0x00,0x04,0x25,0x6b,0x00,0x04,
+0x14,0x40,0xff,0xbf,0x25,0x29,0x00,0xec,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x90,0x82,0x00,0x05,0x08,0x00,0x21,0x0d,0xa0,0x82,0x00,0x08,0x97,0x85,0x8b,0x7a,
+0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x63,0x00,0x20,
+0x24,0x42,0x84,0xfc,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x62,0x00,0x00,
+0x30,0x90,0x00,0xff,0x00,0x05,0x28,0x42,0x00,0x00,0x48,0x21,0x27,0x8f,0xb4,0xa4,
+0x00,0x00,0x50,0x21,0x00,0x00,0x58,0x21,0x27,0x98,0xb5,0x84,0x27,0x99,0xb5,0x80,
+0x27,0x8e,0xb5,0x7e,0x27,0x8c,0xb4,0xa8,0x27,0x8d,0xb5,0x00,0x27,0x88,0xb5,0x78,
+0x00,0x0a,0x18,0x80,0x01,0x6f,0x10,0x21,0xac,0x40,0x00,0x00,0xac,0x45,0x00,0x58,
+0x00,0x6e,0x20,0x21,0x00,0x78,0x10,0x21,0xa1,0x00,0xff,0xfc,0xad,0x00,0x00,0x00,
+0xa1,0x00,0x00,0x04,0xa1,0x00,0x00,0x05,0xad,0x00,0xff,0xf8,0x00,0x79,0x18,0x21,
+0x24,0x06,0x00,0x01,0x24,0xc6,0xff,0xff,0xa0,0x80,0x00,0x00,0xa4,0x60,0x00,0x00,
+0xac,0x40,0x00,0x00,0x24,0x63,0x00,0x02,0x24,0x42,0x00,0x04,0x04,0xc1,0xff,0xf9,
+0x24,0x84,0x00,0x01,0x00,0x0a,0x10,0x80,0x00,0x4d,0x20,0x21,0x00,0x00,0x30,0x21,
+0x00,0x4c,0x18,0x21,0x27,0x87,0x81,0x64,0x8c,0xe2,0x00,0x00,0x24,0xe7,0x00,0x04,
+0xac,0x82,0x00,0x00,0xa0,0x66,0x00,0x00,0xa0,0x66,0x00,0x01,0x24,0xc6,0x00,0x01,
+0x28,0xc2,0x00,0x1c,0xa0,0x60,0x00,0x02,0x24,0x84,0x00,0x04,0x14,0x40,0xff,0xf6,
+0x24,0x63,0x00,0x03,0x25,0x29,0x00,0x01,0x29,0x22,0x00,0x08,0x25,0x4a,0x00,0x3b,
+0x25,0x08,0x00,0xec,0x14,0x40,0xff,0xd6,0x25,0x6b,0x00,0xec,0xa7,0x80,0x81,0x60,
+0x00,0x00,0x48,0x21,0x27,0x83,0xb4,0x50,0xac,0x69,0x00,0x00,0x25,0x29,0x00,0x01,
+0x29,0x22,0x00,0x0c,0x14,0x40,0xff,0xfc,0x24,0x63,0x00,0x04,0x0c,0x00,0x20,0xd2,
+0x00,0x00,0x00,0x00,0x2e,0x04,0x00,0x14,0x27,0x83,0xb4,0xa0,0x24,0x09,0x00,0x07,
+0x10,0x80,0x00,0x0a,0x00,0x00,0x00,0x00,0x90,0x62,0x00,0xd5,0x25,0x29,0xff,0xff,
+0xa0,0x62,0x00,0x00,0x05,0x21,0xff,0xfa,0x24,0x63,0x00,0xec,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x90,0x62,0x00,0xd6,
+0x08,0x00,0x21,0x90,0x25,0x29,0xff,0xff,0x30,0x84,0x00,0xff,0x00,0x04,0x11,0x00,
+0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,0x00,0x44,0x10,0x23,0x00,0x02,0x10,0x80,
+0x27,0x83,0xb4,0xa0,0x00,0x43,0x60,0x21,0x3c,0x04,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x84,0x00,0x20,0x24,0x42,0x86,0x68,0x30,0xc6,0x00,0xff,0x93,0xaa,0x00,0x13,
+0x30,0xa5,0x00,0xff,0x30,0xe7,0x00,0xff,0xac,0x82,0x00,0x00,0x10,0xc0,0x00,0xe8,
+0x25,0x8f,0x00,0xd0,0x91,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x24,0x42,0xff,0xfc,
+0x2c,0x43,0x00,0x18,0x10,0x60,0x00,0xc7,0x3c,0x03,0x80,0x01,0x00,0x02,0x10,0x80,
+0x24,0x63,0x02,0x90,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x30,0x14,0x40,0x00,0x1c,
+0x00,0x00,0x00,0x00,0x10,0xa0,0x00,0x17,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x11,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x0c,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x06,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x42,0xff,0xe0,0x03,0xe0,0x00,0x08,
+0xad,0x82,0x00,0xd0,0x8d,0x82,0x00,0xd0,0x08,0x00,0x21,0xcb,0x24,0x42,0xff,0xe8,
+0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x21,0xcb,
+0x24,0x42,0x00,0x01,0x8d,0x82,0x00,0xd0,0x08,0x00,0x21,0xcb,0x24,0x42,0x00,0x02,
+0x10,0xa0,0xff,0xf9,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x0a,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xe9,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0xe6,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x21,0xcb,0x24,0x42,0xff,0xd0,0x8d,0x82,0x00,0xd0,0x08,0x00,0x21,0xcb,
+0x24,0x42,0xff,0xfc,0x10,0xa0,0xff,0xeb,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0xe5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xe0,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xdb,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x21,0xcb,0x24,0x42,0xff,0xf8,0x2d,0x42,0x00,0x19,0x14,0x40,0xff,0xc5,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xdb,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0xd5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xd0,
+0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0xf1,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x21,0xcb,0x24,0x42,0xff,0xf0,0x2d,0x42,0x00,0x1b,0x10,0x40,0xff,0xf1,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xcb,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0xc5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x14,0xa2,0xff,0xb5,
+0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x21,0xcb,0x24,0x42,0xff,0xf4,
+0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xe3,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xbd,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xb5,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0xd6,0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xc6,0x24,0x02,0x00,0x03,
+0x2d,0x42,0x00,0x23,0x10,0x40,0xff,0xd7,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xae,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xa9,0x24,0x02,0x00,0x02,
+0x14,0xa2,0xff,0xb7,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0x03,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x25,0x10,0x40,0xff,0xcb,0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xd8,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x16,0x14,0x40,0x00,0x0e,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0xa0,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x9a,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x95,0x24,0x02,0x00,0x03,
+0x14,0xa2,0xff,0xb6,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x21,0xcb,
+0x24,0x42,0xff,0xfa,0x10,0xa0,0xff,0x93,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x8d,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x88,
+0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xf3,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x17,
+0x14,0x40,0xff,0xac,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0x34,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x19,0x10,0x40,0xff,0xe2,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0x81,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x7b,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x76,0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0x97,
+0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xc8,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0x51,
+0x2d,0x42,0x00,0x1b,0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xde,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0x70,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x6a,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x65,0x24,0x02,0x00,0x03,
+0x10,0xa2,0xff,0x96,0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xc8,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x23,0x14,0x40,0xff,0xf2,0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xf9,
+0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xf7,0x2d,0x42,0x00,0x25,0x08,0x00,0x22,0x2d,
+0x2d,0x42,0x00,0x27,0x10,0xa0,0xff,0x5b,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x55,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x50,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0x71,0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xe6,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x27,0x14,0x40,0xff,0xad,0x00,0x00,0x00,0x00,
+0x08,0x00,0x22,0x79,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x2a,0x14,0x40,0xff,0xd8,
+0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xe9,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x2c,
+0x14,0x40,0xff,0x78,0x00,0x00,0x00,0x00,0x08,0x00,0x21,0xbd,0x00,0x00,0x00,0x00,
+0x91,0x86,0x00,0x00,0x91,0x83,0x00,0xd4,0x25,0x8d,0x00,0x5c,0x30,0xc4,0x00,0xff,
+0x00,0x04,0x10,0x40,0x00,0x44,0x10,0x21,0x00,0x04,0x48,0x80,0x01,0x82,0x58,0x21,
+0x01,0x89,0x40,0x21,0x25,0x78,0x00,0x08,0x10,0x60,0x00,0x37,0x25,0x0e,0x00,0x60,
+0x2c,0xa2,0x00,0x03,0x14,0x40,0x00,0x25,0x00,0x00,0x00,0x00,0x91,0x82,0x00,0xdd,
+0x00,0x00,0x00,0x00,0x14,0x40,0x00,0x1e,0x00,0x00,0x00,0x00,0x27,0x87,0x81,0x64,
+0x01,0x27,0x10,0x21,0x8c,0x43,0x00,0x00,0x00,0x00,0x00,0x00,0xad,0x03,0x00,0x60,
+0x91,0x62,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x40,0x30,0x21,0xa1,0x82,0x00,0x00,
+0x30,0xc2,0x00,0xff,0x00,0x02,0x10,0x80,0x00,0x47,0x10,0x21,0x8c,0x43,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x03,0x18,0x42,0xad,0xa3,0x00,0x00,0x91,0x84,0x00,0x00,
+0x8d,0xc5,0x00,0x00,0x00,0x04,0x20,0x80,0x00,0x87,0x10,0x21,0x8c,0x43,0x00,0x00,
+0x00,0x05,0x28,0x40,0x00,0x8c,0x20,0x21,0x00,0x03,0x18,0x80,0x00,0xa3,0x10,0x2b,
+0x00,0x62,0x28,0x0a,0xac,0x85,0x00,0x60,0x03,0xe0,0x00,0x08,0xa1,0x80,0x00,0xd4,
+0x27,0x87,0x81,0x64,0x08,0x00,0x22,0xb0,0xa1,0x80,0x00,0xdd,0x27,0x82,0x81,0xd4,
+0x8d,0x83,0x00,0xd8,0x00,0x82,0x10,0x21,0x90,0x44,0x00,0x00,0x24,0x63,0x00,0x01,
+0x00,0x64,0x20,0x2b,0x14,0x80,0xff,0x02,0xad,0x83,0x00,0xd8,0x8d,0x02,0x00,0x60,
+0xa1,0x80,0x00,0xd4,0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,
+0x03,0xe0,0x00,0x08,0xad,0x82,0x00,0x5c,0x10,0xe0,0x00,0x1d,0x24,0x83,0xff,0xfc,
+0x2c,0x62,0x00,0x18,0x10,0x40,0x01,0x10,0x00,0x03,0x10,0x80,0x3c,0x03,0x80,0x01,
+0x24,0x63,0x02,0xf0,0x00,0x43,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x80,0x00,0x08,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x30,0x14,0x40,0x00,0x65,
+0x00,0x00,0x00,0x00,0x10,0xa0,0x00,0x60,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x5a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x08,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x51,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x00,0x00,0x00,0x00,0x24,0x42,0xff,0xe0,0xad,0x82,0x00,0xd0,
+0x8d,0xe3,0x00,0x00,0x8d,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x21,
+0xad,0xa2,0x00,0x00,0xad,0xe0,0x00,0x00,0x8d,0xa3,0x00,0x00,0x8d,0xc4,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x83,0x10,0x2a,0x10,0x40,0x00,0x22,0x00,0x00,0x00,0x00,
+0x93,0x05,0x00,0x01,0x91,0x82,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x45,0x00,0x05,
+0x24,0x02,0x00,0x01,0xa1,0x85,0x00,0x00,0xa1,0x82,0x00,0xd4,0x03,0xe0,0x00,0x08,
+0xad,0x80,0x00,0xd8,0x91,0x82,0x00,0xdd,0x24,0x03,0x00,0x01,0x10,0x43,0x00,0x05,
+0x00,0x00,0x00,0x00,0xa1,0x83,0x00,0xd4,0xad,0x80,0x00,0xd8,0x03,0xe0,0x00,0x08,
+0xa1,0x83,0x00,0xdd,0x00,0x04,0x17,0xc2,0x00,0x82,0x10,0x21,0x00,0x02,0x10,0x43,
+0xad,0xa2,0x00,0x00,0x91,0x83,0x00,0x00,0x27,0x82,0x81,0x64,0x8d,0xc5,0x00,0x00,
+0x00,0x03,0x18,0x80,0x00,0x62,0x18,0x21,0x8c,0x64,0x00,0x00,0x00,0x05,0x28,0x40,
+0x00,0x04,0x18,0x80,0x00,0xa3,0x10,0x2b,0x00,0x62,0x28,0x0a,0x08,0x00,0x22,0xc2,
+0xad,0xc5,0x00,0x00,0x97,0x82,0x8b,0x7c,0x00,0x00,0x00,0x00,0x00,0x62,0x10,0x2a,
+0x10,0x40,0xfe,0xab,0x00,0x00,0x00,0x00,0x91,0x82,0x00,0xdd,0x00,0x00,0x00,0x00,
+0x14,0x40,0x00,0x15,0x00,0x00,0x00,0x00,0x91,0x83,0x00,0x00,0x27,0x82,0x81,0x64,
+0x00,0x03,0x18,0x80,0x00,0x62,0x10,0x21,0x8c,0x44,0x00,0x00,0x00,0x6c,0x18,0x21,
+0xac,0x64,0x00,0x60,0x93,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x05,0x10,0x80,
+0x01,0x82,0x10,0x21,0x24,0x4e,0x00,0x60,0xa1,0x85,0x00,0x00,0x8d,0xc2,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x02,0x1f,0xc2,0x00,0x43,0x10,0x21,0x00,0x02,0x10,0x43,
+0x03,0xe0,0x00,0x08,0xad,0xa2,0x00,0x00,0x08,0x00,0x23,0x37,0xa1,0x80,0x00,0xdd,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x22,0xf3,0x24,0x42,0xff,0xe8,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x22,0xf3,0x24,0x42,0x00,0x01,0x8d,0x82,0x00,0xd0,0x08,0x00,0x22,0xf3,
+0x24,0x42,0x00,0x02,0x10,0xa0,0xff,0xf9,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0x00,0x0a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xa0,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0x9d,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x22,0xf3,0x24,0x42,0xff,0xd0,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x22,0xf3,0x24,0x42,0xff,0xfc,0x10,0xa0,0xff,0xeb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xe5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x93,0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xdd,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x22,0xf3,0x24,0x42,0xff,0xf8,0x2d,0x42,0x00,0x19,
+0x14,0x40,0xff,0x7c,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xdb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xd5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x83,0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0xf1,0x00,0x00,0x00,0x00,
+0x8d,0x82,0x00,0xd0,0x08,0x00,0x22,0xf3,0x24,0x42,0xff,0xf0,0x2d,0x42,0x00,0x1b,
+0x10,0x40,0xff,0xf1,0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xcb,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0xc5,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x14,0xa2,0xff,0x6c,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,0x08,0x00,0x22,0xf3,
+0x24,0x42,0xff,0xf4,0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xe3,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0xbd,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x68,
+0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0xd6,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0xee,
+0x24,0x02,0x00,0x03,0x2d,0x42,0x00,0x23,0x10,0x40,0xff,0xd7,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0xae,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x5c,
+0x24,0x02,0x00,0x02,0x14,0xa2,0xff,0xb7,0x00,0x00,0x00,0x00,0x08,0x00,0x23,0x74,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x25,0x10,0x40,0xff,0xcb,0x00,0x00,0x00,0x00,
+0x08,0x00,0x23,0x49,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x16,0x14,0x40,0x00,0x0e,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0xa0,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x9a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x48,
+0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0xb6,0x00,0x00,0x00,0x00,0x8d,0x82,0x00,0xd0,
+0x08,0x00,0x22,0xf3,0x24,0x42,0xff,0xfa,0x10,0xa0,0xff,0x93,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x8d,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x3b,0x00,0x00,0x00,0x00,0x08,0x00,0x23,0x64,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x17,0x14,0x40,0xff,0xac,0x00,0x00,0x00,0x00,0x08,0x00,0x23,0xa5,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x19,0x10,0x40,0xff,0xe2,0x00,0x00,0x00,0x00,
+0x10,0xa0,0xff,0x81,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x7b,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x29,0x24,0x02,0x00,0x03,
+0x10,0xa2,0xff,0x97,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0xf0,0x00,0x00,0x00,0x00,
+0x08,0x00,0x23,0xc2,0x2d,0x42,0x00,0x1b,0x2d,0x42,0x00,0x1e,0x10,0x40,0xff,0xde,
+0x00,0x00,0x00,0x00,0x10,0xa0,0xff,0x70,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,
+0x10,0xa2,0xff,0x6a,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0xa2,0xff,0x18,
+0x24,0x02,0x00,0x03,0x10,0xa2,0xff,0x96,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0xf0,
+0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x23,0x14,0x40,0xff,0xf2,0x00,0x00,0x00,0x00,
+0x08,0x00,0x23,0x6a,0x00,0x00,0x00,0x00,0x08,0x00,0x23,0x68,0x2d,0x42,0x00,0x25,
+0x08,0x00,0x23,0x9e,0x2d,0x42,0x00,0x27,0x10,0xa0,0xff,0x5b,0x00,0x00,0x00,0x00,
+0x24,0x02,0x00,0x01,0x10,0xa2,0xff,0x55,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,
+0x10,0xa2,0xff,0x03,0x24,0x02,0x00,0x03,0x14,0xa2,0xff,0x71,0x00,0x00,0x00,0x00,
+0x08,0x00,0x23,0x57,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x27,0x14,0x40,0xff,0xad,
+0x00,0x00,0x00,0x00,0x08,0x00,0x23,0xea,0x00,0x00,0x00,0x00,0x2d,0x42,0x00,0x2a,
+0x14,0x40,0xff,0xd8,0x00,0x00,0x00,0x00,0x08,0x00,0x23,0x5a,0x00,0x00,0x00,0x00,
+0x2d,0x42,0x00,0x2c,0x14,0x40,0xff,0x78,0x00,0x00,0x00,0x00,0x08,0x00,0x22,0xe5,
+0x00,0x00,0x00,0x00,0x27,0xbd,0xff,0xe8,0x3c,0x02,0xb0,0x03,0xaf,0xbf,0x00,0x14,
+0xaf,0xb0,0x00,0x10,0x34,0x42,0x01,0x18,0x3c,0x03,0xb0,0x03,0x8c,0x50,0x00,0x00,
+0x34,0x63,0x01,0x2c,0x90,0x62,0x00,0x00,0x32,0x05,0x00,0x01,0xa3,0x82,0x80,0x10,
+0x14,0xa0,0x00,0x14,0x30,0x44,0x00,0xff,0x32,0x02,0x01,0x00,0x14,0x40,0x00,0x09,
+0x00,0x00,0x00,0x00,0x32,0x02,0x08,0x00,0x10,0x40,0x00,0x02,0x24,0x02,0x00,0x01,
+0xa3,0x82,0xbc,0x18,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x0c,0x00,0x05,0x37,0x00,0x00,0x00,0x00,0x26,0x02,0xff,0x00,
+0xa3,0x80,0xbc,0x18,0x3c,0x01,0xb0,0x03,0xac,0x22,0x01,0x18,0x08,0x00,0x24,0x16,
+0x32,0x02,0x08,0x00,0x0c,0x00,0x21,0x3f,0x00,0x00,0x00,0x00,0x26,0x02,0xff,0xff,
+0x3c,0x01,0xb0,0x03,0xac,0x22,0x01,0x18,0x08,0x00,0x24,0x13,0x32,0x02,0x01,0x00,
+0x27,0xbd,0xff,0xe0,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0xd0,0xaf,0xbf,0x00,0x18,
+0x8c,0x43,0x00,0x00,0x3c,0x02,0x00,0x40,0x24,0x07,0x0f,0xff,0x00,0x03,0x33,0x02,
+0x00,0x03,0x2d,0x02,0x00,0x03,0x43,0x02,0x30,0x69,0x0f,0xff,0x00,0x62,0x18,0x24,
+0x30,0xa5,0x00,0x03,0x30,0xc6,0x00,0xff,0x10,0x60,0x00,0x08,0x31,0x08,0x00,0xff,
+0x01,0x00,0x30,0x21,0x0c,0x00,0x24,0xdf,0xaf,0xa9,0x00,0x10,0x8f,0xbf,0x00,0x18,
+0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x0c,0x00,0x25,0x31,
+0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0xd4,0x08,0x00,0x24,0x3f,
+0xac,0x62,0x00,0x00,0x27,0xbd,0xff,0xc0,0x3c,0x02,0xb0,0x03,0xaf,0xbe,0x00,0x38,
+0xaf,0xb5,0x00,0x2c,0xaf,0xb1,0x00,0x1c,0xaf,0xb0,0x00,0x18,0xaf,0xbf,0x00,0x3c,
+0xaf,0xb7,0x00,0x34,0xaf,0xb6,0x00,0x30,0xaf,0xb4,0x00,0x28,0xaf,0xb3,0x00,0x24,
+0xaf,0xb2,0x00,0x20,0x34,0x42,0x00,0x3f,0x90,0x43,0x00,0x00,0x00,0x80,0x80,0x21,
+0x00,0x00,0xf0,0x21,0x00,0x00,0x88,0x21,0x10,0x60,0x00,0x76,0x00,0x00,0xa8,0x21,
+0x3c,0x01,0xb0,0x03,0xa0,0x20,0x00,0x3f,0x00,0x10,0x12,0x02,0x24,0x04,0x06,0x14,
+0x0c,0x00,0x06,0xd1,0x30,0x54,0x00,0x0f,0x24,0x04,0x06,0x14,0x0c,0x00,0x06,0xd1,
+0xaf,0xa2,0x00,0x10,0x3c,0x03,0x00,0xff,0x34,0x63,0xff,0xff,0x32,0x10,0x00,0x7f,
+0x00,0x43,0x10,0x24,0x00,0x10,0x86,0x00,0x02,0x02,0x80,0x25,0x02,0x00,0x28,0x21,
+0x24,0x04,0x06,0x14,0x3c,0x13,0xbf,0xff,0x0c,0x00,0x06,0xbf,0x3c,0x16,0xb0,0x03,
+0x00,0x00,0x90,0x21,0x3c,0x17,0x40,0x00,0x36,0x73,0xff,0xff,0x36,0xd6,0x00,0x3e,
+0x0c,0x00,0x06,0xd1,0x24,0x04,0x04,0x00,0x00,0x57,0x10,0x25,0x00,0x40,0x28,0x21,
+0x0c,0x00,0x06,0xbf,0x24,0x04,0x04,0x00,0x00,0x00,0x80,0x21,0x0c,0x00,0x25,0xf9,
+0x00,0x00,0x00,0x00,0x26,0x03,0x00,0x01,0x10,0x40,0x00,0x46,0x30,0x70,0x00,0xff,
+0x12,0x00,0xff,0xfa,0x00,0x00,0x00,0x00,0x0c,0x00,0x06,0xd1,0x24,0x04,0x04,0x00,
+0x00,0x53,0x10,0x24,0x00,0x40,0x28,0x21,0x0c,0x00,0x06,0xbf,0x24,0x04,0x04,0x00,
+0x24,0x02,0x00,0x01,0x12,0x82,0x00,0x37,0x00,0x00,0x00,0x00,0x12,0x80,0x00,0x35,
+0x00,0x00,0x00,0x00,0x32,0x31,0x00,0x7f,0x12,0x20,0x00,0x04,0x24,0x03,0x00,0x04,
+0x27,0xc2,0x00,0x01,0x30,0x5e,0x00,0xff,0x02,0xb1,0xa8,0x21,0x12,0x43,0x00,0x2a,
+0x3c,0x03,0xb0,0x03,0x02,0x43,0x10,0x21,0xa0,0x51,0x00,0x34,0x26,0x42,0x00,0x01,
+0x30,0x52,0x00,0xff,0x2e,0x43,0x00,0x05,0x14,0x60,0xff,0xd9,0x00,0x00,0x00,0x00,
+0x8f,0xa5,0x00,0x10,0x0c,0x00,0x06,0xbf,0x24,0x04,0x06,0x14,0x12,0xa0,0x00,0x0e,
+0x3c,0x02,0xb0,0x03,0x13,0xc0,0x00,0x0d,0x34,0x42,0x00,0x3c,0x00,0x15,0x10,0x40,
+0x00,0x55,0x10,0x21,0x00,0x02,0x10,0xc0,0x00,0x55,0x10,0x21,0x00,0x02,0xa8,0x80,
+0x02,0xbe,0x00,0x1b,0x17,0xc0,0x00,0x02,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x0d,
+0x00,0x00,0xa8,0x12,0x3c,0x02,0xb0,0x03,0x34,0x42,0x00,0x3c,0x3c,0x03,0xb0,0x03,
+0x3c,0x04,0xb0,0x03,0xa4,0x55,0x00,0x00,0x34,0x63,0x00,0x1c,0x34,0x84,0x00,0x1d,
+0x24,0x02,0x00,0x01,0xa0,0x60,0x00,0x00,0xa0,0x82,0x00,0x00,0x7b,0xbe,0x01,0xfc,
+0x7b,0xb6,0x01,0xbc,0x7b,0xb4,0x01,0x7c,0x7b,0xb2,0x01,0x3c,0x7b,0xb0,0x00,0xfc,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x40,0xa2,0xd1,0x00,0x00,0x08,0x00,0x24,0x98,
+0x26,0x42,0x00,0x01,0x0c,0x00,0x06,0xd1,0x24,0x04,0x04,0xfc,0x08,0x00,0x24,0x8d,
+0x00,0x40,0x88,0x21,0x3c,0x03,0xb0,0x03,0x34,0x63,0x00,0x3c,0x3c,0x04,0xb0,0x03,
+0x3c,0x05,0xb0,0x03,0xa4,0x60,0x00,0x00,0x34,0x84,0x00,0x1c,0x34,0xa5,0x00,0x1d,
+0x24,0x02,0x00,0x02,0x24,0x03,0x00,0x01,0xa0,0x82,0x00,0x00,0x08,0x00,0x24,0xb7,
+0xa0,0xa3,0x00,0x00,0x0c,0x00,0x17,0x99,0x00,0x00,0x00,0x00,0x10,0x40,0xff,0x8b,
+0x00,0x10,0x12,0x02,0x3c,0x02,0xb0,0x03,0x3c,0x04,0xb0,0x03,0x34,0x42,0x00,0x3c,
+0x34,0x84,0x00,0x14,0x24,0x03,0x00,0x01,0xa4,0x40,0x00,0x00,0x3c,0x01,0xb0,0x03,
+0xa0,0x23,0x00,0x3f,0x08,0x00,0x24,0xb7,0xac,0x90,0x00,0x00,0x27,0xbd,0xff,0xd8,
+0xaf,0xb0,0x00,0x10,0x30,0xd0,0x00,0xff,0x2e,0x02,0x00,0x2e,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,0x30,0xb1,0x00,0xff,
+0x14,0x40,0x00,0x06,0x00,0x80,0x90,0x21,0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,
+0x7b,0xb0,0x00,0xbc,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x2e,0x13,0x00,0x10,
+0x24,0x05,0x00,0x14,0x0c,0x00,0x13,0xa4,0x24,0x06,0x01,0x07,0x12,0x60,0x00,0x38,
+0x02,0x00,0x30,0x21,0x8f,0xa2,0x00,0x38,0x30,0xc3,0x00,0x3f,0x3c,0x04,0xb0,0x09,
+0x00,0x02,0x14,0x00,0x00,0x43,0x30,0x25,0x34,0x84,0x01,0x60,0x90,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xfd,0x24,0x02,0x00,0x01,0x12,0x22,0x00,0x2a,
+0x2a,0x22,0x00,0x02,0x14,0x40,0x00,0x24,0x24,0x02,0x00,0x02,0x12,0x22,0x00,0x20,
+0x24,0x02,0x00,0x03,0x12,0x22,0x00,0x19,0x00,0x00,0x00,0x00,0x16,0x60,0xff,0xe2,
+0x24,0x02,0x00,0x01,0x12,0x22,0x00,0x13,0x2a,0x22,0x00,0x02,0x14,0x40,0x00,0x0d,
+0x24,0x02,0x00,0x02,0x12,0x22,0x00,0x09,0x24,0x02,0x00,0x03,0x16,0x22,0xff,0xda,
+0x00,0x00,0x00,0x00,0x24,0x04,0x08,0x4c,0x24,0x05,0xff,0xff,0x0c,0x00,0x13,0x5f,
+0x3c,0x06,0x0c,0xb8,0x08,0x00,0x24,0xea,0x00,0x00,0x00,0x00,0x08,0x00,0x25,0x12,
+0x24,0x04,0x08,0x48,0x16,0x20,0xff,0xd0,0x00,0x00,0x00,0x00,0x08,0x00,0x25,0x12,
+0x24,0x04,0x08,0x40,0x08,0x00,0x25,0x12,0x24,0x04,0x08,0x44,0x24,0x04,0x08,0x4c,
+0x0c,0x00,0x13,0x5f,0x24,0x05,0xff,0xff,0x08,0x00,0x25,0x07,0x00,0x00,0x00,0x00,
+0x08,0x00,0x25,0x20,0x24,0x04,0x08,0x48,0x16,0x20,0xff,0xe0,0x00,0x00,0x00,0x00,
+0x08,0x00,0x25,0x20,0x24,0x04,0x08,0x40,0x08,0x00,0x25,0x20,0x24,0x04,0x08,0x44,
+0x02,0x40,0x20,0x21,0x0c,0x00,0x25,0x71,0x02,0x20,0x28,0x21,0x08,0x00,0x24,0xf5,
+0x00,0x40,0x30,0x21,0x27,0xbd,0xff,0xd8,0x2c,0xc2,0x00,0x2e,0xaf,0xb2,0x00,0x18,
+0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x20,0xaf,0xb3,0x00,0x1c,
+0x00,0xc0,0x80,0x21,0x30,0xb1,0x00,0xff,0x00,0x80,0x90,0x21,0x14,0x40,0x00,0x07,
+0x00,0x00,0x18,0x21,0x8f,0xbf,0x00,0x20,0x7b,0xb2,0x00,0xfc,0x7b,0xb0,0x00,0xbc,
+0x00,0x60,0x10,0x21,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x28,0x2e,0x13,0x00,0x10,
+0x24,0x05,0x00,0x14,0x0c,0x00,0x13,0xa4,0x24,0x06,0x01,0x07,0x12,0x60,0x00,0x24,
+0x02,0x00,0x30,0x21,0x3c,0x03,0xb0,0x09,0x34,0x63,0x01,0x60,0x90,0x62,0x00,0x00,
+0x00,0x00,0x00,0x00,0x14,0x40,0xff,0xfd,0x30,0xc5,0x00,0x3f,0x0c,0x00,0x25,0xae,
+0x02,0x20,0x20,0x21,0x16,0x60,0x00,0x0a,0x00,0x40,0x80,0x21,0x24,0x02,0x00,0x01,
+0x12,0x22,0x00,0x15,0x2a,0x22,0x00,0x02,0x14,0x40,0x00,0x0f,0x24,0x02,0x00,0x02,
+0x12,0x22,0x00,0x0b,0x24,0x02,0x00,0x03,0x12,0x22,0x00,0x03,0x00,0x00,0x00,0x00,
+0x08,0x00,0x25,0x3d,0x02,0x00,0x18,0x21,0x24,0x04,0x08,0x4c,0x24,0x05,0xff,0xff,
+0x0c,0x00,0x13,0x5f,0x3c,0x06,0x0c,0xb8,0x08,0x00,0x25,0x3d,0x02,0x00,0x18,0x21,
+0x08,0x00,0x25,0x5f,0x24,0x04,0x08,0x48,0x16,0x20,0xff,0xf5,0x00,0x00,0x00,0x00,
+0x08,0x00,0x25,0x5f,0x24,0x04,0x08,0x40,0x08,0x00,0x25,0x5f,0x24,0x04,0x08,0x44,
+0x02,0x40,0x20,0x21,0x0c,0x00,0x25,0x71,0x02,0x20,0x28,0x21,0x08,0x00,0x25,0x49,
+0x00,0x40,0x30,0x21,0x27,0xbd,0xff,0xe8,0x2c,0xc2,0x00,0x1f,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x14,0x00,0xc0,0x80,0x21,0x14,0x40,0x00,0x1d,0x30,0xa5,0x00,0xff,
+0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x18,0x28,0xa2,0x00,0x02,0x14,0x40,0x00,0x12,
+0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x0e,0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x07,
+0x24,0x04,0x08,0x4c,0x26,0x10,0xff,0xe2,0x02,0x00,0x10,0x21,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x24,0x05,0xff,0xff,
+0x0c,0x00,0x13,0x5f,0x3c,0x06,0x0d,0xf8,0x08,0x00,0x25,0x82,0x26,0x10,0xff,0xe2,
+0x08,0x00,0x25,0x87,0x24,0x04,0x08,0x48,0x14,0xa0,0xff,0xf2,0x24,0x04,0x08,0x40,
+0x08,0x00,0x25,0x88,0x24,0x05,0xff,0xff,0x08,0x00,0x25,0x87,0x24,0x04,0x08,0x44,
+0x2c,0xc2,0x00,0x10,0x14,0x40,0xff,0xec,0x24,0x02,0x00,0x01,0x10,0xa2,0x00,0x14,
+0x28,0xa2,0x00,0x02,0x14,0x40,0x00,0x0e,0x24,0x02,0x00,0x02,0x10,0xa2,0x00,0x0a,
+0x24,0x02,0x00,0x03,0x10,0xa2,0x00,0x03,0x24,0x04,0x08,0x4c,0x08,0x00,0x25,0x82,
+0x26,0x10,0xff,0xf1,0x24,0x05,0xff,0xff,0x0c,0x00,0x13,0x5f,0x3c,0x06,0x0d,0xb8,
+0x08,0x00,0x25,0x82,0x26,0x10,0xff,0xf1,0x08,0x00,0x25,0xa1,0x24,0x04,0x08,0x48,
+0x14,0xa0,0xff,0xf6,0x24,0x04,0x08,0x40,0x08,0x00,0x25,0xa2,0x24,0x05,0xff,0xff,
+0x08,0x00,0x25,0xa1,0x24,0x04,0x08,0x44,0x27,0xbd,0xff,0xe8,0x30,0x84,0x00,0xff,
+0x24,0x02,0x00,0x01,0x10,0x82,0x00,0x39,0xaf,0xbf,0x00,0x10,0x28,0x82,0x00,0x02,
+0x14,0x40,0x00,0x27,0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x02,0x10,0x82,0x00,0x17,
+0x00,0xa0,0x30,0x21,0x24,0x02,0x00,0x03,0x10,0x82,0x00,0x05,0x24,0x04,0x08,0x3c,
+0x8f,0xbf,0x00,0x10,0x00,0x00,0x00,0x00,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,
+0x0c,0x00,0x13,0x5f,0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x3c,0x3c,0x05,0x80,0x00,
+0x0c,0x00,0x13,0x5f,0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x3c,0x3c,0x05,0x80,0x00,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x01,0x24,0x04,0x08,0xac,0x0c,0x00,0x13,0x41,
+0x24,0x05,0x0f,0xff,0x08,0x00,0x25,0xbc,0x00,0x00,0x00,0x00,0x24,0x04,0x08,0x34,
+0x0c,0x00,0x13,0x5f,0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x34,0x3c,0x05,0x80,0x00,
+0x0c,0x00,0x13,0x5f,0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x34,0x3c,0x05,0x80,0x00,
+0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x01,0x08,0x00,0x25,0xcb,0x24,0x04,0x08,0xa8,
+0x14,0x80,0xff,0xdf,0x00,0xa0,0x30,0x21,0x24,0x04,0x08,0x24,0x0c,0x00,0x13,0x5f,
+0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x24,0x3c,0x05,0x80,0x00,0x0c,0x00,0x13,0x5f,
+0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x24,0x3c,0x05,0x80,0x00,0x0c,0x00,0x13,0x5f,
+0x24,0x06,0x00,0x01,0x08,0x00,0x25,0xcb,0x24,0x04,0x08,0xa0,0x00,0xa0,0x30,0x21,
+0x24,0x04,0x08,0x2c,0x0c,0x00,0x13,0x5f,0x3c,0x05,0x3f,0x00,0x24,0x04,0x08,0x2c,
+0x3c,0x05,0x80,0x00,0x0c,0x00,0x13,0x5f,0x00,0x00,0x30,0x21,0x24,0x04,0x08,0x2c,
+0x3c,0x05,0x80,0x00,0x0c,0x00,0x13,0x5f,0x24,0x06,0x00,0x01,0x08,0x00,0x25,0xcb,
+0x24,0x04,0x08,0xa4,0x3c,0x05,0x00,0x14,0x3c,0x02,0xb0,0x05,0x34,0x42,0x04,0x20,
+0x3c,0x06,0xc0,0x00,0x3c,0x03,0xb0,0x05,0x3c,0x04,0xb0,0x05,0x34,0xa5,0x17,0x09,
+0xac,0x45,0x00,0x00,0x34,0xc6,0x05,0x07,0x34,0x63,0x04,0x24,0x34,0x84,0x02,0x28,
+0x3c,0x07,0xb0,0x05,0x24,0x02,0x00,0x20,0xac,0x66,0x00,0x00,0x34,0xe7,0x04,0x50,
+0xa0,0x82,0x00,0x00,0x90,0xe2,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x03,
+0x10,0x40,0xff,0xfc,0x24,0x02,0x00,0x01,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x93,0x85,0x81,0xf1,0x24,0x02,0x00,0x01,0x14,0xa2,0x00,0x53,0x00,0x80,0x40,0x21,
+0x8c,0x89,0x00,0x04,0x3c,0x02,0xb0,0x01,0x01,0x22,0x30,0x21,0x8c,0xc3,0x00,0x04,
+0x3c,0x02,0x01,0x00,0x00,0x62,0x10,0x24,0x10,0x40,0x00,0x4b,0x30,0x62,0x00,0x08,
+0x10,0x45,0x00,0x59,0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x38,0x24,0x03,0x00,0xb4,
+0x30,0x44,0x00,0xff,0x10,0x83,0x00,0x61,0x24,0x02,0x00,0xc4,0x10,0x82,0x00,0x54,
+0x24,0x02,0x00,0x94,0x10,0x82,0x00,0x45,0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x38,
+0x00,0x00,0x00,0x00,0x30,0x47,0xff,0xff,0x30,0xe3,0x40,0xff,0x24,0x02,0x40,0x88,
+0x14,0x62,0x00,0x39,0x30,0xe3,0x03,0x00,0x24,0x02,0x03,0x00,0x10,0x62,0x00,0x38,
+0x00,0x00,0x00,0x00,0x94,0xc2,0x00,0x56,0x00,0x00,0x00,0x00,0x30,0x47,0xff,0xff,
+0x30,0xe2,0x00,0x80,0x14,0x40,0x00,0x30,0x3c,0x02,0xb0,0x01,0x01,0x22,0x30,0x21,
+0x94,0xc3,0x00,0x60,0x24,0x02,0x00,0x08,0x14,0x43,0x00,0x3b,0x00,0x00,0x00,0x00,
+0x90,0xc2,0x00,0x62,0x24,0x03,0x00,0x04,0x00,0x02,0x39,0x02,0x10,0xe3,0x00,0x15,
+0x24,0x02,0x00,0x06,0x14,0xe2,0x00,0x34,0x00,0x00,0x00,0x00,0x8d,0x05,0x01,0xac,
+0x94,0xc4,0x00,0x66,0x27,0x82,0x89,0x68,0x00,0x05,0x28,0x80,0x30,0x87,0xff,0xff,
+0x00,0xa2,0x28,0x21,0x00,0x07,0x1a,0x00,0x8c,0xa4,0x00,0x00,0x00,0x07,0x12,0x02,
+0x00,0x43,0x10,0x25,0x24,0x42,0x00,0x5e,0x24,0x03,0xc0,0x00,0x30,0x47,0xff,0xff,
+0x00,0x83,0x20,0x24,0x00,0x87,0x20,0x25,0xac,0xa4,0x00,0x00,0x08,0x00,0x26,0x76,
+0xad,0x07,0x00,0x10,0x8d,0x05,0x01,0xac,0x94,0xc4,0x00,0x64,0x27,0x82,0x89,0x68,
+0x00,0x05,0x28,0x80,0x30,0x87,0xff,0xff,0x00,0xa2,0x28,0x21,0x00,0x07,0x1a,0x00,
+0x8c,0xa4,0x00,0x00,0x00,0x07,0x12,0x02,0x00,0x43,0x10,0x25,0x24,0x42,0x00,0x36,
+0x3c,0x03,0xff,0xff,0x30,0x47,0xff,0xff,0x00,0x83,0x20,0x24,0x00,0x87,0x20,0x25,
+0xac,0xa4,0x00,0x00,0xad,0x07,0x00,0x10,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x94,0xc2,0x00,0x50,0x08,0x00,0x26,0x34,0x30,0x47,0xff,0xff,0x8d,0x04,0x01,0xac,
+0x27,0x83,0x89,0x68,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,0x8c,0x82,0x00,0x00,
+0x3c,0x03,0xff,0xff,0x00,0x43,0x10,0x24,0x34,0x42,0x00,0x2e,0xac,0x82,0x00,0x00,
+0x24,0x03,0x00,0x2e,0xad,0x03,0x00,0x10,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x8d,0x04,0x01,0xac,0x27,0x83,0x89,0x68,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,
+0x8c,0x82,0x00,0x00,0x3c,0x03,0xff,0xff,0x00,0x43,0x10,0x24,0x34,0x42,0x00,0x0e,
+0x24,0x03,0x00,0x0e,0x08,0x00,0x26,0x75,0xac,0x82,0x00,0x00,0x8d,0x04,0x01,0xac,
+0x27,0x83,0x89,0x68,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,0x8c,0x82,0x00,0x00,
+0x3c,0x03,0xff,0xff,0x00,0x43,0x10,0x24,0x34,0x42,0x00,0x14,0x24,0x03,0x00,0x14,
+0x08,0x00,0x26,0x75,0xac,0x82,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x30,0xc6,0x00,0xff,0x00,0x06,0x48,0x40,0x01,0x26,0x10,0x21,0x00,0x02,0x10,0x80,
+0x27,0x8b,0xbc,0x30,0x27,0x83,0xbc,0x36,0x00,0x4b,0x40,0x21,0x00,0x43,0x10,0x21,
+0x94,0x47,0x00,0x00,0x30,0xa2,0x3f,0xff,0x10,0xe2,0x00,0x29,0x30,0x8a,0xff,0xff,
+0x95,0x02,0x00,0x02,0x24,0x03,0x00,0x01,0x00,0x02,0x11,0x82,0x30,0x42,0x00,0x01,
+0x10,0x43,0x00,0x18,0x00,0x00,0x00,0x00,0x01,0x26,0x10,0x21,0x00,0x02,0x10,0x80,
+0x00,0x4b,0x30,0x21,0x94,0xc4,0x00,0x02,0x27,0x83,0xbc,0x36,0x27,0x85,0xbc,0x34,
+0x00,0x45,0x28,0x21,0x30,0x84,0xff,0xdf,0x00,0x43,0x10,0x21,0xa4,0xc4,0x00,0x02,
+0xa4,0x40,0x00,0x00,0xa4,0xa0,0x00,0x00,0x94,0xc3,0x00,0x02,0x3c,0x04,0xb0,0x01,
+0x01,0x44,0x20,0x21,0x30,0x63,0xff,0xbf,0xa4,0xc3,0x00,0x02,0xa0,0xc0,0x00,0x00,
+0x8c,0x82,0x00,0x04,0x24,0x03,0xf0,0xff,0x00,0x43,0x10,0x24,0x03,0xe0,0x00,0x08,
+0xac,0x82,0x00,0x04,0x24,0x02,0xc0,0x00,0x91,0x04,0x00,0x01,0x00,0xa2,0x10,0x24,
+0x00,0x47,0x28,0x25,0x3c,0x03,0xb0,0x01,0x24,0x02,0x00,0x02,0x14,0x82,0xff,0xe2,
+0x01,0x43,0x18,0x21,0xac,0x65,0x00,0x00,0x08,0x00,0x26,0xa3,0x01,0x26,0x10,0x21,
+0x08,0x00,0x26,0xa3,0x01,0x26,0x10,0x21,0x93,0x83,0x81,0xf1,0x24,0x02,0x00,0x01,
+0x14,0x62,0x00,0x0d,0x3c,0x02,0xb0,0x01,0x8c,0x84,0x00,0x04,0x3c,0x06,0xb0,0x09,
+0x00,0x82,0x20,0x21,0x8c,0x85,0x00,0x08,0x8c,0x83,0x00,0x04,0x3c,0x02,0x01,0x00,
+0x34,0xc6,0x01,0x00,0x00,0x62,0x18,0x24,0x14,0x60,0x00,0x05,0x30,0xa5,0x20,0x00,
+0x24,0x02,0x00,0x06,0xa0,0xc2,0x00,0x00,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,
+0x3c,0x03,0xb0,0x09,0x10,0xa0,0xff,0xfc,0x34,0x63,0x01,0x00,0x24,0x02,0x00,0x0e,
+0x08,0x00,0x26,0xd6,0xa0,0x62,0x00,0x00,0x3c,0x02,0xb0,0x01,0x30,0xa5,0xff,0xff,
+0x00,0xa2,0x28,0x21,0x8c,0xa3,0x00,0x00,0x3c,0x02,0x10,0x00,0x00,0x80,0x30,0x21,
+0x00,0x62,0x18,0x24,0x8c,0xa2,0x00,0x04,0x10,0x60,0x00,0x04,0x00,0x00,0x00,0x00,
+0x30,0x42,0x80,0x00,0x10,0x40,0x00,0x13,0x00,0x00,0x00,0x00,0x8c,0xc2,0x01,0xa8,
+0x00,0x00,0x00,0x00,0x24,0x44,0x00,0x01,0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x40,
+0x00,0x83,0x10,0x0a,0x93,0x83,0x81,0xf0,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,
+0x00,0x82,0x20,0x23,0x24,0x63,0xff,0xff,0xac,0xc4,0x01,0xa8,0xa3,0x83,0x81,0xf0,
+0x8c,0xc4,0x01,0xac,0x8c,0xc2,0x01,0xa8,0x00,0x00,0x00,0x00,0x00,0x44,0x10,0x26,
+0x00,0x02,0x10,0x2b,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x3c,0x03,0xb0,0x03,
+0x34,0x63,0x00,0x73,0x90,0x62,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x42,0x00,0x01,
+0x14,0x40,0x00,0x04,0x00,0x00,0x00,0x00,0xa3,0x80,0x81,0xf1,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x24,0x02,0x00,0x01,0xa3,0x82,0x81,0xf1,0x03,0xe0,0x00,0x08,
+0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x04,0x3c,0x05,0xb0,0x01,0x00,0x80,0x50,0x21,
+0x00,0x45,0x10,0x21,0x8c,0x43,0x00,0x04,0x24,0x02,0x00,0x05,0x00,0x03,0x1a,0x02,
+0x30,0x69,0x00,0x0f,0x11,0x22,0x00,0x0b,0x24,0x02,0x00,0x07,0x11,0x22,0x00,0x09,
+0x24,0x02,0x00,0x0a,0x11,0x22,0x00,0x07,0x24,0x02,0x00,0x0b,0x11,0x22,0x00,0x05,
+0x24,0x02,0x00,0x01,0x93,0x83,0x81,0xf0,0x3c,0x04,0xb0,0x06,0x10,0x62,0x00,0x03,
+0x34,0x84,0x80,0x18,0x03,0xe0,0x00,0x08,0x00,0x00,0x00,0x00,0x8c,0x82,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x02,0x17,0x02,0x14,0x40,0xff,0xfa,0x00,0x00,0x00,0x00,
+0x8d,0x43,0x01,0xa8,0x27,0x82,0x89,0x68,0x00,0x03,0x18,0x80,0x00,0x6a,0x20,0x21,
+0x8c,0x87,0x00,0xa8,0x00,0x62,0x18,0x21,0x8c,0x68,0x00,0x00,0x00,0xe5,0x28,0x21,
+0x8c,0xa9,0x00,0x00,0x3c,0x02,0xff,0xff,0x27,0x83,0x8a,0x68,0x01,0x22,0x10,0x24,
+0x00,0x48,0x10,0x25,0xac,0xa2,0x00,0x00,0x8d,0x44,0x01,0xa8,0x00,0x07,0x30,0xc2,
+0x3c,0x02,0x00,0x80,0x00,0x04,0x20,0x80,0x00,0x83,0x20,0x21,0x00,0x06,0x32,0x00,
+0x8c,0xa9,0x00,0x04,0x00,0xc2,0x30,0x25,0x8c,0x82,0x00,0x00,0x3c,0x03,0x80,0x00,
+0x01,0x22,0x10,0x25,0x00,0x43,0x10,0x25,0xac,0xa2,0x00,0x04,0xaf,0x87,0xbc,0x20,
+0x8c,0xa2,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x82,0xbc,0x28,0x8c,0xa3,0x00,0x04,
+0x3c,0x01,0xb0,0x07,0xac,0x26,0x80,0x18,0x8d,0x42,0x01,0xa8,0xaf,0x83,0xbc,0x24,
+0x93,0x85,0x81,0xf0,0x24,0x44,0x00,0x01,0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x40,
+0x00,0x83,0x10,0x0a,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,0x24,0xa5,0xff,0xff,
+0x00,0x82,0x20,0x23,0xad,0x44,0x01,0xa8,0xa3,0x85,0x81,0xf0,0x08,0x00,0x27,0x21,
+0x00,0x00,0x00,0x00,0x3c,0x05,0xb0,0x03,0x3c,0x02,0x80,0x01,0x34,0xa5,0x00,0x20,
+0x24,0x42,0x9d,0x64,0xac,0xa2,0x00,0x00,0x24,0x02,0x00,0x02,0x24,0x03,0x00,0x20,
+0xac,0x82,0x00,0x64,0x3c,0x02,0x80,0x01,0xac,0x83,0x00,0x60,0xac,0x80,0x00,0x00,
+0xac,0x80,0x00,0x04,0xac,0x80,0x00,0x08,0xac,0x80,0x00,0x4c,0xac,0x80,0x00,0x50,
+0xac,0x80,0x00,0x54,0xac,0x80,0x00,0x0c,0xac,0x80,0x00,0x58,0xa0,0x80,0x00,0x5c,
+0x24,0x42,0x9e,0x28,0x24,0x83,0x00,0x68,0x24,0x05,0x00,0x0f,0x24,0xa5,0xff,0xff,
+0xac,0x62,0x00,0x00,0x04,0xa1,0xff,0xfd,0x24,0x63,0x00,0x04,0x3c,0x02,0x80,0x01,
+0x24,0x42,0x9f,0x10,0xac,0x82,0x00,0x78,0x3c,0x03,0x80,0x01,0x3c,0x02,0x80,0x01,
+0x24,0x63,0xa0,0x9c,0x24,0x42,0xa0,0x08,0xac,0x83,0x00,0x88,0xac,0x82,0x00,0x98,
+0x3c,0x03,0x80,0x01,0x3c,0x02,0x80,0x01,0x24,0x63,0xa1,0x44,0x24,0x42,0xa2,0x5c,
+0xac,0x83,0x00,0xa0,0xac,0x82,0x00,0xa4,0xa0,0x80,0x01,0xba,0xac,0x80,0x01,0xa8,
+0xac,0x80,0x01,0xac,0xac,0x80,0x01,0xb0,0xac,0x80,0x01,0xb4,0xa0,0x80,0x01,0xb8,
+0x03,0xe0,0x00,0x08,0xa0,0x80,0x01,0xb9,0x3c,0x03,0xb0,0x03,0x3c,0x02,0x80,0x01,
+0x34,0x63,0x00,0x20,0x24,0x42,0x9e,0x28,0x03,0xe0,0x00,0x08,0xac,0x62,0x00,0x00,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x34,0x42,0x00,0x20,0x24,0x63,0x9e,0x40,
+0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x10,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x11,
+0x00,0x80,0x28,0x21,0x8c,0x82,0x00,0x14,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0d,
+0x00,0x00,0x00,0x00,0x8c,0x84,0x00,0x10,0x8c,0xa3,0x00,0x14,0x8c,0xa2,0x00,0x04,
+0x00,0x83,0x20,0x21,0x00,0x44,0x10,0x21,0x30,0x43,0x00,0xff,0x00,0x03,0x18,0x2b,
+0x00,0x02,0x12,0x02,0x00,0x43,0x10,0x21,0x00,0x02,0x12,0x00,0x30,0x42,0x3f,0xff,
+0xac,0xa2,0x00,0x04,0xac,0xa0,0x00,0x00,0xac,0xa0,0x00,0x4c,0xac,0xa0,0x00,0x50,
+0xac,0xa0,0x00,0x54,0x03,0xe0,0x00,0x08,0xac,0xa0,0x00,0x0c,0x3c,0x03,0xb0,0x03,
+0x3c,0x02,0x80,0x01,0x34,0x63,0x00,0x20,0x24,0x42,0x9e,0xbc,0xac,0x62,0x00,0x00,
+0x8c,0x86,0x00,0x04,0x3c,0x02,0xb0,0x01,0x24,0x03,0x00,0x01,0x00,0xc2,0x10,0x21,
+0x8c,0x45,0x00,0x00,0xac,0x83,0x00,0x4c,0x00,0x05,0x14,0x02,0x30,0xa3,0x3f,0xff,
+0x30,0x42,0x00,0xff,0xac,0x83,0x00,0x10,0xac,0x82,0x00,0x14,0x8c,0x83,0x00,0x14,
+0xac,0x85,0x00,0x40,0x00,0xc3,0x30,0x21,0x03,0xe0,0x00,0x08,0xac,0x86,0x00,0x08,
+0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,
+0x24,0x63,0x9f,0x10,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,
+0x8c,0x82,0x00,0x4c,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x0a,0x00,0x80,0x80,0x21,
+0xae,0x00,0x00,0x00,0xae,0x00,0x00,0x4c,0xae,0x00,0x00,0x50,0xae,0x00,0x00,0x54,
+0xae,0x00,0x00,0x0c,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x0c,0x00,0x27,0xaf,0x00,0x00,0x00,0x00,0x08,0x00,0x27,0xd1,
+0xae,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,
+0x34,0x42,0x00,0x20,0x24,0x63,0x9f,0x74,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,
+0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x4c,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x16,
+0x00,0x80,0x80,0x21,0x8e,0x03,0x00,0x08,0x3c,0x02,0xb0,0x01,0x8e,0x04,0x00,0x44,
+0x00,0x62,0x18,0x21,0x90,0x65,0x00,0x00,0x24,0x02,0x00,0x01,0xae,0x02,0x00,0x50,
+0x30,0xa3,0x00,0xff,0x00,0x03,0x10,0x82,0x00,0x04,0x23,0x02,0x30,0x84,0x00,0x0f,
+0x30,0x42,0x00,0x03,0x00,0x03,0x19,0x02,0xae,0x04,0x00,0x34,0xae,0x02,0x00,0x2c,
+0xae,0x03,0x00,0x30,0xa2,0x05,0x00,0x48,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,
+0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x27,0xaf,0x00,0x00,0x00,0x00,
+0x08,0x00,0x27,0xe9,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,
+0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,0x24,0x63,0xa0,0x08,0xaf,0xb0,0x00,0x10,
+0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x50,0x00,0x00,0x00,0x00,
+0x10,0x40,0x00,0x16,0x00,0x80,0x80,0x21,0x92,0x03,0x00,0x44,0x8e,0x02,0x00,0x40,
+0x83,0x85,0x8b,0xd4,0x92,0x04,0x00,0x41,0x30,0x63,0x00,0x01,0x00,0x02,0x16,0x02,
+0xae,0x04,0x00,0x14,0x00,0x00,0x30,0x21,0xae,0x02,0x00,0x18,0x10,0xa0,0x00,0x04,
+0xae,0x03,0x00,0x3c,0x10,0x60,0x00,0x03,0x24,0x02,0x00,0x01,0x24,0x06,0x00,0x01,
+0x24,0x02,0x00,0x01,0xa3,0x86,0x8b,0xd4,0x8f,0xbf,0x00,0x14,0xae,0x02,0x00,0x54,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x27,0xdd,
+0x00,0x00,0x00,0x00,0x08,0x00,0x28,0x0e,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,0x24,0x63,0xa0,0x9c,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x50,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x1b,0x00,0x80,0x80,0x21,0x3c,0x02,0xb0,0x03,
+0x8c,0x42,0x00,0x00,0x92,0x04,0x00,0x44,0x8e,0x03,0x00,0x40,0x83,0x86,0x8b,0xd4,
+0x92,0x05,0x00,0x41,0x30,0x42,0x08,0x00,0x30,0x84,0x00,0x01,0x00,0x02,0x12,0xc2,
+0x00,0x03,0x1e,0x02,0x00,0x82,0x20,0x25,0xae,0x05,0x00,0x14,0x00,0x00,0x38,0x21,
+0xae,0x03,0x00,0x18,0x10,0xc0,0x00,0x04,0xae,0x04,0x00,0x3c,0x10,0x80,0x00,0x03,
+0x24,0x02,0x00,0x01,0x24,0x07,0x00,0x01,0x24,0x02,0x00,0x01,0xa3,0x87,0x8b,0xd4,
+0x8f,0xbf,0x00,0x14,0xae,0x02,0x00,0x54,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x0c,0x00,0x27,0xdd,0x00,0x00,0x00,0x00,0x08,0x00,0x28,0x33,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,
+0x34,0x42,0x00,0x20,0x24,0x63,0xa1,0x44,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,
+0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x54,0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x37,
+0x00,0x80,0x80,0x21,0x8e,0x04,0x00,0x04,0x8e,0x03,0x00,0x44,0x3c,0x02,0x80,0x00,
+0x3c,0x05,0xb0,0x01,0x34,0x42,0x00,0x10,0x00,0x85,0x20,0x21,0x00,0x62,0x18,0x25,
+0xac,0x83,0x00,0x04,0x8e,0x02,0x00,0x04,0x8e,0x03,0x01,0xac,0x02,0x00,0x20,0x21,
+0x00,0x45,0x10,0x21,0x8c,0x46,0x00,0x00,0x00,0x03,0x18,0x80,0x27,0x82,0x89,0x68,
+0x00,0x62,0x18,0x21,0xac,0x66,0x00,0x00,0x8e,0x02,0x00,0x04,0x8e,0x03,0x01,0xac,
+0x00,0x45,0x10,0x21,0x8c,0x46,0x00,0x04,0x00,0x03,0x18,0x80,0x27,0x82,0x8a,0x68,
+0x00,0x62,0x18,0x21,0x0c,0x00,0x26,0x10,0xac,0x66,0x00,0x00,0x8e,0x03,0x01,0xac,
+0x8e,0x07,0x00,0x04,0x3c,0x06,0xb0,0x03,0x24,0x65,0x00,0x01,0x28,0xa4,0x00,0x00,
+0x24,0x62,0x00,0x40,0x00,0xa4,0x10,0x0a,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,
+0x00,0x03,0x18,0x80,0x00,0xa2,0x28,0x23,0x00,0x70,0x18,0x21,0xae,0x05,0x01,0xac,
+0xac,0x67,0x00,0xa8,0x34,0xc6,0x00,0x30,0x8c,0xc3,0x00,0x00,0x93,0x82,0x81,0xf0,
+0x02,0x00,0x20,0x21,0x24,0x63,0x00,0x01,0x24,0x42,0x00,0x01,0xac,0xc3,0x00,0x00,
+0xa3,0x82,0x81,0xf0,0x0c,0x00,0x27,0x90,0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x14,
+0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x18,0x0c,0x00,0x28,0x27,
+0x00,0x00,0x00,0x00,0x08,0x00,0x28,0x5d,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x01,0x27,0xbd,0xff,0xe8,0x34,0x42,0x00,0x20,0x24,0x63,0xa2,0x5c,
+0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x14,0xac,0x43,0x00,0x00,0x8c,0x82,0x00,0x54,
+0x00,0x00,0x00,0x00,0x10,0x40,0x00,0x37,0x00,0x80,0x80,0x21,0x8e,0x04,0x00,0x04,
+0x8e,0x03,0x00,0x44,0x3c,0x02,0x80,0x00,0x3c,0x05,0xb0,0x01,0x34,0x42,0x00,0x10,
+0x00,0x85,0x20,0x21,0x00,0x62,0x18,0x25,0xac,0x83,0x00,0x04,0x8e,0x02,0x00,0x04,
+0x8e,0x03,0x01,0xac,0x02,0x00,0x20,0x21,0x00,0x45,0x10,0x21,0x8c,0x46,0x00,0x00,
+0x00,0x03,0x18,0x80,0x27,0x82,0x89,0x68,0x00,0x62,0x18,0x21,0xac,0x66,0x00,0x00,
+0x8e,0x02,0x00,0x04,0x8e,0x03,0x01,0xac,0x00,0x45,0x10,0x21,0x8c,0x46,0x00,0x04,
+0x00,0x03,0x18,0x80,0x27,0x82,0x8a,0x68,0x00,0x62,0x18,0x21,0x0c,0x00,0x26,0x10,
+0xac,0x66,0x00,0x00,0x8e,0x03,0x01,0xac,0x8e,0x07,0x00,0x04,0x3c,0x06,0xb0,0x03,
+0x24,0x65,0x00,0x01,0x28,0xa4,0x00,0x00,0x24,0x62,0x00,0x40,0x00,0xa4,0x10,0x0a,
+0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,0x00,0x03,0x18,0x80,0x00,0xa2,0x28,0x23,
+0x00,0x70,0x18,0x21,0xae,0x05,0x01,0xac,0xac,0x67,0x00,0xa8,0x34,0xc6,0x00,0x30,
+0x8c,0xc3,0x00,0x00,0x93,0x82,0x81,0xf0,0x02,0x00,0x20,0x21,0x24,0x63,0x00,0x01,
+0x24,0x42,0x00,0x01,0xac,0xc3,0x00,0x00,0xa3,0x82,0x81,0xf0,0x0c,0x00,0x27,0x90,
+0x00,0x00,0x00,0x00,0x8f,0xbf,0x00,0x14,0x8f,0xb0,0x00,0x10,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x18,0x0c,0x00,0x28,0x27,0x00,0x00,0x00,0x00,0x08,0x00,0x28,0xa3,
+0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,0x3c,0x03,0x80,0x01,0x34,0x42,0x00,0x20,
+0x24,0x63,0xa3,0x74,0x27,0xbd,0xff,0xe0,0xac,0x43,0x00,0x00,0x3c,0x02,0x80,0x01,
+0xaf,0xb2,0x00,0x18,0xaf,0xb1,0x00,0x14,0xaf,0xb0,0x00,0x10,0xaf,0xbf,0x00,0x1c,
+0x00,0x80,0x80,0x21,0x24,0x52,0x9e,0x28,0x00,0x00,0x88,0x21,0x3c,0x03,0xb0,0x09,
+0x34,0x63,0x00,0x06,0x8e,0x06,0x00,0x04,0x90,0x62,0x00,0x00,0x00,0x06,0x22,0x02,
+0x00,0x44,0x10,0x23,0x24,0x44,0x00,0x40,0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x7f,
+0x00,0x83,0x10,0x0a,0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,0x24,0x84,0xff,0xff,
+0x10,0x44,0x00,0x68,0x00,0x00,0x28,0x21,0x3c,0x02,0xb0,0x01,0x00,0xc2,0x10,0x21,
+0x8c,0x44,0x00,0x04,0x3c,0x03,0x7c,0x00,0x34,0x63,0x00,0xf0,0x00,0x83,0x18,0x24,
+0xae,0x04,0x00,0x44,0x8c,0x44,0x00,0x00,0x10,0x60,0x00,0x69,0x00,0x00,0x38,0x21,
+0x3c,0x09,0xb0,0x03,0x3c,0x06,0x7c,0x00,0x35,0x29,0x00,0x99,0x3c,0x0a,0xb0,0x01,
+0x24,0x08,0x00,0x40,0x34,0xc6,0x00,0xf0,0x3c,0x0b,0xff,0xff,0x3c,0x0c,0x28,0x38,
+0x16,0x20,0x00,0x06,0x24,0xa5,0x00,0x01,0x93,0x82,0x81,0xf6,0x24,0x11,0x00,0x01,
+0x24,0x42,0x00,0x01,0xa1,0x22,0x00,0x00,0xa3,0x82,0x81,0xf6,0x8e,0x02,0x00,0x04,
+0x24,0x07,0x00,0x01,0x24,0x42,0x01,0x00,0x30,0x42,0x3f,0xff,0xae,0x02,0x00,0x04,
+0x00,0x4a,0x10,0x21,0x8c,0x43,0x00,0x04,0x00,0x00,0x00,0x00,0xae,0x03,0x00,0x44,
+0x8c,0x44,0x00,0x00,0x10,0xa8,0x00,0x2d,0x00,0x66,0x18,0x24,0x14,0x60,0xff,0xec,
+0x00,0x8b,0x10,0x24,0x14,0x4c,0xff,0xea,0x24,0x02,0x00,0x01,0x10,0xe2,0x00,0x2f,
+0x3c,0x03,0xb0,0x09,0x8e,0x02,0x00,0x44,0x8e,0x04,0x00,0x60,0x00,0x02,0x1e,0x42,
+0x00,0x02,0x12,0x02,0x30,0x42,0x00,0x0f,0x30,0x63,0x00,0x01,0xae,0x02,0x00,0x00,
+0x10,0x44,0x00,0x1a,0xae,0x03,0x00,0x58,0x8e,0x02,0x00,0x64,0x8e,0x04,0x00,0x58,
+0x00,0x00,0x00,0x00,0x10,0x82,0x00,0x05,0x00,0x00,0x00,0x00,0xae,0x00,0x00,0x4c,
+0xae,0x00,0x00,0x50,0xae,0x00,0x00,0x54,0xae,0x00,0x00,0x0c,0x8e,0x03,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x03,0x10,0x80,0x00,0x50,0x10,0x21,0x8c,0x42,0x00,0x68,
+0x00,0x00,0x00,0x00,0x10,0x52,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x40,0xf8,0x09,
+0x02,0x00,0x20,0x21,0x8e,0x04,0x00,0x58,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,
+0xae,0x03,0x00,0x60,0x08,0x00,0x28,0xeb,0xae,0x04,0x00,0x64,0x8e,0x02,0x00,0x64,
+0x00,0x00,0x00,0x00,0x14,0x62,0xff,0xe5,0x00,0x00,0x00,0x00,0x7a,0x02,0x0d,0x7c,
+0x8f,0xbf,0x00,0x1c,0x8f,0xb2,0x00,0x18,0x7b,0xb0,0x00,0xbc,0x00,0x43,0x10,0x26,
+0x00,0x02,0x10,0x2b,0x03,0xe0,0x00,0x08,0x27,0xbd,0x00,0x20,0x34,0x63,0x00,0x06,
+0x8e,0x04,0x00,0x04,0x90,0x62,0x00,0x00,0x00,0x04,0x22,0x02,0x00,0x44,0x10,0x23,
+0x24,0x44,0x00,0x40,0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x7f,0x00,0x83,0x10,0x0a,
+0x00,0x02,0x11,0x83,0x00,0x02,0x11,0x80,0x00,0x82,0x20,0x23,0x14,0x87,0xff,0xc5,
+0x00,0x00,0x00,0x00,0x8e,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x2c,0x62,0x00,0x03,
+0x14,0x40,0x00,0x05,0x24,0x02,0x00,0x0d,0x10,0x62,0x00,0x03,0x24,0x02,0x00,0x01,
+0x08,0x00,0x29,0x4b,0xa2,0x02,0x00,0x5c,0x08,0x00,0x29,0x4b,0xa2,0x00,0x00,0x5c,
+0x3c,0x02,0xff,0xff,0x00,0x82,0x10,0x24,0x3c,0x03,0x28,0x38,0x14,0x43,0xff,0x94,
+0x24,0x02,0x00,0x01,0x08,0x00,0x29,0x23,0x00,0x00,0x00,0x00,0x3c,0x02,0xb0,0x03,
+0x3c,0x03,0x80,0x01,0x34,0x42,0x00,0x20,0x24,0x63,0xa5,0xcc,0xac,0x43,0x00,0x00,
+0x8c,0x83,0x01,0xa8,0x8c,0x82,0x01,0xac,0x00,0x80,0x40,0x21,0x10,0x62,0x00,0x20,
+0x00,0x00,0x20,0x21,0x93,0x82,0x81,0xf1,0x00,0x03,0x28,0x80,0x3c,0x07,0xb0,0x06,
+0x00,0xa8,0x18,0x21,0x24,0x04,0x00,0x01,0x8c,0x66,0x00,0xa8,0x10,0x44,0x00,0x1c,
+0x34,0xe7,0x80,0x18,0x3c,0x05,0xb0,0x01,0xaf,0x86,0xbc,0x20,0x00,0xc5,0x28,0x21,
+0x8c,0xa3,0x00,0x00,0x00,0x06,0x20,0xc2,0x3c,0x02,0x00,0x80,0x00,0x04,0x22,0x00,
+0x00,0x82,0x20,0x25,0xaf,0x83,0xbc,0x28,0x8c,0xa2,0x00,0x04,0xac,0xe4,0x00,0x00,
+0x8d,0x03,0x01,0xa8,0xaf,0x82,0xbc,0x24,0x24,0x64,0x00,0x01,0x04,0x80,0x00,0x0a,
+0x00,0x80,0x10,0x21,0x00,0x02,0x11,0x83,0x8d,0x03,0x01,0xac,0x00,0x02,0x11,0x80,
+0x00,0x82,0x10,0x23,0x00,0x43,0x18,0x26,0xad,0x02,0x01,0xa8,0x00,0x03,0x20,0x2b,
+0x03,0xe0,0x00,0x08,0x00,0x80,0x10,0x21,0x08,0x00,0x29,0x95,0x24,0x62,0x00,0x40,
+0x27,0x82,0x89,0x68,0x00,0x06,0x20,0xc2,0x00,0x04,0x22,0x00,0x00,0xa2,0x48,0x21,
+0x3c,0x02,0x00,0x80,0x00,0x82,0x58,0x25,0x93,0x82,0x81,0xf0,0x3c,0x0a,0xb0,0x06,
+0x3c,0x03,0xb0,0x01,0x2c,0x42,0x00,0x02,0x00,0xc3,0x38,0x21,0x35,0x4a,0x80,0x18,
+0x14,0x40,0xff,0xef,0x00,0x00,0x20,0x21,0x8c,0xe5,0x00,0x00,0x8d,0x23,0x00,0x00,
+0x24,0x02,0xc0,0x00,0x00,0xa2,0x10,0x24,0x00,0x43,0x10,0x25,0xac,0xe2,0x00,0x00,
+0x8d,0x04,0x01,0xa8,0x27,0x83,0x8a,0x68,0x8c,0xe5,0x00,0x04,0x00,0x04,0x20,0x80,
+0x00,0x83,0x20,0x21,0x8c,0x82,0x00,0x00,0x3c,0x03,0x80,0x00,0x00,0xa2,0x10,0x25,
+0x00,0x43,0x10,0x25,0xac,0xe2,0x00,0x04,0xaf,0x86,0xbc,0x20,0x8c,0xe2,0x00,0x00,
+0x93,0x85,0x81,0xf0,0xaf,0x82,0xbc,0x28,0x8c,0xe3,0x00,0x04,0xad,0x4b,0x00,0x00,
+0x8d,0x02,0x01,0xa8,0xaf,0x83,0xbc,0x24,0x24,0xa5,0xff,0xff,0x24,0x44,0x00,0x01,
+0x28,0x83,0x00,0x00,0x24,0x42,0x00,0x40,0x00,0x83,0x10,0x0a,0x00,0x02,0x11,0x83,
+0x00,0x02,0x11,0x80,0x00,0x82,0x20,0x23,0xad,0x04,0x01,0xa8,0xa3,0x85,0x81,0xf0,
+0x79,0x02,0x0d,0x7c,0x00,0x00,0x00,0x00,0x00,0x43,0x10,0x26,0x08,0x00,0x29,0x9c,
+0x00,0x02,0x20,0x2b,0x3c,0x04,0xb0,0x03,0x3c,0x06,0xb0,0x07,0x3c,0x02,0x80,0x01,
+0x34,0xc6,0x00,0x18,0x34,0x84,0x00,0x20,0x24,0x42,0xa7,0x54,0x24,0x03,0xff,0x83,
+0xac,0x82,0x00,0x00,0xa0,0xc3,0x00,0x00,0x90,0xc4,0x00,0x00,0x27,0xbd,0xff,0xf8,
+0x3c,0x03,0xb0,0x07,0x24,0x02,0xff,0x82,0xa3,0xa4,0x00,0x00,0xa0,0x62,0x00,0x00,
+0x90,0x64,0x00,0x00,0x3c,0x02,0xb0,0x07,0x34,0x42,0x00,0x08,0xa3,0xa4,0x00,0x01,
+0xa0,0x40,0x00,0x00,0x90,0x43,0x00,0x00,0x24,0x02,0x00,0x03,0x3c,0x05,0xb0,0x07,
+0xa3,0xa3,0x00,0x00,0xa0,0xc2,0x00,0x00,0x90,0xc4,0x00,0x00,0x34,0xa5,0x00,0x10,
+0x24,0x02,0x00,0x06,0x3c,0x03,0xb0,0x07,0xa3,0xa4,0x00,0x00,0x34,0x63,0x00,0x38,
+0xa0,0xa2,0x00,0x00,0x90,0x64,0x00,0x00,0x3c,0x02,0xb0,0x07,0x34,0x42,0x00,0x20,
+0xa3,0xa4,0x00,0x00,0xa0,0xa0,0x00,0x00,0x90,0xa3,0x00,0x00,0xaf,0x82,0xbf,0x30,
+0xa3,0xa3,0x00,0x00,0xa0,0x40,0x00,0x00,0x90,0x43,0x00,0x00,0x03,0xe0,0x00,0x08,
+0x27,0xbd,0x00,0x08,};
+
+u8 Rtl8192PciEFwDataArray[DataArrayLengthPciE] = {
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x10,0x00,0x08,0x00,
+0x02,0xe9,0x01,0x74,0x02,0xab,0x01,0xc7,0x01,0x55,0x00,0xe4,0x00,0xab,0x00,0x72,
+0x00,0x55,0x00,0x4c,0x00,0x4c,0x00,0x4c,0x00,0x4c,0x00,0x4c,0x02,0x76,0x01,0x3b,
+0x00,0xd2,0x00,0x9e,0x00,0x69,0x00,0x4f,0x00,0x46,0x00,0x3f,0x01,0x3b,0x00,0x9e,
+0x00,0x69,0x00,0x4f,0x00,0x35,0x00,0x27,0x00,0x23,0x00,0x20,0x01,0x2f,0x00,0x98,
+0x00,0x65,0x00,0x4c,0x00,0x33,0x00,0x26,0x00,0x22,0x00,0x1e,0x00,0x98,0x00,0x4c,
+0x00,0x33,0x00,0x26,0x00,0x19,0x00,0x13,0x00,0x11,0x00,0x0f,0x02,0x39,0x01,0x1c,
+0x00,0xbd,0x00,0x8e,0x00,0x5f,0x00,0x47,0x00,0x3f,0x00,0x39,0x01,0x1c,0x00,0x8e,
+0x00,0x5f,0x00,0x47,0x00,0x2f,0x00,0x23,0x00,0x20,0x00,0x1c,0x01,0x11,0x00,0x89,
+0x00,0x5b,0x00,0x44,0x00,0x2e,0x00,0x22,0x00,0x1e,0x00,0x1b,0x00,0x89,0x00,0x44,
+0x00,0x2e,0x00,0x22,0x00,0x17,0x00,0x11,0x00,0x0f,0x00,0x0e,0x02,0xab,0x02,0xab,
+0x02,0x66,0x02,0x66,0x07,0x06,0x06,0x06,0x05,0x06,0x07,0x08,0x04,0x06,0x07,0x08,
+0x09,0x0a,0x0b,0x0b,0x49,0x6e,0x74,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x54,0x4c,
+0x42,0x4d,0x4f,0x44,0x00,0x00,0x00,0x00,0x54,0x4c,0x42,0x4c,0x5f,0x64,0x61,0x74,
+0x61,0x00,0x54,0x4c,0x42,0x53,0x00,0x00,0x00,0x00,0x00,0x00,0x41,0x64,0x45,0x4c,
+0x5f,0x64,0x61,0x74,0x61,0x00,0x41,0x64,0x45,0x53,0x00,0x00,0x00,0x00,0x00,0x00,
+0x45,0x78,0x63,0x43,0x6f,0x64,0x65,0x36,0x00,0x00,0x45,0x78,0x63,0x43,0x6f,0x64,
+0x65,0x37,0x00,0x00,0x53,0x79,0x73,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x42,0x70,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x49,0x00,0x00,0x00,0x00,0x00,0x00,
+0x00,0x00,0x43,0x70,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x4f,0x76,0x00,0x00,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x01,0x0b,0x63,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x2c,
+0x00,0x00,0x00,0x58,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x48,0x00,0x00,0x00,0x60,
+0x00,0x00,0x00,0x90,0x00,0x00,0x00,0xc0,0x00,0x00,0x01,0x20,0x00,0x00,0x01,0x80,
+0x00,0x00,0x01,0xb0,0x00,0x00,0x00,0x34,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0x9c,
+0x00,0x00,0x00,0xd0,0x00,0x00,0x01,0x38,0x00,0x00,0x01,0xa0,0x00,0x00,0x01,0xd4,
+0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x68,0x00,0x00,0x00,0xd0,0x00,0x00,0x01,0x38,
+0x00,0x00,0x01,0xa0,0x00,0x00,0x02,0x6f,0x00,0x00,0x03,0x40,0x00,0x00,0x03,0xa8,
+0x00,0x00,0x04,0x10,0x01,0x01,0x01,0x02,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,
+0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x02,0x03,0x03,0x04,0x05,0x06,0x07,0x08,
+0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x00,0x07,0x6c,0x80,0x00,0x07,0x80,
+0x80,0x00,0x07,0x80,0x80,0x00,0x07,0x70,0x80,0x00,0x07,0x70,0x80,0x00,0x07,0x94,
+0x80,0x00,0x56,0xb0,0x80,0x00,0x57,0x08,0x80,0x00,0x57,0x30,0x80,0x00,0x58,0x28,
+0x80,0x00,0x58,0xe0,0x80,0x00,0x59,0x88,0x80,0x00,0x59,0xfc,0x80,0x00,0x5b,0x08,
+0x80,0x00,0x5b,0x40,0x80,0x00,0x5b,0x54,0x80,0x00,0x5b,0x68,0x80,0x00,0x5c,0x50,
+0x80,0x00,0x5c,0x90,0x80,0x00,0x5d,0x44,0x80,0x00,0x5d,0x6c,0x80,0x00,0x56,0x70,
+0x80,0x00,0x5d,0xbc,0x80,0x00,0x64,0x48,0x80,0x00,0x64,0xc0,0x80,0x00,0x64,0xcc,
+0x80,0x00,0x64,0xd8,0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,
+0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,
+0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,0x80,0x00,0x64,0x60,
+0x80,0x00,0x64,0x60,0x80,0x00,0x64,0xe4,0x80,0x00,0x64,0xf0,0x80,0x00,0x64,0xfc,
+0x80,0x00,0x87,0xa4,0x80,0x00,0x87,0xa4,0x80,0x00,0x87,0xa4,0x80,0x00,0x87,0xd8,
+0x80,0x00,0x88,0x18,0x80,0x00,0x88,0x50,0x80,0x00,0x88,0x80,0x80,0x00,0x88,0xb0,
+0x80,0x00,0x88,0xc4,0x80,0x00,0x89,0x2c,0x80,0x00,0x89,0x40,0x80,0x00,0x89,0x7c,
+0x80,0x00,0x89,0x84,0x80,0x00,0x89,0xc0,0x80,0x00,0x89,0xd4,0x80,0x00,0x89,0xdc,
+0x80,0x00,0x89,0xe4,0x80,0x00,0x89,0xe4,0x80,0x00,0x89,0xe4,0x80,0x00,0x89,0xe4,
+0x80,0x00,0x8a,0x14,0x80,0x00,0x8a,0x28,0x80,0x00,0x8a,0x3c,0x80,0x00,0x86,0xe8,
+0x80,0x00,0x8d,0x68,0x80,0x00,0x8d,0x68,0x80,0x00,0x8d,0x68,0x80,0x00,0x8d,0x9c,
+0x80,0x00,0x8d,0xdc,0x80,0x00,0x8e,0x14,0x80,0x00,0x8e,0x44,0x80,0x00,0x8e,0x74,
+0x80,0x00,0x8e,0x88,0x80,0x00,0x8e,0xf0,0x80,0x00,0x8f,0x04,0x80,0x00,0x8f,0x40,
+0x80,0x00,0x8f,0x48,0x80,0x00,0x8f,0x84,0x80,0x00,0x8f,0x98,0x80,0x00,0x8f,0xa0,
+0x80,0x00,0x8f,0xa8,0x80,0x00,0x8f,0xa8,0x80,0x00,0x8f,0xa8,0x80,0x00,0x8f,0xa8,
+0x80,0x00,0x8f,0xd8,0x80,0x00,0x8f,0xec,0x80,0x00,0x90,0x00,0x80,0x00,0x8b,0x88,
+};
+
+u32 Rtl8192PciEPHY_REGArray[PHY_REGArrayLengthPciE] = {
+0x0, };
+
+u32 Rtl8192PciEPHY_REG_1T2RArray[PHY_REG_1T2RArrayLengthPciE] = {
+0x800,0x00000000,
+0x804,0x00000001,
+0x808,0x0000fc00,
+0x80c,0x0000001c,
+0x810,0x801010aa,
+0x814,0x008514d0,
+0x818,0x00000040,
+0x81c,0x00000000,
+0x820,0x00000004,
+0x824,0x00690000,
+0x828,0x00000004,
+0x82c,0x00e90000,
+0x830,0x00000004,
+0x834,0x00690000,
+0x838,0x00000004,
+0x83c,0x00e90000,
+0x840,0x00000000,
+0x844,0x00000000,
+0x848,0x00000000,
+0x84c,0x00000000,
+0x850,0x00000000,
+0x854,0x00000000,
+0x858,0x65a965a9,
+0x85c,0x65a965a9,
+0x860,0x001f0010,
+0x864,0x007f0010,
+0x868,0x001f0010,
+0x86c,0x007f0010,
+0x870,0x0f100f70,
+0x874,0x0f100f70,
+0x878,0x00000000,
+0x87c,0x00000000,
+0x880,0x6870e36c,
+0x884,0xe3573600,
+0x888,0x4260c340,
+0x88c,0x0000ff00,
+0x890,0x00000000,
+0x894,0xfffffffe,
+0x898,0x4c42382f,
+0x89c,0x00656056,
+0x8b0,0x00000000,
+0x8e0,0x00000000,
+0x8e4,0x00000000,
+0x900,0x00000000,
+0x904,0x00000023,
+0x908,0x00000000,
+0x90c,0x31121311,
+0xa00,0x00d0c7d8,
+0xa04,0x811f0008,
+0xa08,0x80cd8300,
+0xa0c,0x2e62740f,
+0xa10,0x95009b78,
+0xa14,0x11145008,
+0xa18,0x00881117,
+0xa1c,0x89140fa0,
+0xa20,0x1a1b0000,
+0xa24,0x090e1317,
+0xa28,0x00000204,
+0xa2c,0x00000000,
+0xc00,0x00000040,
+0xc04,0x00005433,
+0xc08,0x000000e4,
+0xc0c,0x6c6c6c6c,
+0xc10,0x08800000,
+0xc14,0x40000100,
+0xc18,0x08000000,
+0xc1c,0x40000100,
+0xc20,0x08000000,
+0xc24,0x40000100,
+0xc28,0x08000000,
+0xc2c,0x40000100,
+0xc30,0x6de9ac44,
+0xc34,0x465c52cd,
+0xc38,0x497f5994,
+0xc3c,0x0a969764,
+0xc40,0x1f7c403f,
+0xc44,0x000100b7,
+0xc48,0xec020000,
+0xc4c,0x00000300,
+0xc50,0x69543420,
+0xc54,0x433c0094,
+0xc58,0x69543420,
+0xc5c,0x433c0094,
+0xc60,0x69543420,
+0xc64,0x433c0094,
+0xc68,0x69543420,
+0xc6c,0x433c0094,
+0xc70,0x2c7f000d,
+0xc74,0x0186175b,
+0xc78,0x0000001f,
+0xc7c,0x00b91612,
+0xc80,0x40000100,
+0xc84,0x20000000,
+0xc88,0x40000100,
+0xc8c,0x20200000,
+0xc90,0x40000100,
+0xc94,0x00000000,
+0xc98,0x40000100,
+0xc9c,0x00000000,
+0xca0,0x00492492,
+0xca4,0x00000000,
+0xca8,0x00000000,
+0xcac,0x00000000,
+0xcb0,0x00000000,
+0xcb4,0x00000000,
+0xcb8,0x00000000,
+0xcbc,0x00492492,
+0xcc0,0x00000000,
+0xcc4,0x00000000,
+0xcc8,0x00000000,
+0xccc,0x00000000,
+0xcd0,0x00000000,
+0xcd4,0x00000000,
+0xcd8,0x64b22427,
+0xcdc,0x00766932,
+0xce0,0x00222222,
+0xd00,0x00000750,
+0xd04,0x00000403,
+0xd08,0x0000907f,
+0xd0c,0x00000001,
+0xd10,0xa0633333,
+0xd14,0x33333c63,
+0xd18,0x6a8f5b6b,
+0xd1c,0x00000000,
+0xd20,0x00000000,
+0xd24,0x00000000,
+0xd28,0x00000000,
+0xd2c,0xcc979975,
+0xd30,0x00000000,
+0xd34,0x00000000,
+0xd38,0x00000000,
+0xd3c,0x00027293,
+0xd40,0x00000000,
+0xd44,0x00000000,
+0xd48,0x00000000,
+0xd4c,0x00000000,
+0xd50,0x6437140a,
+0xd54,0x024dbd02,
+0xd58,0x00000000,
+0xd5c,0x04032064,
+0xe00,0x161a1a1a,
+0xe04,0x12121416,
+0xe08,0x00001800,
+0xe0c,0x00000000,
+0xe10,0x161a1a1a,
+0xe14,0x12121416,
+0xe18,0x161a1a1a,
+0xe1c,0x12121416,
+};
+
+u32 Rtl8192PciERadioA_Array[RadioA_ArrayLengthPciE] = {
+0x019,0x00000003,
+0x000,0x000000bf,
+0x001,0x00000ee0,
+0x002,0x0000004c,
+0x003,0x000007f1,
+0x004,0x00000975,
+0x005,0x00000c58,
+0x006,0x00000ae6,
+0x007,0x000000ca,
+0x008,0x00000e1c,
+0x009,0x000007f0,
+0x00a,0x000009d0,
+0x00b,0x000001ba,
+0x00c,0x00000240,
+0x00e,0x00000020,
+0x00f,0x00000990,
+0x012,0x00000806,
+0x014,0x000005ab,
+0x015,0x00000f80,
+0x016,0x00000020,
+0x017,0x00000597,
+0x018,0x0000050a,
+0x01a,0x00000f80,
+0x01b,0x00000f5e,
+0x01c,0x00000008,
+0x01d,0x00000607,
+0x01e,0x000006cc,
+0x01f,0x00000000,
+0x020,0x000001a5,
+0x01f,0x00000001,
+0x020,0x00000165,
+0x01f,0x00000002,
+0x020,0x000000c6,
+0x01f,0x00000003,
+0x020,0x00000086,
+0x01f,0x00000004,
+0x020,0x00000046,
+0x01f,0x00000005,
+0x020,0x000001e6,
+0x01f,0x00000006,
+0x020,0x000001a6,
+0x01f,0x00000007,
+0x020,0x00000166,
+0x01f,0x00000008,
+0x020,0x000000c7,
+0x01f,0x00000009,
+0x020,0x00000087,
+0x01f,0x0000000a,
+0x020,0x000000f7,
+0x01f,0x0000000b,
+0x020,0x000000d7,
+0x01f,0x0000000c,
+0x020,0x000000b7,
+0x01f,0x0000000d,
+0x020,0x00000097,
+0x01f,0x0000000e,
+0x020,0x00000077,
+0x01f,0x0000000f,
+0x020,0x00000057,
+0x01f,0x00000010,
+0x020,0x00000037,
+0x01f,0x00000011,
+0x020,0x000000fb,
+0x01f,0x00000012,
+0x020,0x000000db,
+0x01f,0x00000013,
+0x020,0x000000bb,
+0x01f,0x00000014,
+0x020,0x000000ff,
+0x01f,0x00000015,
+0x020,0x000000e3,
+0x01f,0x00000016,
+0x020,0x000000c3,
+0x01f,0x00000017,
+0x020,0x000000a3,
+0x01f,0x00000018,
+0x020,0x00000083,
+0x01f,0x00000019,
+0x020,0x00000063,
+0x01f,0x0000001a,
+0x020,0x00000043,
+0x01f,0x0000001b,
+0x020,0x00000023,
+0x01f,0x0000001c,
+0x020,0x00000003,
+0x01f,0x0000001d,
+0x020,0x000001e3,
+0x01f,0x0000001e,
+0x020,0x000001c3,
+0x01f,0x0000001f,
+0x020,0x000001a3,
+0x01f,0x00000020,
+0x020,0x00000183,
+0x01f,0x00000021,
+0x020,0x00000163,
+0x01f,0x00000022,
+0x020,0x00000143,
+0x01f,0x00000023,
+0x020,0x00000123,
+0x01f,0x00000024,
+0x020,0x00000103,
+0x023,0x00000203,
+0x024,0x00000100,
+0x00b,0x000001ba,
+0x02c,0x000003d7,
+0x02d,0x00000ff0,
+0x000,0x00000037,
+0x004,0x00000160,
+0x007,0x00000080,
+0x002,0x0000088d,
+0x0fe,0x00000000,
+0x0fe,0x00000000,
+0x016,0x00000200,
+0x016,0x00000380,
+0x016,0x00000020,
+0x016,0x000001a0,
+0x000,0x000000bf,
+0x00d,0x0000001f,
+0x00d,0x00000c9f,
+0x002,0x0000004d,
+0x000,0x00000cbf,
+0x004,0x00000975,
+0x007,0x00000700,
+};
+
+u32 Rtl8192PciERadioB_Array[RadioB_ArrayLengthPciE] = {
+0x019,0x00000003,
+0x000,0x000000bf,
+0x001,0x000006e0,
+0x002,0x0000004c,
+0x003,0x000007f1,
+0x004,0x00000975,
+0x005,0x00000c58,
+0x006,0x00000ae6,
+0x007,0x000000ca,
+0x008,0x00000e1c,
+0x000,0x000000b7,
+0x00a,0x00000850,
+0x000,0x000000bf,
+0x00b,0x000001ba,
+0x00c,0x00000240,
+0x00e,0x00000020,
+0x015,0x00000f80,
+0x016,0x00000020,
+0x017,0x00000597,
+0x018,0x0000050a,
+0x01a,0x00000e00,
+0x01b,0x00000f5e,
+0x01d,0x00000607,
+0x01e,0x000006cc,
+0x00b,0x000001ba,
+0x023,0x00000203,
+0x024,0x00000100,
+0x000,0x00000037,
+0x004,0x00000160,
+0x016,0x00000200,
+0x016,0x00000380,
+0x016,0x00000020,
+0x016,0x000001a0,
+0x00d,0x00000ccc,
+0x000,0x000000bf,
+0x002,0x0000004d,
+0x000,0x00000cbf,
+0x004,0x00000975,
+0x007,0x00000700,
+};
+
+u32 Rtl8192PciERadioC_Array[RadioC_ArrayLengthPciE] = {
+0x0,  };
+
+u32 Rtl8192PciERadioD_Array[RadioD_ArrayLengthPciE] = {
+0x0, };
+
+u32 Rtl8192PciEMACPHY_Array[] = {
+0x03c,0xffff0000,0x00000f0f,
+0x340,0xffffffff,0x161a1a1a,
+0x344,0xffffffff,0x12121416,
+0x348,0x0000ffff,0x00001818,
+0x12c,0xffffffff,0x04000802,
+0x318,0x00000fff,0x00000100,
+};
+
+u32 Rtl8192PciEMACPHY_Array_PG[] = {
+0x03c,0xffff0000,0x00000f0f,
+0xe00,0xffffffff,0x06090909,
+0xe04,0xffffffff,0x00030306,
+0xe08,0x0000ff00,0x00000000,
+0xe10,0xffffffff,0x0a0c0d0f,
+0xe14,0xffffffff,0x06070809,
+0xe18,0xffffffff,0x0a0c0d0f,
+0xe1c,0xffffffff,0x06070809,
+0x12c,0xffffffff,0x04000802,
+0x318,0x00000fff,0x00000800,
+};
+
+u32 Rtl8192PciEAGCTAB_Array[AGCTAB_ArrayLengthPciE] = {
+0xc78,0x7d000001,
+0xc78,0x7d010001,
+0xc78,0x7d020001,
+0xc78,0x7d030001,
+0xc78,0x7d040001,
+0xc78,0x7d050001,
+0xc78,0x7c060001,
+0xc78,0x7b070001,
+0xc78,0x7a080001,
+0xc78,0x79090001,
+0xc78,0x780a0001,
+0xc78,0x770b0001,
+0xc78,0x760c0001,
+0xc78,0x750d0001,
+0xc78,0x740e0001,
+0xc78,0x730f0001,
+0xc78,0x72100001,
+0xc78,0x71110001,
+0xc78,0x70120001,
+0xc78,0x6f130001,
+0xc78,0x6e140001,
+0xc78,0x6d150001,
+0xc78,0x6c160001,
+0xc78,0x6b170001,
+0xc78,0x6a180001,
+0xc78,0x69190001,
+0xc78,0x681a0001,
+0xc78,0x671b0001,
+0xc78,0x661c0001,
+0xc78,0x651d0001,
+0xc78,0x641e0001,
+0xc78,0x491f0001,
+0xc78,0x48200001,
+0xc78,0x47210001,
+0xc78,0x46220001,
+0xc78,0x45230001,
+0xc78,0x44240001,
+0xc78,0x43250001,
+0xc78,0x28260001,
+0xc78,0x27270001,
+0xc78,0x26280001,
+0xc78,0x25290001,
+0xc78,0x242a0001,
+0xc78,0x232b0001,
+0xc78,0x222c0001,
+0xc78,0x212d0001,
+0xc78,0x202e0001,
+0xc78,0x0a2f0001,
+0xc78,0x08300001,
+0xc78,0x06310001,
+0xc78,0x05320001,
+0xc78,0x04330001,
+0xc78,0x03340001,
+0xc78,0x02350001,
+0xc78,0x01360001,
+0xc78,0x00370001,
+0xc78,0x00380001,
+0xc78,0x00390001,
+0xc78,0x003a0001,
+0xc78,0x003b0001,
+0xc78,0x003c0001,
+0xc78,0x003d0001,
+0xc78,0x003e0001,
+0xc78,0x003f0001,
+0xc78,0x7d400001,
+0xc78,0x7d410001,
+0xc78,0x7d420001,
+0xc78,0x7d430001,
+0xc78,0x7d440001,
+0xc78,0x7d450001,
+0xc78,0x7c460001,
+0xc78,0x7b470001,
+0xc78,0x7a480001,
+0xc78,0x79490001,
+0xc78,0x784a0001,
+0xc78,0x774b0001,
+0xc78,0x764c0001,
+0xc78,0x754d0001,
+0xc78,0x744e0001,
+0xc78,0x734f0001,
+0xc78,0x72500001,
+0xc78,0x71510001,
+0xc78,0x70520001,
+0xc78,0x6f530001,
+0xc78,0x6e540001,
+0xc78,0x6d550001,
+0xc78,0x6c560001,
+0xc78,0x6b570001,
+0xc78,0x6a580001,
+0xc78,0x69590001,
+0xc78,0x685a0001,
+0xc78,0x675b0001,
+0xc78,0x665c0001,
+0xc78,0x655d0001,
+0xc78,0x645e0001,
+0xc78,0x495f0001,
+0xc78,0x48600001,
+0xc78,0x47610001,
+0xc78,0x46620001,
+0xc78,0x45630001,
+0xc78,0x44640001,
+0xc78,0x43650001,
+0xc78,0x28660001,
+0xc78,0x27670001,
+0xc78,0x26680001,
+0xc78,0x25690001,
+0xc78,0x246a0001,
+0xc78,0x236b0001,
+0xc78,0x226c0001,
+0xc78,0x216d0001,
+0xc78,0x206e0001,
+0xc78,0x0a6f0001,
+0xc78,0x08700001,
+0xc78,0x06710001,
+0xc78,0x05720001,
+0xc78,0x04730001,
+0xc78,0x03740001,
+0xc78,0x02750001,
+0xc78,0x01760001,
+0xc78,0x00770001,
+0xc78,0x00780001,
+0xc78,0x00790001,
+0xc78,0x007a0001,
+0xc78,0x007b0001,
+0xc78,0x007c0001,
+0xc78,0x007d0001,
+0xc78,0x007e0001,
+0xc78,0x007f0001,
+0xc78,0x2e00001e,
+0xc78,0x2e01001e,
+0xc78,0x2e02001e,
+0xc78,0x2e03001e,
+0xc78,0x2e04001e,
+0xc78,0x2e05001e,
+0xc78,0x3006001e,
+0xc78,0x3407001e,
+0xc78,0x3908001e,
+0xc78,0x3c09001e,
+0xc78,0x3f0a001e,
+0xc78,0x420b001e,
+0xc78,0x440c001e,
+0xc78,0x450d001e,
+0xc78,0x460e001e,
+0xc78,0x460f001e,
+0xc78,0x4710001e,
+0xc78,0x4811001e,
+0xc78,0x4912001e,
+0xc78,0x4a13001e,
+0xc78,0x4b14001e,
+0xc78,0x4b15001e,
+0xc78,0x4c16001e,
+0xc78,0x4d17001e,
+0xc78,0x4e18001e,
+0xc78,0x4f19001e,
+0xc78,0x4f1a001e,
+0xc78,0x501b001e,
+0xc78,0x511c001e,
+0xc78,0x521d001e,
+0xc78,0x521e001e,
+0xc78,0x531f001e,
+0xc78,0x5320001e,
+0xc78,0x5421001e,
+0xc78,0x5522001e,
+0xc78,0x5523001e,
+0xc78,0x5624001e,
+0xc78,0x5725001e,
+0xc78,0x5726001e,
+0xc78,0x5827001e,
+0xc78,0x5828001e,
+0xc78,0x5929001e,
+0xc78,0x592a001e,
+0xc78,0x5a2b001e,
+0xc78,0x5b2c001e,
+0xc78,0x5c2d001e,
+0xc78,0x5c2e001e,
+0xc78,0x5d2f001e,
+0xc78,0x5e30001e,
+0xc78,0x5f31001e,
+0xc78,0x6032001e,
+0xc78,0x6033001e,
+0xc78,0x6134001e,
+0xc78,0x6235001e,
+0xc78,0x6336001e,
+0xc78,0x6437001e,
+0xc78,0x6438001e,
+0xc78,0x6539001e,
+0xc78,0x663a001e,
+0xc78,0x673b001e,
+0xc78,0x673c001e,
+0xc78,0x683d001e,
+0xc78,0x693e001e,
+0xc78,0x6a3f001e,
+};
diff --git a/drivers/staging/rtl8192e/r8192E_hwimg.h b/drivers/staging/rtl8192e/r8192E_hwimg.h
new file mode 100644 (file)
index 0000000..061a9c3
--- /dev/null
@@ -0,0 +1,51 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef __INC_HAL8192PciE_FW_IMG_H
+#define __INC_HAL8192PciE_FW_IMG_H
+
+/*Created on  2008/11/18,  3: 7*/
+
+#include <linux/types.h>
+
+#define BootArrayLengthPciE 344
+extern u8 Rtl8192PciEFwBootArray[BootArrayLengthPciE];
+#define MainArrayLengthPciE 43012
+extern u8 Rtl8192PciEFwMainArray[MainArrayLengthPciE];
+#define DataArrayLengthPciE 848
+extern u8 Rtl8192PciEFwDataArray[DataArrayLengthPciE];
+#define PHY_REGArrayLengthPciE 1
+extern u32 Rtl8192PciEPHY_REGArray[PHY_REGArrayLengthPciE];
+#define PHY_REG_1T2RArrayLengthPciE 296
+extern u32 Rtl8192PciEPHY_REG_1T2RArray[PHY_REG_1T2RArrayLengthPciE];
+#define RadioA_ArrayLengthPciE 246
+extern u32 Rtl8192PciERadioA_Array[RadioA_ArrayLengthPciE] ;
+#define RadioB_ArrayLengthPciE 78
+extern u32 Rtl8192PciERadioB_Array[RadioB_ArrayLengthPciE] ;
+#define RadioC_ArrayLengthPciE 1
+extern u32 Rtl8192PciERadioC_Array[RadioC_ArrayLengthPciE] ;
+#define RadioD_ArrayLengthPciE 1
+extern u32 Rtl8192PciERadioD_Array[RadioD_ArrayLengthPciE] ;
+#define MACPHY_ArrayLengthPciE 18
+extern u32 Rtl8192PciEMACPHY_Array[MACPHY_ArrayLengthPciE] ;
+#define MACPHY_Array_PGLengthPciE 30
+extern u32 Rtl8192PciEMACPHY_Array_PG[MACPHY_Array_PGLengthPciE] ;
+#define AGCTAB_ArrayLengthPciE 384
+extern u32 Rtl8192PciEAGCTAB_Array[AGCTAB_ArrayLengthPciE] ;
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_phy.c b/drivers/staging/rtl8192e/r8192E_phy.c
new file mode 100644 (file)
index 0000000..a20451b
--- /dev/null
@@ -0,0 +1,1963 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#if (defined(RTL8192E) || defined(RTL8190P))
+
+
+#include "rtl_core.h"
+#include "r8192E_hw.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h"
+#include "r8192E_phy.h"
+#include "rtl_dm.h"
+#ifdef ENABLE_DOT11D
+#include "dot11d.h"
+#endif
+
+#ifdef RTL8190P
+#include "r8190P_hwimg.h"
+#endif
+
+#ifdef RTL8192E
+#include "r8192E_hwimg.h"
+#endif
+
+static u32 RF_CHANNEL_TABLE_ZEBRA[] = {
+       0,
+       0x085c,
+       0x08dc,
+       0x095c,
+       0x09dc,
+       0x0a5c,
+       0x0adc,
+       0x0b5c,
+       0x0bdc,
+       0x0c5c,
+       0x0cdc,
+       0x0d5c,
+       0x0ddc,
+       0x0e5c,
+       0x0f72,
+};
+
+/*************************Define local function prototype**********************/
+
+static u32 phy_FwRFSerialRead(struct net_device* dev,RF90_RADIO_PATH_E eRFPath,u32 Offset);
+static void phy_FwRFSerialWrite(struct net_device* dev,RF90_RADIO_PATH_E eRFPath,u32 Offset,u32        Data);
+u32 rtl8192_CalculateBitShift(u32 dwBitMask)
+{
+       u32 i;
+       for (i=0; i<=31; i++)
+       {
+               if (((dwBitMask>>i)&0x1) == 1)
+                       break;
+       }
+       return i;
+}
+u8 rtl8192_phy_CheckIsLegalRFPath(struct net_device* dev, u32 eRFPath)
+{
+       u8 ret = 1;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef RTL8190P
+       if (priv->rf_type == RF_2T4R)
+       {
+               ret= 1;
+       }
+       else if (priv->rf_type == RF_1T2R)
+       {
+               if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B)
+                       ret = 0;
+               else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D)
+                       ret =  1;
+       }
+#else
+       #ifdef RTL8192E
+       if (priv->rf_type == RF_2T4R)
+               ret = 0;
+       else if (priv->rf_type == RF_1T2R)
+       {
+               if (eRFPath == RF90_PATH_A || eRFPath == RF90_PATH_B)
+                       ret = 1;
+               else if (eRFPath == RF90_PATH_C || eRFPath == RF90_PATH_D)
+                       ret = 0;
+       }
+       #endif
+#endif
+       return ret;
+}
+void rtl8192_setBBreg(struct net_device* dev, u32 dwRegAddr, u32 dwBitMask, u32 dwData)
+{
+
+       u32 OriginalValue, BitShift, NewValue;
+
+       if (dwBitMask!= bMaskDWord)
+       {
+               OriginalValue = read_nic_dword(dev, dwRegAddr);
+               BitShift = rtl8192_CalculateBitShift(dwBitMask);
+               NewValue = (((OriginalValue) & (~dwBitMask)) | (dwData << BitShift));
+               write_nic_dword(dev, dwRegAddr, NewValue);
+       }else
+               write_nic_dword(dev, dwRegAddr, dwData);
+       return;
+}
+u32 rtl8192_QueryBBReg(struct net_device* dev, u32 dwRegAddr, u32 dwBitMask)
+{
+       u32 Ret = 0, OriginalValue, BitShift;
+
+       OriginalValue = read_nic_dword(dev, dwRegAddr);
+       BitShift = rtl8192_CalculateBitShift(dwBitMask);
+       Ret = (OriginalValue & dwBitMask) >> BitShift;
+
+       return (Ret);
+}
+u32 rtl8192_phy_RFSerialRead(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 Offset)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 ret = 0;
+       u32 NewOffset = 0;
+       BB_REGISTER_DEFINITION_T* pPhyReg = &priv->PHYRegDef[eRFPath];
+       Offset &= 0x3f;
+
+       if (priv->rf_chip == RF_8256)
+       {
+#ifdef RTL8190P
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
+#else
+       #ifdef RTL8192E
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
+       #endif
+#endif
+               if (Offset >= 31)
+               {
+                       priv->RfReg0Value[eRFPath] |= 0x140;
+                       rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath]<<16) );
+                       NewOffset = Offset -30;
+               }
+               else if (Offset >= 16)
+               {
+                       priv->RfReg0Value[eRFPath] |= 0x100;
+                       priv->RfReg0Value[eRFPath] &= (~0x40);
+                       rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath]<<16) );
+
+                       NewOffset = Offset - 15;
+               }
+               else
+                       NewOffset = Offset;
+       }
+       else
+       {
+               RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need to be 8256\n");
+               NewOffset = Offset;
+       }
+       rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2, bLSSIReadAddress, NewOffset);
+       rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2,  bLSSIReadEdge, 0x0);
+       rtl8192_setBBreg(dev, pPhyReg->rfHSSIPara2,  bLSSIReadEdge, 0x1);
+
+
+       msleep(1);
+
+       ret = rtl8192_QueryBBReg(dev, pPhyReg->rfLSSIReadBack, bLSSIReadBackData);
+
+
+       if (priv->rf_chip == RF_8256)
+       {
+               priv->RfReg0Value[eRFPath] &= 0xebf;
+
+               rtl8192_setBBreg(
+                       dev,
+                       pPhyReg->rf3wireOffset,
+                       bMaskDWord,
+                       (priv->RfReg0Value[eRFPath] << 16));
+
+#ifdef RTL8190P
+               if (priv->rf_type == RF_2T4R)
+               {
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0xf);
+               }
+               else if (priv->rf_type == RF_1T2R)
+               {
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xc00, 0x3);
+               }
+#else
+       #ifdef RTL8192E
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
+       #endif
+#endif
+       }
+
+
+       return ret;
+
+}
+
+void rtl8192_phy_RFSerialWrite(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 Offset, u32 Data)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 DataAndAddr = 0, NewOffset = 0;
+       BB_REGISTER_DEFINITION_T        *pPhyReg = &priv->PHYRegDef[eRFPath];
+
+       Offset &= 0x3f;
+       if (priv->rf_chip == RF_8256)
+       {
+
+#ifdef RTL8190P
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
+#else
+       #ifdef RTL8192E
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
+       #endif
+#endif
+
+               if (Offset >= 31)
+               {
+                       priv->RfReg0Value[eRFPath] |= 0x140;
+                       rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath] << 16));
+                       NewOffset = Offset - 30;
+               }
+               else if (Offset >= 16)
+               {
+                       priv->RfReg0Value[eRFPath] |= 0x100;
+                       priv->RfReg0Value[eRFPath] &= (~0x40);
+                       rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, (priv->RfReg0Value[eRFPath]<<16));
+                       NewOffset = Offset - 15;
+               }
+               else
+                       NewOffset = Offset;
+       }
+       else
+       {
+               RT_TRACE((COMP_PHY|COMP_ERR), "check RF type here, need to be 8256\n");
+               NewOffset = Offset;
+       }
+
+       DataAndAddr = (Data<<16) | (NewOffset&0x3f);
+
+       rtl8192_setBBreg(dev, pPhyReg->rf3wireOffset, bMaskDWord, DataAndAddr);
+
+
+       if (Offset==0x0)
+               priv->RfReg0Value[eRFPath] = Data;
+
+       if (priv->rf_chip == RF_8256)
+       {
+               if (Offset != 0)
+               {
+                       priv->RfReg0Value[eRFPath] &= 0xebf;
+                       rtl8192_setBBreg(
+                               dev,
+                               pPhyReg->rf3wireOffset,
+                               bMaskDWord,
+                               (priv->RfReg0Value[eRFPath] << 16));
+               }
+#ifdef RTL8190P
+               if (priv->rf_type == RF_2T4R)
+               {
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0xf);
+               }
+               else if (priv->rf_type == RF_1T2R)
+               {
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xc00, 0x3);
+               }
+#else
+       #ifdef RTL8192E
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
+       #endif
+#endif
+       }
+
+       return;
+}
+
+void rtl8192_phy_SetRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask, u32 Data)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 Original_Value, BitShift, New_Value;
+
+       if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
+               return;
+#ifdef RTL8192E
+       if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
+               return;
+#endif
+
+       RT_TRACE(COMP_PHY, "FW RF CTRL is not ready now\n");
+       if (priv->Rf_Mode == RF_OP_By_FW)
+       {
+               if (BitMask != bMask12Bits)
+               {
+                       Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
+                       BitShift =  rtl8192_CalculateBitShift(BitMask);
+                       New_Value = (((Original_Value) & (~BitMask)) | (Data<< BitShift));
+
+                       phy_FwRFSerialWrite(dev, eRFPath, RegAddr, New_Value);
+               }else
+                       phy_FwRFSerialWrite(dev, eRFPath, RegAddr, Data);
+               udelay(200);
+
+       }
+       else
+       {
+               if (BitMask != bMask12Bits)
+               {
+                       Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath, RegAddr);
+                       BitShift =  rtl8192_CalculateBitShift(BitMask);
+                       New_Value = (((Original_Value) & (~BitMask)) | (Data<< BitShift));
+
+                       rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, New_Value);
+               }else
+                       rtl8192_phy_RFSerialWrite(dev, eRFPath, RegAddr, Data);
+       }
+       return;
+}
+
+u32 rtl8192_phy_QueryRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask)
+{
+       u32 Original_Value, Readback_Value, BitShift;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       if (!rtl8192_phy_CheckIsLegalRFPath(dev, eRFPath))
+               return 0;
+#ifdef RTL8192E
+       if (priv->rtllib->eRFPowerState != eRfOn && !priv->being_init_adapter)
+               return  0;
+#endif
+       down(&priv->rf_sem);
+       if (priv->Rf_Mode == RF_OP_By_FW)
+       {
+               Original_Value = phy_FwRFSerialRead(dev, eRFPath, RegAddr);
+               udelay(200);
+       }
+       else
+       {
+               Original_Value = rtl8192_phy_RFSerialRead(dev, eRFPath, RegAddr);
+
+       }
+       BitShift =  rtl8192_CalculateBitShift(BitMask);
+       Readback_Value = (Original_Value & BitMask) >> BitShift;
+       up(&priv->rf_sem);
+       return (Readback_Value);
+}
+
+static u32 phy_FwRFSerialRead(
+       struct net_device* dev,
+       RF90_RADIO_PATH_E       eRFPath,
+       u32                             Offset  )
+{
+       u32             retValue = 0;
+       u32             Data = 0;
+       u8              time = 0;
+       Data |= ((Offset&0xFF)<<12);
+       Data |= ((eRFPath&0x3)<<20);
+       Data |= 0x80000000;
+       while (read_nic_dword(dev, QPNR)&0x80000000)
+       {
+               if (time++ < 100)
+               {
+                       udelay(10);
+               }
+               else
+                       break;
+       }
+       write_nic_dword(dev, QPNR, Data);
+       while (read_nic_dword(dev, QPNR)&0x80000000)
+       {
+               if (time++ < 100)
+               {
+                       udelay(10);
+               }
+               else
+                       return  (0);
+       }
+       retValue = read_nic_dword(dev, RF_DATA);
+
+       return  (retValue);
+
+}      /* phy_FwRFSerialRead */
+
+static void
+phy_FwRFSerialWrite(
+               struct net_device* dev,
+               RF90_RADIO_PATH_E       eRFPath,
+               u32                             Offset,
+               u32                             Data    )
+{
+       u8      time = 0;
+
+
+       Data |= ((Offset&0xFF)<<12);
+       Data |= ((eRFPath&0x3)<<20);
+       Data |= 0x400000;
+       Data |= 0x80000000;
+
+       while (read_nic_dword(dev, QPNR)&0x80000000)
+       {
+               if (time++ < 100)
+               {
+                       udelay(10);
+               }
+               else
+                       break;
+       }
+       write_nic_dword(dev, QPNR, Data);
+
+}      /* phy_FwRFSerialWrite */
+
+
+void rtl8192_phy_configmac(struct net_device* dev)
+{
+       u32 dwArrayLen = 0, i = 0;
+       u32* pdwArray = NULL;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef TO_DO_LIST
+if (dev->bInHctTest)
+       {
+               RT_TRACE(COMP_PHY, "Rtl819XMACPHY_ArrayDTM\n");
+               dwArrayLen = MACPHY_ArrayLengthDTM;
+               pdwArray = Rtl819XMACPHY_ArrayDTM;
+       }
+       else if (priv->bTXPowerDataReadFromEEPORM)
+#endif
+        if (priv->bTXPowerDataReadFromEEPORM)
+       {
+               RT_TRACE(COMP_PHY, "Rtl819XMACPHY_Array_PG\n");
+               dwArrayLen = MACPHY_Array_PGLength;
+               pdwArray = Rtl819XMACPHY_Array_PG;
+
+       }
+       else
+       {
+               RT_TRACE(COMP_PHY,"Read rtl819XMACPHY_Array\n");
+               dwArrayLen = MACPHY_ArrayLength;
+               pdwArray = Rtl819XMACPHY_Array;
+       }
+       for (i = 0; i<dwArrayLen; i=i+3){
+               RT_TRACE(COMP_DBG, "The Rtl8190MACPHY_Array[0] is %x Rtl8190MACPHY_Array[1] is %x Rtl8190MACPHY_Array[2] is %x\n",
+                               pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
+               if (pdwArray[i] == 0x318)
+               {
+                       pdwArray[i+2] = 0x00000800;
+               }
+               rtl8192_setBBreg(dev, pdwArray[i], pdwArray[i+1], pdwArray[i+2]);
+       }
+       return;
+
+}
+
+void rtl8192_phyConfigBB(struct net_device* dev, u8 ConfigType)
+{
+       int i;
+       u32*    Rtl819XPHY_REGArray_Table = NULL;
+       u32*    Rtl819XAGCTAB_Array_Table = NULL;
+       u16     AGCTAB_ArrayLen, PHY_REGArrayLen = 0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef TO_DO_LIST
+       u32 *rtl8192PhyRegArrayTable = NULL, *rtl8192AgcTabArrayTable = NULL;
+       if (dev->bInHctTest)
+       {
+               AGCTAB_ArrayLen = AGCTAB_ArrayLengthDTM;
+               Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_ArrayDTM;
+
+               if (priv->RF_Type == RF_2T4R)
+               {
+                       PHY_REGArrayLen = PHY_REGArrayLengthDTM;
+                       Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArrayDTM;
+               }
+               else if (priv->RF_Type == RF_1T2R)
+               {
+                       PHY_REGArrayLen = PHY_REG_1T2RArrayLengthDTM;
+                       Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArrayDTM;
+               }
+       }
+       else
+#endif
+       {
+               AGCTAB_ArrayLen = AGCTAB_ArrayLength;
+               Rtl819XAGCTAB_Array_Table = Rtl819XAGCTAB_Array;
+               if (priv->rf_type == RF_2T4R)
+               {
+                       PHY_REGArrayLen = PHY_REGArrayLength;
+                       Rtl819XPHY_REGArray_Table = Rtl819XPHY_REGArray;
+               }
+               else if (priv->rf_type == RF_1T2R)
+               {
+                       PHY_REGArrayLen = PHY_REG_1T2RArrayLength;
+                       Rtl819XPHY_REGArray_Table = Rtl819XPHY_REG_1T2RArray;
+               }
+       }
+
+       if (ConfigType == BaseBand_Config_PHY_REG)
+       {
+               for (i=0; i<PHY_REGArrayLen; i+=2)
+               {
+                       rtl8192_setBBreg(dev, Rtl819XPHY_REGArray_Table[i], bMaskDWord, Rtl819XPHY_REGArray_Table[i+1]);
+                       RT_TRACE(COMP_DBG, "i: %x, The Rtl819xUsbPHY_REGArray[0] is %x Rtl819xUsbPHY_REGArray[1] is %x \n",i, Rtl819XPHY_REGArray_Table[i], Rtl819XPHY_REGArray_Table[i+1]);
+               }
+       }
+       else if (ConfigType == BaseBand_Config_AGC_TAB)
+       {
+               for (i=0; i<AGCTAB_ArrayLen; i+=2)
+               {
+                       rtl8192_setBBreg(dev, Rtl819XAGCTAB_Array_Table[i], bMaskDWord, Rtl819XAGCTAB_Array_Table[i+1]);
+                       RT_TRACE(COMP_DBG, "i:%x, The rtl819XAGCTAB_Array[0] is %x rtl819XAGCTAB_Array[1] is %x \n",i, Rtl819XAGCTAB_Array_Table[i], Rtl819XAGCTAB_Array_Table[i+1]);
+               }
+       }
+       return;
+
+
+}
+void rtl8192_InitBBRFRegDef(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       priv->PHYRegDef[RF90_PATH_A].rfintfs = rFPGA0_XAB_RFInterfaceSW;
+       priv->PHYRegDef[RF90_PATH_B].rfintfs = rFPGA0_XAB_RFInterfaceSW;
+       priv->PHYRegDef[RF90_PATH_C].rfintfs = rFPGA0_XCD_RFInterfaceSW;
+       priv->PHYRegDef[RF90_PATH_D].rfintfs = rFPGA0_XCD_RFInterfaceSW;
+
+       priv->PHYRegDef[RF90_PATH_A].rfintfi = rFPGA0_XAB_RFInterfaceRB;
+       priv->PHYRegDef[RF90_PATH_B].rfintfi = rFPGA0_XAB_RFInterfaceRB;
+       priv->PHYRegDef[RF90_PATH_C].rfintfi = rFPGA0_XCD_RFInterfaceRB;
+       priv->PHYRegDef[RF90_PATH_D].rfintfi = rFPGA0_XCD_RFInterfaceRB;
+
+       priv->PHYRegDef[RF90_PATH_A].rfintfo = rFPGA0_XA_RFInterfaceOE;
+       priv->PHYRegDef[RF90_PATH_B].rfintfo = rFPGA0_XB_RFInterfaceOE;
+       priv->PHYRegDef[RF90_PATH_C].rfintfo = rFPGA0_XC_RFInterfaceOE;
+       priv->PHYRegDef[RF90_PATH_D].rfintfo = rFPGA0_XD_RFInterfaceOE;
+
+       priv->PHYRegDef[RF90_PATH_A].rfintfe = rFPGA0_XA_RFInterfaceOE;
+       priv->PHYRegDef[RF90_PATH_B].rfintfe = rFPGA0_XB_RFInterfaceOE;
+       priv->PHYRegDef[RF90_PATH_C].rfintfe = rFPGA0_XC_RFInterfaceOE;
+       priv->PHYRegDef[RF90_PATH_D].rfintfe = rFPGA0_XD_RFInterfaceOE;
+
+       priv->PHYRegDef[RF90_PATH_A].rf3wireOffset = rFPGA0_XA_LSSIParameter;
+       priv->PHYRegDef[RF90_PATH_B].rf3wireOffset = rFPGA0_XB_LSSIParameter;
+       priv->PHYRegDef[RF90_PATH_C].rf3wireOffset = rFPGA0_XC_LSSIParameter;
+       priv->PHYRegDef[RF90_PATH_D].rf3wireOffset = rFPGA0_XD_LSSIParameter;
+
+       priv->PHYRegDef[RF90_PATH_A].rfLSSI_Select = rFPGA0_XAB_RFParameter;
+       priv->PHYRegDef[RF90_PATH_B].rfLSSI_Select = rFPGA0_XAB_RFParameter;
+       priv->PHYRegDef[RF90_PATH_C].rfLSSI_Select = rFPGA0_XCD_RFParameter;
+       priv->PHYRegDef[RF90_PATH_D].rfLSSI_Select = rFPGA0_XCD_RFParameter;
+
+       priv->PHYRegDef[RF90_PATH_A].rfTxGainStage = rFPGA0_TxGainStage;
+       priv->PHYRegDef[RF90_PATH_B].rfTxGainStage = rFPGA0_TxGainStage;
+       priv->PHYRegDef[RF90_PATH_C].rfTxGainStage = rFPGA0_TxGainStage;
+       priv->PHYRegDef[RF90_PATH_D].rfTxGainStage = rFPGA0_TxGainStage;
+
+       priv->PHYRegDef[RF90_PATH_A].rfHSSIPara1 = rFPGA0_XA_HSSIParameter1;
+       priv->PHYRegDef[RF90_PATH_B].rfHSSIPara1 = rFPGA0_XB_HSSIParameter1;
+       priv->PHYRegDef[RF90_PATH_C].rfHSSIPara1 = rFPGA0_XC_HSSIParameter1;
+       priv->PHYRegDef[RF90_PATH_D].rfHSSIPara1 = rFPGA0_XD_HSSIParameter1;
+
+       priv->PHYRegDef[RF90_PATH_A].rfHSSIPara2 = rFPGA0_XA_HSSIParameter2;
+       priv->PHYRegDef[RF90_PATH_B].rfHSSIPara2 = rFPGA0_XB_HSSIParameter2;
+       priv->PHYRegDef[RF90_PATH_C].rfHSSIPara2 = rFPGA0_XC_HSSIParameter2;
+       priv->PHYRegDef[RF90_PATH_D].rfHSSIPara2 = rFPGA0_XD_HSSIParameter2;
+
+       priv->PHYRegDef[RF90_PATH_A].rfSwitchControl = rFPGA0_XAB_SwitchControl;
+       priv->PHYRegDef[RF90_PATH_B].rfSwitchControl = rFPGA0_XAB_SwitchControl;
+       priv->PHYRegDef[RF90_PATH_C].rfSwitchControl = rFPGA0_XCD_SwitchControl;
+       priv->PHYRegDef[RF90_PATH_D].rfSwitchControl = rFPGA0_XCD_SwitchControl;
+
+       priv->PHYRegDef[RF90_PATH_A].rfAGCControl1 = rOFDM0_XAAGCCore1;
+       priv->PHYRegDef[RF90_PATH_B].rfAGCControl1 = rOFDM0_XBAGCCore1;
+       priv->PHYRegDef[RF90_PATH_C].rfAGCControl1 = rOFDM0_XCAGCCore1;
+       priv->PHYRegDef[RF90_PATH_D].rfAGCControl1 = rOFDM0_XDAGCCore1;
+
+       priv->PHYRegDef[RF90_PATH_A].rfAGCControl2 = rOFDM0_XAAGCCore2;
+       priv->PHYRegDef[RF90_PATH_B].rfAGCControl2 = rOFDM0_XBAGCCore2;
+       priv->PHYRegDef[RF90_PATH_C].rfAGCControl2 = rOFDM0_XCAGCCore2;
+       priv->PHYRegDef[RF90_PATH_D].rfAGCControl2 = rOFDM0_XDAGCCore2;
+
+       priv->PHYRegDef[RF90_PATH_A].rfRxIQImbalance = rOFDM0_XARxIQImbalance;
+       priv->PHYRegDef[RF90_PATH_B].rfRxIQImbalance = rOFDM0_XBRxIQImbalance;
+       priv->PHYRegDef[RF90_PATH_C].rfRxIQImbalance = rOFDM0_XCRxIQImbalance;
+       priv->PHYRegDef[RF90_PATH_D].rfRxIQImbalance = rOFDM0_XDRxIQImbalance;
+
+       priv->PHYRegDef[RF90_PATH_A].rfRxAFE = rOFDM0_XARxAFE;
+       priv->PHYRegDef[RF90_PATH_B].rfRxAFE = rOFDM0_XBRxAFE;
+       priv->PHYRegDef[RF90_PATH_C].rfRxAFE = rOFDM0_XCRxAFE;
+       priv->PHYRegDef[RF90_PATH_D].rfRxAFE = rOFDM0_XDRxAFE;
+
+       priv->PHYRegDef[RF90_PATH_A].rfTxIQImbalance = rOFDM0_XATxIQImbalance;
+       priv->PHYRegDef[RF90_PATH_B].rfTxIQImbalance = rOFDM0_XBTxIQImbalance;
+       priv->PHYRegDef[RF90_PATH_C].rfTxIQImbalance = rOFDM0_XCTxIQImbalance;
+       priv->PHYRegDef[RF90_PATH_D].rfTxIQImbalance = rOFDM0_XDTxIQImbalance;
+
+       priv->PHYRegDef[RF90_PATH_A].rfTxAFE = rOFDM0_XATxAFE;
+       priv->PHYRegDef[RF90_PATH_B].rfTxAFE = rOFDM0_XBTxAFE;
+       priv->PHYRegDef[RF90_PATH_C].rfTxAFE = rOFDM0_XCTxAFE;
+       priv->PHYRegDef[RF90_PATH_D].rfTxAFE = rOFDM0_XDTxAFE;
+
+       priv->PHYRegDef[RF90_PATH_A].rfLSSIReadBack = rFPGA0_XA_LSSIReadBack;
+       priv->PHYRegDef[RF90_PATH_B].rfLSSIReadBack = rFPGA0_XB_LSSIReadBack;
+       priv->PHYRegDef[RF90_PATH_C].rfLSSIReadBack = rFPGA0_XC_LSSIReadBack;
+       priv->PHYRegDef[RF90_PATH_D].rfLSSIReadBack = rFPGA0_XD_LSSIReadBack;
+
+}
+bool rtl8192_phy_checkBBAndRF(struct net_device* dev, HW90_BLOCK_E CheckBlock, RF90_RADIO_PATH_E eRFPath)
+{
+       bool ret = true;
+       u32 i, CheckTimes = 4, dwRegRead = 0;
+       u32 WriteAddr[4];
+       u32 WriteData[] = {0xfffff027, 0xaa55a02f, 0x00000027, 0x55aa502f};
+       WriteAddr[HW90_BLOCK_MAC] = 0x100;
+       WriteAddr[HW90_BLOCK_PHY0] = 0x900;
+       WriteAddr[HW90_BLOCK_PHY1] = 0x800;
+       WriteAddr[HW90_BLOCK_RF] = 0x3;
+       RT_TRACE(COMP_PHY, "=======>%s(), CheckBlock:%d\n", __func__, CheckBlock);
+       for (i=0 ; i < CheckTimes ; i++)
+       {
+
+               switch (CheckBlock)
+               {
+               case HW90_BLOCK_MAC:
+                       RT_TRACE(COMP_ERR, "PHY_CheckBBRFOK(): Never Write 0x100 here!");
+                       break;
+
+               case HW90_BLOCK_PHY0:
+               case HW90_BLOCK_PHY1:
+                       write_nic_dword(dev, WriteAddr[CheckBlock], WriteData[i]);
+                       dwRegRead = read_nic_dword(dev, WriteAddr[CheckBlock]);
+                       break;
+
+               case HW90_BLOCK_RF:
+                       WriteData[i] &= 0xfff;
+                       rtl8192_phy_SetRFReg(dev, eRFPath, WriteAddr[HW90_BLOCK_RF], bMask12Bits, WriteData[i]);
+                       mdelay(10);
+                       dwRegRead = rtl8192_phy_QueryRFReg(dev, eRFPath, WriteAddr[HW90_BLOCK_RF], bMaskDWord);
+                       mdelay(10);
+                       break;
+
+               default:
+                       ret = false;
+                       break;
+               }
+
+
+               if (dwRegRead != WriteData[i])
+               {
+                       RT_TRACE(COMP_ERR, "====>error=====dwRegRead: %x, WriteData: %x \n", dwRegRead, WriteData[i]);
+                       ret = false;
+                       break;
+               }
+       }
+
+       return ret;
+}
+
+bool rtl8192_BB_Config_ParaFile(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       bool rtStatus = true;
+       u8 bRegValue = 0, eCheckItem = 0;
+       u32 dwRegValue = 0;
+       /**************************************
+       **************************************/
+
+       bRegValue = read_nic_byte(dev, BB_GLOBAL_RESET);
+       write_nic_byte(dev, BB_GLOBAL_RESET,(bRegValue|BB_GLOBAL_RESET_BIT));
+
+       dwRegValue = read_nic_dword(dev, CPU_GEN);
+       write_nic_dword(dev, CPU_GEN, (dwRegValue&(~CPU_GEN_BB_RST)));
+
+       for (eCheckItem=(HW90_BLOCK_E)HW90_BLOCK_PHY0; eCheckItem<=HW90_BLOCK_PHY1; eCheckItem++)
+       {
+               rtStatus  = rtl8192_phy_checkBBAndRF(dev, (HW90_BLOCK_E)eCheckItem, (RF90_RADIO_PATH_E)0);
+               if (rtStatus != true)
+               {
+                       RT_TRACE((COMP_ERR | COMP_PHY), "PHY_RF8256_Config():Check PHY%d Fail!!\n", eCheckItem-1);
+                       return rtStatus;
+               }
+       }
+       rtl8192_setBBreg(dev, rFPGA0_RFMOD, bCCKEn|bOFDMEn, 0x0);
+       rtl8192_phyConfigBB(dev, BaseBand_Config_PHY_REG);
+
+       dwRegValue = read_nic_dword(dev, CPU_GEN);
+       write_nic_dword(dev, CPU_GEN, (dwRegValue|CPU_GEN_BB_RST));
+
+       rtl8192_phyConfigBB(dev, BaseBand_Config_AGC_TAB);
+
+       if (priv->IC_Cut  > VERSION_8190_BD)
+       {
+               if (priv->rf_type == RF_2T4R)
+               {
+               dwRegValue = (  priv->AntennaTxPwDiff[2]<<8 |
+                                               priv->AntennaTxPwDiff[1]<<4 |
+                                               priv->AntennaTxPwDiff[0]);
+               }
+               else
+                       dwRegValue = 0x0;
+               rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
+                       (bXBTxAGC|bXCTxAGC|bXDTxAGC), dwRegValue);
+
+
+#ifdef RTL8190P
+       dwRegValue = priv->CrystalCap & 0x3;
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bXtalCap01, dwRegValue);
+       dwRegValue = ((priv->CrystalCap & 0xc)>>2);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter2, bXtalCap23, dwRegValue);
+#else
+       #ifdef RTL8192E
+               dwRegValue = priv->CrystalCap;
+               rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bXtalCap92x, dwRegValue);
+       #endif
+#endif
+
+       }
+
+       return rtStatus;
+}
+bool rtl8192_BBConfig(struct net_device* dev)
+{
+       bool rtStatus = true;
+       rtl8192_InitBBRFRegDef(dev);
+       rtStatus = rtl8192_BB_Config_ParaFile(dev);
+       return rtStatus;
+}
+
+void rtl8192_phy_getTxPower(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+#ifdef RTL8190P
+       priv->MCSTxPowerLevelOriginalOffset[0] =
+               read_nic_dword(dev, MCS_TXAGC);
+       priv->MCSTxPowerLevelOriginalOffset[1] =
+               read_nic_dword(dev, (MCS_TXAGC+4));
+       priv->CCKTxPowerLevelOriginalOffset =
+               read_nic_dword(dev, CCK_TXAGC);
+#else
+       #ifdef RTL8192E
+       priv->MCSTxPowerLevelOriginalOffset[0] =
+               read_nic_dword(dev, rTxAGC_Rate18_06);
+       priv->MCSTxPowerLevelOriginalOffset[1] =
+               read_nic_dword(dev, rTxAGC_Rate54_24);
+       priv->MCSTxPowerLevelOriginalOffset[2] =
+               read_nic_dword(dev, rTxAGC_Mcs03_Mcs00);
+       priv->MCSTxPowerLevelOriginalOffset[3] =
+               read_nic_dword(dev, rTxAGC_Mcs07_Mcs04);
+       priv->MCSTxPowerLevelOriginalOffset[4] =
+               read_nic_dword(dev, rTxAGC_Mcs11_Mcs08);
+       priv->MCSTxPowerLevelOriginalOffset[5] =
+               read_nic_dword(dev, rTxAGC_Mcs15_Mcs12);
+       #endif
+#endif
+
+       priv->DefaultInitialGain[0] = read_nic_byte(dev, rOFDM0_XAAGCCore1);
+       priv->DefaultInitialGain[1] = read_nic_byte(dev, rOFDM0_XBAGCCore1);
+       priv->DefaultInitialGain[2] = read_nic_byte(dev, rOFDM0_XCAGCCore1);
+       priv->DefaultInitialGain[3] = read_nic_byte(dev, rOFDM0_XDAGCCore1);
+       RT_TRACE(COMP_INIT, "Default initial gain (c50=0x%x, c58=0x%x, c60=0x%x, c68=0x%x) \n",
+               priv->DefaultInitialGain[0], priv->DefaultInitialGain[1],
+               priv->DefaultInitialGain[2], priv->DefaultInitialGain[3]);
+
+       priv->framesync = read_nic_byte(dev, rOFDM0_RxDetector3);
+       priv->framesyncC34 = read_nic_dword(dev, rOFDM0_RxDetector2);
+       RT_TRACE(COMP_INIT, "Default framesync (0x%x) = 0x%x \n",
+               rOFDM0_RxDetector3, priv->framesync);
+       priv->SifsTime = read_nic_word(dev, SIFS);
+       return;
+}
+
+void rtl8192_phy_setTxPower(struct net_device* dev, u8 channel)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8      powerlevel = 0,powerlevelOFDM24G = 0;
+       char ant_pwr_diff;
+       u32     u4RegValue;
+
+       if (priv->epromtype == EEPROM_93C46)
+       {
+               powerlevel = priv->TxPowerLevelCCK[channel-1];
+               powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
+       }
+       else if (priv->epromtype == EEPROM_93C56)
+       {
+               if (priv->rf_type == RF_1T2R)
+               {
+                       powerlevel = priv->TxPowerLevelCCK_C[channel-1];
+                       powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_C[channel-1];
+               }
+               else if (priv->rf_type == RF_2T4R)
+               {
+                       powerlevel = priv->TxPowerLevelCCK_A[channel-1];
+                       powerlevelOFDM24G = priv->TxPowerLevelOFDM24G_A[channel-1];
+
+                       ant_pwr_diff = priv->TxPowerLevelOFDM24G_C[channel-1]
+                                               -priv->TxPowerLevelOFDM24G_A[channel-1];
+
+                       priv->RF_C_TxPwDiff = ant_pwr_diff;
+
+                       ant_pwr_diff &= 0xf;
+
+                       priv->AntennaTxPwDiff[2] = 0;
+                       priv->AntennaTxPwDiff[1] = (u8)(ant_pwr_diff);
+                       priv->AntennaTxPwDiff[0] = 0;
+
+                       u4RegValue = (  priv->AntennaTxPwDiff[2]<<8 |
+                                               priv->AntennaTxPwDiff[1]<<4 |
+                                               priv->AntennaTxPwDiff[0]);
+
+                       rtl8192_setBBreg(dev, rFPGA0_TxGainStage,
+                       (bXBTxAGC|bXCTxAGC|bXDTxAGC), u4RegValue);
+               }
+       }
+#ifdef TODO
+       if (    pMgntInfo->OpMode == RT_OP_MODE_INFRASTRUCTURE &&
+               pMgntInfo->bWithCcxCellPwr &&
+               channel == pMgntInfo->dot11CurrentChannelNumber)
+       {
+               u8      CckCellPwrIdx = DbmToTxPwrIdx(dev, WIRELESS_MODE_B, pMgntInfo->CcxCellPwr);
+               u8      LegacyOfdmCellPwrIdx = DbmToTxPwrIdx(dev, WIRELESS_MODE_G, pMgntInfo->CcxCellPwr);
+               u8      OfdmCellPwrIdx = DbmToTxPwrIdx(dev, WIRELESS_MODE_N_24G, pMgntInfo->CcxCellPwr);
+
+               RT_TRACE(COMP_TXAGC, DBG_LOUD,
+                       ("CCX Cell Limit: %d dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
+                       pMgntInfo->CcxCellPwr, CckCellPwrIdx, LegacyOfdmCellPwrIdx, OfdmCellPwrIdx));
+               RT_TRACE(COMP_TXAGC, DBG_LOUD,
+                       ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
+                       channel, powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
+
+               if (powerlevel > CckCellPwrIdx)
+                       powerlevel = CckCellPwrIdx;
+               if (powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff > OfdmCellPwrIdx)
+               {
+                       if ((OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0)
+                       {
+                               powerlevelOFDM24G = OfdmCellPwrIdx - pHalData->LegacyHTTxPowerDiff;
+                       }
+                       else
+                       {
+                               LegacyOfdmCellPwrIdx = 0;
+                       }
+               }
+
+               RT_TRACE(COMP_TXAGC, DBG_LOUD,
+                       ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
+                       powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
+       }
+
+       pHalData->CurrentCckTxPwrIdx = powerlevel;
+       pHalData->CurrentOfdm24GTxPwrIdx = powerlevelOFDM24G;
+
+       RtActChannelList(Adapter, RT_CHNL_LIST_ACTION_GET_CHANNEL, &channel, &pChannelInfo);
+
+       if (pChannelInfo)
+       {
+               if (pChannelInfo->MaxTxPwrDbm != UNSPECIFIED_PWR_DBM)
+               {
+                       u1Byte CckMaxPwrIdx = DbmToTxPwrIdx(Adapter, WIRELESS_MODE_B, pChannelInfo->MaxTxPwrDbm);
+                       u1Byte LegacyOfdmMaxPwrIdx = DbmToTxPwrIdx(Adapter, WIRELESS_MODE_G, pChannelInfo->MaxTxPwrDbm);
+                       u1Byte OfdmMaxPwrIdx = DbmToTxPwrIdx(Adapter, WIRELESS_MODE_N_24G, pChannelInfo->MaxTxPwrDbm);
+
+                       RT_TRACE(COMP_TXAGC, DBG_LOUD,
+                                       ("CCX Cell Limit: %ld dbm => CCK Tx power index : %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
+                                       pChannelInfo->MaxTxPwrDbm, CckMaxPwrIdx, LegacyOfdmMaxPwrIdx, OfdmMaxPwrIdx));
+                       RT_TRACE(COMP_TXAGC, DBG_LOUD,
+                                       ("EEPROM channel(%d) => CCK Tx power index: %d, Legacy OFDM Tx power index : %d, OFDM Tx power index: %d\n",
+                                       channel, powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
+
+                       if (powerlevel > CckMaxPwrIdx)
+                               powerlevel = CckMaxPwrIdx;
+                       if (powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff > OfdmMaxPwrIdx)
+                       {
+                               if ((OfdmMaxPwrIdx - pHalData->LegacyHTTxPowerDiff) > 0)
+                               {
+                                       powerlevelOFDM24G = OfdmMaxPwrIdx - pHalData->LegacyHTTxPowerDiff;
+                               }
+                               else
+                               {
+                                       LegacyOfdmMaxPwrIdx = 0;
+                               }
+                       }
+
+                       RT_TRACE(COMP_TXAGC, DBG_LOUD,
+                                       ("Altered CCK Tx power index : %d, Legacy OFDM Tx power index: %d, OFDM Tx power index: %d\n",
+                                       powerlevel, powerlevelOFDM24G + pHalData->LegacyHTTxPowerDiff, powerlevelOFDM24G));
+               }
+       }
+#endif
+       switch (priv->rf_chip)
+       {
+       case RF_8225:
+               break;
+       case RF_8256:
+               PHY_SetRF8256CCKTxPower(dev, powerlevel);
+               PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
+               break;
+       case RF_8258:
+               break;
+       default:
+               RT_TRACE(COMP_ERR, "unknown rf chip in funtion %s()\n", __func__);
+               break;
+       }
+       return;
+}
+
+bool rtl8192_phy_RFConfig(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       bool rtStatus = true;
+       switch (priv->rf_chip)
+       {
+               case RF_8225:
+                       break;
+               case RF_8256:
+                       rtStatus = PHY_RF8256_Config(dev);
+                       break;
+
+               case RF_8258:
+                       break;
+               case RF_PSEUDO_11N:
+               break;
+
+               default:
+                       RT_TRACE(COMP_ERR, "error chip id\n");
+                       break;
+       }
+       return rtStatus;
+}
+
+void rtl8192_phy_updateInitGain(struct net_device* dev)
+{
+       return;
+}
+
+u8 rtl8192_phy_ConfigRFWithHeaderFile(struct net_device* dev, RF90_RADIO_PATH_E        eRFPath)
+{
+
+       int i;
+       u8 ret = 0;
+
+       switch (eRFPath){
+               case RF90_PATH_A:
+                       for (i = 0;i<RadioA_ArrayLength; i=i+2){
+
+                               if (Rtl819XRadioA_Array[i] == 0xfe){
+                                               msleep(100);
+                                               continue;
+                               }
+                               rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioA_Array[i], bMask12Bits, Rtl819XRadioA_Array[i+1]);
+
+                       }
+                       break;
+               case RF90_PATH_B:
+                       for (i = 0;i<RadioB_ArrayLength; i=i+2){
+
+                               if (Rtl819XRadioB_Array[i] == 0xfe){
+                                               msleep(100);
+                                               continue;
+                               }
+                               rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioB_Array[i], bMask12Bits, Rtl819XRadioB_Array[i+1]);
+
+                       }
+                       break;
+               case RF90_PATH_C:
+                       for (i = 0;i<RadioC_ArrayLength; i=i+2){
+
+                               if (Rtl819XRadioC_Array[i] == 0xfe){
+                                               msleep(100);
+                                               continue;
+                               }
+                               rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioC_Array[i], bMask12Bits, Rtl819XRadioC_Array[i+1]);
+
+                       }
+                       break;
+               case RF90_PATH_D:
+                       for (i = 0;i<RadioD_ArrayLength; i=i+2){
+
+                               if (Rtl819XRadioD_Array[i] == 0xfe){
+                                               msleep(100);
+                                               continue;
+                               }
+                               rtl8192_phy_SetRFReg(dev, eRFPath, Rtl819XRadioD_Array[i], bMask12Bits, Rtl819XRadioD_Array[i+1]);
+
+                       }
+                       break;
+               default:
+                       break;
+       }
+
+       return ret;;
+
+}
+void rtl8192_SetTxPowerLevel(struct net_device *dev, u8 channel)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8      powerlevel = priv->TxPowerLevelCCK[channel-1];
+       u8      powerlevelOFDM24G = priv->TxPowerLevelOFDM24G[channel-1];
+
+       switch (priv->rf_chip)
+       {
+       case RF_8225:
+#ifdef TO_DO_LIST
+               PHY_SetRF8225CckTxPower(dev, powerlevel);
+               PHY_SetRF8225OfdmTxPower(dev, powerlevelOFDM24G);
+#endif
+               break;
+
+       case RF_8256:
+               PHY_SetRF8256CCKTxPower(dev, powerlevel);
+               PHY_SetRF8256OFDMTxPower(dev, powerlevelOFDM24G);
+               break;
+
+       case RF_8258:
+               break;
+       default:
+               RT_TRACE(COMP_ERR, "unknown rf chip ID in rtl8192_SetTxPowerLevel()\n");
+               break;
+       }
+       return;
+}
+u8 rtl8192_phy_SetSwChnlCmdArray(
+       SwChnlCmd*              CmdTable,
+       u32                     CmdTableIdx,
+       u32                     CmdTableSz,
+       SwChnlCmdID             CmdID,
+       u32                     Para1,
+       u32                     Para2,
+       u32                     msDelay
+       )
+{
+       SwChnlCmd* pCmd;
+
+       if (CmdTable == NULL)
+       {
+               RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): CmdTable cannot be NULL.\n");
+               return false;
+       }
+       if (CmdTableIdx >= CmdTableSz)
+       {
+               RT_TRACE(COMP_ERR, "phy_SetSwChnlCmdArray(): Access invalid index, please check size of the table, CmdTableIdx:%d, CmdTableSz:%d\n",
+                               CmdTableIdx, CmdTableSz);
+               return false;
+       }
+
+       pCmd = CmdTable + CmdTableIdx;
+       pCmd->CmdID = CmdID;
+       pCmd->Para1 = Para1;
+       pCmd->Para2 = Para2;
+       pCmd->msDelay = msDelay;
+
+       return true;
+}
+u8 rtl8192_phy_SwChnlStepByStep(struct net_device *dev, u8 channel, u8* stage, u8* step, u32* delay)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       SwChnlCmd                               PreCommonCmd[MAX_PRECMD_CNT];
+       u32                                     PreCommonCmdCnt;
+       SwChnlCmd                               PostCommonCmd[MAX_POSTCMD_CNT];
+       u32                                     PostCommonCmdCnt;
+       SwChnlCmd                               RfDependCmd[MAX_RFDEPENDCMD_CNT];
+       u32                                     RfDependCmdCnt;
+       SwChnlCmd                               *CurrentCmd = NULL;
+       u8              eRFPath;
+
+       RT_TRACE(COMP_TRACE, "====>%s()====stage:%d, step:%d, channel:%d\n", __func__, *stage, *step, channel);
+
+#ifdef ENABLE_DOT11D
+       if (!IsLegalChannel(priv->rtllib, channel))
+       {
+               RT_TRACE(COMP_ERR, "=============>set to illegal channel:%d\n", channel);
+               return true;
+       }
+#endif
+
+       {
+               PreCommonCmdCnt = 0;
+               rtl8192_phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
+                                       CmdID_SetTxPowerLevel, 0, 0, 0);
+               rtl8192_phy_SetSwChnlCmdArray(PreCommonCmd, PreCommonCmdCnt++, MAX_PRECMD_CNT,
+                                       CmdID_End, 0, 0, 0);
+
+               PostCommonCmdCnt = 0;
+
+               rtl8192_phy_SetSwChnlCmdArray(PostCommonCmd, PostCommonCmdCnt++, MAX_POSTCMD_CNT,
+                                       CmdID_End, 0, 0, 0);
+
+               RfDependCmdCnt = 0;
+               switch ( priv->rf_chip )
+               {
+               case RF_8225:
+                       if (!(channel >= 1 && channel <= 14))
+                       {
+                               RT_TRACE(COMP_ERR, "illegal channel for Zebra 8225: %d\n", channel);
+                               return false;
+                       }
+                       rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
+                               CmdID_RF_WriteReg, rZebra1_Channel, RF_CHANNEL_TABLE_ZEBRA[channel], 10);
+                       rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
+                               CmdID_End, 0, 0, 0);
+                       break;
+
+               case RF_8256:
+                       if (!(channel >= 1 && channel <= 14))
+                       {
+                               RT_TRACE(COMP_ERR, "illegal channel for Zebra 8256: %d\n", channel);
+                               return false;
+                       }
+                       rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
+                               CmdID_RF_WriteReg, rZebra1_Channel, channel, 10);
+                       rtl8192_phy_SetSwChnlCmdArray(RfDependCmd, RfDependCmdCnt++, MAX_RFDEPENDCMD_CNT,
+                       CmdID_End, 0, 0, 0);
+                       break;
+
+               case RF_8258:
+                       break;
+
+               default:
+                       RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", priv->rf_chip);
+                       return false;
+                       break;
+               }
+
+
+               do{
+                       switch (*stage)
+                       {
+                       case 0:
+                               CurrentCmd=&PreCommonCmd[*step];
+                               break;
+                       case 1:
+                               CurrentCmd=&RfDependCmd[*step];
+                               break;
+                       case 2:
+                               CurrentCmd=&PostCommonCmd[*step];
+                               break;
+                       }
+
+                       if (CurrentCmd->CmdID==CmdID_End)
+                       {
+                               if ((*stage)==2)
+                               {
+                                       return true;
+                               }
+                               else
+                               {
+                                       (*stage)++;
+                                       (*step)=0;
+                                       continue;
+                               }
+                       }
+
+                       switch (CurrentCmd->CmdID)
+                       {
+                       case CmdID_SetTxPowerLevel:
+                               if (priv->IC_Cut > (u8)VERSION_8190_BD)
+                                       rtl8192_SetTxPowerLevel(dev,channel);
+                               break;
+                       case CmdID_WritePortUlong:
+                               write_nic_dword(dev, CurrentCmd->Para1, CurrentCmd->Para2);
+                               break;
+                       case CmdID_WritePortUshort:
+                               write_nic_word(dev, CurrentCmd->Para1, (u16)CurrentCmd->Para2);
+                               break;
+                       case CmdID_WritePortUchar:
+                               write_nic_byte(dev, CurrentCmd->Para1, (u8)CurrentCmd->Para2);
+                               break;
+                       case CmdID_RF_WriteReg:
+                               for (eRFPath = 0; eRFPath <priv->NumTotalRFPath; eRFPath++)
+                                       rtl8192_phy_SetRFReg(dev, (RF90_RADIO_PATH_E)eRFPath, CurrentCmd->Para1, bMask12Bits, CurrentCmd->Para2<<7);
+                               break;
+                       default:
+                               break;
+                       }
+
+                       break;
+               }while(true);
+       }/*for (Number of RF paths)*/
+
+       (*delay)=CurrentCmd->msDelay;
+       (*step)++;
+       return false;
+}
+
+void rtl8192_phy_FinishSwChnlNow(struct net_device *dev, u8 channel)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32     delay = 0;
+
+       while(!rtl8192_phy_SwChnlStepByStep(dev,channel,&priv->SwChnlStage,&priv->SwChnlStep,&delay))
+       {
+               if (delay>0)
+                       msleep(delay);
+               if (IS_NIC_DOWN(priv))
+                       break;
+       }
+}
+void rtl8192_SwChnl_WorkItem(struct net_device *dev)
+{
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       RT_TRACE(COMP_TRACE, "==> SwChnlCallback819xUsbWorkItem()\n");
+
+       RT_TRACE(COMP_TRACE, "=====>--%s(), set chan:%d, priv:%p\n", __func__, priv->chan, priv);
+
+       rtl8192_phy_FinishSwChnlNow(dev , priv->chan);
+
+       RT_TRACE(COMP_TRACE, "<== SwChnlCallback819xUsbWorkItem()\n");
+}
+
+u8 rtl8192_phy_SwChnl(struct net_device* dev, u8 channel)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       RT_TRACE(COMP_PHY, "=====>%s()\n", __func__);
+       if (IS_NIC_DOWN(priv))
+       {
+               RT_TRACE(COMP_ERR, "%s(): ERR !! driver is not up\n",__func__);
+               return false;
+       }
+       if (priv->SwChnlInProgress)
+               return false;
+
+
+       switch (priv->rtllib->mode)
+       {
+       case WIRELESS_MODE_A:
+       case WIRELESS_MODE_N_5G:
+               if (channel<=14){
+                       RT_TRACE(COMP_ERR, "WIRELESS_MODE_A but channel<=14");
+                       return false;
+               }
+               break;
+       case WIRELESS_MODE_B:
+               if (channel>14){
+                       RT_TRACE(COMP_ERR, "WIRELESS_MODE_B but channel>14");
+                       return false;
+               }
+               break;
+       case WIRELESS_MODE_G:
+       case WIRELESS_MODE_N_24G:
+               if (channel>14){
+                       RT_TRACE(COMP_ERR, "WIRELESS_MODE_G but channel>14");
+                       return false;
+               }
+               break;
+       }
+
+       priv->SwChnlInProgress = true;
+       if (channel == 0)
+               channel = 1;
+
+       priv->chan=channel;
+
+       priv->SwChnlStage=0;
+       priv->SwChnlStep=0;
+
+       if (!IS_NIC_DOWN(priv)){
+               rtl8192_SwChnl_WorkItem(dev);
+       }
+       priv->SwChnlInProgress = false;
+       return true;
+}
+
+static void CCK_Tx_Power_Track_BW_Switch_TSSI(struct net_device *dev   )
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       switch (priv->CurrentChannelBW)
+       {
+               case HT_CHANNEL_WIDTH_20:
+                       priv->CCKPresentAttentuation =
+                               priv->CCKPresentAttentuation_20Mdefault + priv->CCKPresentAttentuation_difference;
+
+                       if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
+                               priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
+                       if (priv->CCKPresentAttentuation < 0)
+                               priv->CCKPresentAttentuation = 0;
+
+                       RT_TRACE(COMP_POWER_TRACKING, "20M, priv->CCKPresentAttentuation = %d\n", priv->CCKPresentAttentuation);
+
+                       if (priv->rtllib->current_network.channel== 14 && !priv->bcck_in_ch14)
+                       {
+                               priv->bcck_in_ch14 = true;
+                               dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                       }
+                       else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
+                       {
+                               priv->bcck_in_ch14 = false;
+                               dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                       }
+                       else
+                               dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+               break;
+
+               case HT_CHANNEL_WIDTH_20_40:
+                       priv->CCKPresentAttentuation =
+                               priv->CCKPresentAttentuation_40Mdefault + priv->CCKPresentAttentuation_difference;
+
+                       RT_TRACE(COMP_POWER_TRACKING, "40M, priv->CCKPresentAttentuation = %d\n", priv->CCKPresentAttentuation);
+                       if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
+                               priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
+                       if (priv->CCKPresentAttentuation < 0)
+                               priv->CCKPresentAttentuation = 0;
+
+                       if (priv->rtllib->current_network.channel == 14 && !priv->bcck_in_ch14)
+                       {
+                               priv->bcck_in_ch14 = true;
+                               dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                       }
+                       else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
+                       {
+                               priv->bcck_in_ch14 = false;
+                               dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                       }
+                       else
+                               dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+               break;
+       }
+}
+
+#ifndef RTL8190P
+static void CCK_Tx_Power_Track_BW_Switch_ThermalMeter(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->rtllib->current_network.channel == 14 && !priv->bcck_in_ch14)
+               priv->bcck_in_ch14 = true;
+       else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
+               priv->bcck_in_ch14 = false;
+
+       switch (priv->CurrentChannelBW)
+       {
+               case HT_CHANNEL_WIDTH_20:
+                       if (priv->Record_CCK_20Mindex == 0)
+                               priv->Record_CCK_20Mindex = 6;
+                       priv->CCK_index = priv->Record_CCK_20Mindex;
+                       RT_TRACE(COMP_POWER_TRACKING, "20MHz, CCK_Tx_Power_Track_BW_Switch_ThermalMeter(),CCK_index = %d\n", priv->CCK_index);
+               break;
+
+               case HT_CHANNEL_WIDTH_20_40:
+                       priv->CCK_index = priv->Record_CCK_40Mindex;
+                       RT_TRACE(COMP_POWER_TRACKING, "40MHz, CCK_Tx_Power_Track_BW_Switch_ThermalMeter(), CCK_index = %d\n", priv->CCK_index);
+               break;
+       }
+       dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
+}
+#endif
+
+static void CCK_Tx_Power_Track_BW_Switch(struct net_device *dev)
+{
+#ifdef RTL8192E
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+
+#ifdef RTL8190P
+       CCK_Tx_Power_Track_BW_Switch_TSSI(dev);
+#else
+       if (priv->IC_Cut >= IC_VersionCut_D)
+               CCK_Tx_Power_Track_BW_Switch_TSSI(dev);
+       else
+               CCK_Tx_Power_Track_BW_Switch_ThermalMeter(dev);
+#endif
+}
+
+void rtl8192_SetBWModeWorkItem(struct net_device *dev)
+{
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 regBwOpMode;
+
+       RT_TRACE(COMP_SWBW, "==>rtl8192_SetBWModeWorkItem()  Switch to %s bandwidth\n", \
+                                       priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20?"20MHz":"40MHz")
+
+
+       if (priv->rf_chip== RF_PSEUDO_11N)
+       {
+               priv->SetBWModeInProgress= false;
+               return;
+       }
+       if (IS_NIC_DOWN(priv)){
+               RT_TRACE(COMP_ERR,"%s(): ERR!! driver is not up\n",__func__);
+               return;
+       }
+       regBwOpMode = read_nic_byte(dev, BW_OPMODE);
+
+       switch (priv->CurrentChannelBW)
+       {
+               case HT_CHANNEL_WIDTH_20:
+                       regBwOpMode |= BW_OPMODE_20MHZ;
+                       write_nic_byte(dev, BW_OPMODE, regBwOpMode);
+                       break;
+
+               case HT_CHANNEL_WIDTH_20_40:
+                       regBwOpMode &= ~BW_OPMODE_20MHZ;
+                       write_nic_byte(dev, BW_OPMODE, regBwOpMode);
+                       break;
+
+               default:
+                       RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown Bandwidth: %#X\n",priv->CurrentChannelBW);
+                       break;
+       }
+
+       switch (priv->CurrentChannelBW)
+       {
+               case HT_CHANNEL_WIDTH_20:
+                       rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x0);
+                       rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x0);
+
+                       if (!priv->btxpower_tracking)
+                       {
+                               write_nic_dword(dev, rCCK0_TxFilter1, 0x1a1b0000);
+                               write_nic_dword(dev, rCCK0_TxFilter2, 0x090e1317);
+                               write_nic_dword(dev, rCCK0_DebugPort, 0x00000204);
+                       }
+                       else
+                               CCK_Tx_Power_Track_BW_Switch(dev);
+
+#ifdef RTL8190P
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bADClkPhase, 1);
+                       rtl8192_setBBreg(dev, rOFDM0_RxDetector1, bMaskByte0, 0x44);
+#else
+       #ifdef RTL8192E
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 1);
+       #endif
+#endif
+
+                       break;
+               case HT_CHANNEL_WIDTH_20_40:
+                       rtl8192_setBBreg(dev, rFPGA0_RFMOD, bRFMOD, 0x1);
+                       rtl8192_setBBreg(dev, rFPGA1_RFMOD, bRFMOD, 0x1);
+
+                       if (!priv->btxpower_tracking)
+                       {
+                               write_nic_dword(dev, rCCK0_TxFilter1, 0x35360000);
+                               write_nic_dword(dev, rCCK0_TxFilter2, 0x121c252e);
+                               write_nic_dword(dev, rCCK0_DebugPort, 0x00000409);
+                       }
+                       else
+                               CCK_Tx_Power_Track_BW_Switch(dev);
+
+                       rtl8192_setBBreg(dev, rCCK0_System, bCCKSideBand, (priv->nCur40MhzPrimeSC>>1));
+                       rtl8192_setBBreg(dev, rOFDM1_LSTF, 0xC00, priv->nCur40MhzPrimeSC);
+
+
+#ifdef RTL8190P
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, bADClkPhase, 0);
+                       rtl8192_setBBreg(dev, rOFDM0_RxDetector1, bMaskByte0, 0x42);
+
+                       if (priv->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_UPPER)
+                       {
+                               rtl8192_setBBreg(dev, rFPGA0_RFMOD, (BIT6|BIT5), 0x01);
+                       }else if (priv->nCur40MhzPrimeSC == HAL_PRIME_CHNL_OFFSET_LOWER)
+                       {
+                               rtl8192_setBBreg(dev, rFPGA0_RFMOD, (BIT6|BIT5), 0x02);
+                       }
+
+#else
+       #ifdef RTL8192E
+                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x00100000, 0);
+       #endif
+#endif
+                       break;
+               default:
+                       RT_TRACE(COMP_ERR, "SetChannelBandwidth819xUsb(): unknown Bandwidth: %#X\n" ,priv->CurrentChannelBW);
+                       break;
+
+       }
+
+#if 1
+       switch ( priv->rf_chip )
+       {
+               case RF_8225:
+#ifdef TO_DO_LIST
+                       PHY_SetRF8225Bandwidth(dev, pHalData->CurrentChannelBW);
+#endif
+                       break;
+
+               case RF_8256:
+                       PHY_SetRF8256Bandwidth(dev, priv->CurrentChannelBW);
+                       break;
+
+               case RF_8258:
+                       break;
+
+               case RF_PSEUDO_11N:
+                       break;
+
+               default:
+                       RT_TRACE(COMP_ERR, "Unknown RFChipID: %d\n", priv->rf_chip);
+                       break;
+       }
+#endif
+       atomic_dec(&(priv->rtllib->atm_swbw));
+       priv->SetBWModeInProgress= false;
+
+       RT_TRACE(COMP_SWBW, "<==SetBWMode819xUsb()");
+}
+
+void rtl8192_SetBWMode(struct net_device *dev, HT_CHANNEL_WIDTH        Bandwidth, HT_EXTCHNL_OFFSET Offset)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+
+       if (priv->SetBWModeInProgress)
+               return;
+
+        atomic_inc(&(priv->rtllib->atm_swbw));
+       priv->SetBWModeInProgress= true;
+
+       priv->CurrentChannelBW = Bandwidth;
+
+       if (Offset==HT_EXTCHNL_OFFSET_LOWER)
+               priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_UPPER;
+       else if (Offset==HT_EXTCHNL_OFFSET_UPPER)
+               priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_LOWER;
+       else
+               priv->nCur40MhzPrimeSC = HAL_PRIME_CHNL_OFFSET_DONT_CARE;
+
+       rtl8192_SetBWModeWorkItem(dev);
+
+}
+
+
+void InitialGain819xPci(struct net_device *dev, u8 Operation)
+{
+#define SCAN_RX_INITIAL_GAIN   0x17
+#define POWER_DETECTION_TH     0x08
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32                                     BitMask;
+       u8                                      initial_gain;
+
+       if (!IS_NIC_DOWN(priv)){
+               switch (Operation)
+               {
+                       case IG_Backup:
+                       RT_TRACE(COMP_SCAN, "IG_Backup, backup the initial gain.\n");
+                               initial_gain = SCAN_RX_INITIAL_GAIN;
+                               BitMask = bMaskByte0;
+                               if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
+                                       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
+                               priv->initgain_backup.xaagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, BitMask);
+                               priv->initgain_backup.xbagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, BitMask);
+                               priv->initgain_backup.xcagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, BitMask);
+                               priv->initgain_backup.xdagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, BitMask);
+                               BitMask  = bMaskByte2;
+                               priv->initgain_backup.cca               = (u8)rtl8192_QueryBBReg(dev, rCCK0_CCA, BitMask);
+
+                       RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan InitialGainBackup 0xa0a is %x\n",priv->initgain_backup.cca);
+
+                       RT_TRACE(COMP_SCAN, "Write scan initial gain = 0x%x \n", initial_gain);
+                               write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
+                               write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
+                               write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
+                               write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
+                               RT_TRACE(COMP_SCAN, "Write scan 0xa0a = 0x%x \n", POWER_DETECTION_TH);
+                               write_nic_byte(dev, 0xa0a, POWER_DETECTION_TH);
+                               break;
+                       case IG_Restore:
+                       RT_TRACE(COMP_SCAN, "IG_Restore, restore the initial gain.\n");
+                               BitMask = 0x7f;
+                               if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
+                                       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
+
+                               rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, BitMask, (u32)priv->initgain_backup.xaagccore1);
+                               rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, BitMask, (u32)priv->initgain_backup.xbagccore1);
+                               rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, BitMask, (u32)priv->initgain_backup.xcagccore1);
+                               rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, BitMask, (u32)priv->initgain_backup.xdagccore1);
+                               BitMask  = bMaskByte2;
+                               rtl8192_setBBreg(dev, rCCK0_CCA, BitMask, (u32)priv->initgain_backup.cca);
+
+                       RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
+                       RT_TRACE(COMP_SCAN, "Scan BBInitialGainRestore 0xa0a is %x\n",priv->initgain_backup.cca);
+
+                               rtl8192_phy_setTxPower(dev,priv->rtllib->current_network.channel);
+
+
+                               if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
+                                       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1);
+                               break;
+                       default:
+                       RT_TRACE(COMP_SCAN, "Unknown IG Operation. \n");
+                               break;
+               }
+       }
+}
+
+#if defined RTL8190P
+extern void
+PHY_SetRtl8190pRfOff(struct net_device* dev    )
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->rf_type == RF_2T4R)
+       {
+               rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
+       }
+       rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e0, 0x0);
+       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0);
+       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e00, 0x0);
+
+}
+#endif
+
+#if defined RTL8192E
+extern void
+PHY_SetRtl8192eRfOff(struct net_device* dev    )
+{
+
+       rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x18, 0x0);
+       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0x0);
+       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x60, 0x0);
+       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x4, 0x0);
+       write_nic_byte(dev, ANAPAR_FOR_8192PciE, 0x07);
+
+}
+#endif
+
+#ifndef RTL8192SE
+bool
+SetRFPowerState8190(
+       struct net_device* dev,
+       RT_RF_POWER_STATE       eRFPowerState
+       )
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+#if defined RTL8192E
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+#endif
+       bool bResult = true;
+       u8      i = 0, QueueID = 0;
+       struct rtl8192_tx_ring  *ring = NULL;
+
+       if (priv->SetRFPowerStateInProgress == true)
+               return false;
+       RT_TRACE(COMP_PS, "===========> SetRFPowerState8190()!\n");
+       priv->SetRFPowerStateInProgress = true;
+
+       switch (priv->rf_chip)
+       {
+               case RF_8256:
+               switch ( eRFPowerState )
+               {
+                       case eRfOn:
+                               RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOn !\n");
+                               #ifdef RTL8190P
+                               if (priv->rf_type == RF_2T4R)
+                               {
+                                       rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xf00, 0xf);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e0, 0xf);
+                                       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xf, 0xf);
+                                       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xf, 0xf);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1e00, 0xf);
+                               }
+                               else if (priv->rf_type == RF_1T2R)
+                               {
+                                       rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0xc00, 0x3);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x180, 0x3);
+                                       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0xc, 0x3);
+                                       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0xc, 0x3);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x1800, 0x3);
+                               }
+                               else if (priv->rf_type == RF_1T1R)
+                               {
+                                       rtl8192_setBBreg(dev, rFPGA0_XC_RFInterfaceOE, BIT4, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x400, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x80, 0x1);
+                                       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x4, 0x1);
+                                       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x4, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x800, 0x1);
+                               }
+
+#elif defined RTL8192E
+                               if ((priv->rtllib->eRFPowerState == eRfOff) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC))
+                               {
+                                       bool rtstatus = true;
+                                       u32 InitilizeCount = 3;
+                                       do
+                                       {
+                                               InitilizeCount--;
+                                               priv->RegRfOff = false;
+                                               rtstatus = NicIFEnableNIC(dev);
+                                       }while( (rtstatus != true) &&(InitilizeCount >0) );
+
+                                       if (rtstatus != true)
+                                       {
+                                               RT_TRACE(COMP_ERR,"%s():Initialize Adapter fail,return\n",__func__);
+                                               priv->SetRFPowerStateInProgress = false;
+                                               return false;
+                                       }
+
+                                       RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+                               } else {
+                               write_nic_byte(dev, ANAPAR, 0x37);
+                               mdelay(1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x4, 0x1);
+                               priv->bHwRfOffAction = 0;
+
+                                       rtl8192_setBBreg(dev, rFPGA0_XA_RFInterfaceOE, BIT4, 0x1);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter4, 0x300, 0x3);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x18, 0x3);
+                                       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x3, 0x3);
+                                       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x3, 0x3);
+                                       rtl8192_setBBreg(dev, rFPGA0_AnalogParameter1, 0x60, 0x3);
+
+                               }
+
+                               #endif
+                                               break;
+
+                       case eRfSleep:
+                       {
+                               if (priv->rtllib->eRFPowerState == eRfOff)
+                                       break;
+
+
+                               {
+                                       for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; )
+                                       {
+                                                       ring = &priv->tx_ring[QueueID];
+
+                                                       if (skb_queue_len(&ring->queue) == 0) {
+                                                               QueueID++;
+                                                               continue;
+                                                       }
+#ifdef TO_DO_LIST
+                                                       else if (IsLowPowerState(Adapter))
+                                                       {
+                                                               RT_TRACE((COMP_POWER|COMP_RF), "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n", (i+1), QueueID);
+                                                               break;
+                                                       }
+#endif
+                                                       else
+                                                       {
+                                                               RT_TRACE((COMP_POWER|COMP_RF), "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID);
+                                                               udelay(10);
+                                                               i++;
+                                                       }
+
+                                                       if (i >= MAX_DOZE_WAITING_TIMES_9x)
+                                                       {
+                                                               RT_TRACE(COMP_POWER, "\n\n\n TimeOut!! SetRFPowerState8190(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID);
+                                                               break;
+                                                       }
+                                               }
+                               }
+
+#ifdef RTL8190P
+                               {
+                                       PHY_SetRtl8190pRfOff(dev);
+                               }
+#elif defined RTL8192E
+                               {
+                                       PHY_SetRtl8192eRfOff(dev);
+                               }
+#endif
+                       }
+                                                               break;
+
+                       case eRfOff:
+                               RT_TRACE(COMP_PS, "SetRFPowerState8190() eRfOff/Sleep !\n");
+
+
+                               for (QueueID = 0, i = 0; QueueID < MAX_TX_QUEUE; ) {
+                                       ring = &priv->tx_ring[QueueID];
+
+                                       if (skb_queue_len(&ring->queue) == 0) {
+                                                       QueueID++;
+                                                       continue;
+                                       }
+#ifdef TO_DO_LIST
+                                       else if (IsLowPowerState(Adapter))
+                                       {
+                                               RT_TRACE(COMP_POWER,
+                                               "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 but lower power state!\n", (i+1), QueueID);
+                                               break;
+                                       }
+#endif
+                                               else
+                                               {
+                                               RT_TRACE(COMP_POWER,
+                                               "eRf Off/Sleep: %d times TcbBusyQueue[%d] !=0 before doze!\n", (i+1), QueueID);
+                                                       udelay(10);
+                                                       i++;
+                                               }
+
+                                               if (i >= MAX_DOZE_WAITING_TIMES_9x)
+                                               {
+                                               RT_TRACE(COMP_POWER, "\n\n\n SetZebraRFPowerState8185B(): eRfOff: %d times TcbBusyQueue[%d] != 0 !!!\n\n\n", MAX_DOZE_WAITING_TIMES_9x, QueueID);
+                                                       break;
+                                               }
+                                       }
+
+#if defined RTL8190P
+                               {
+                                       PHY_SetRtl8190pRfOff(dev);
+                               }
+#elif defined RTL8192E
+                               {
+                                       if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC && !RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC))
+                                       {
+
+                                               NicIFDisableNIC(dev);
+                                               RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+                                       }
+                                       else if (!(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC))
+                                       {
+                                               PHY_SetRtl8192eRfOff(dev);
+                                       }
+#ifdef TO_DO_LIST
+                                       if (pMgntInfo->RfOffReason == RF_CHANGE_BY_IPS )
+                                       {
+                                               Adapter->HalFunc.LedControlHandler(dev,LED_CTL_NO_LINK);
+                                       }
+                                       else
+                                       {
+                                               Adapter->HalFunc.LedControlHandler(dev, LED_CTL_POWER_OFF);
+                                       }
+#endif
+                               }
+#else
+                               else
+                               {
+                                       RT_TRACE(COMP_DBG,DBG_TRACE,("It is not 8190Pci and 8192PciE \n"));
+                               }
+                               #endif
+
+                                       break;
+
+                       default:
+                                       bResult = false;
+                                       RT_TRACE(COMP_ERR, "SetRFPowerState8190(): unknow state to set: 0x%X!!!\n", eRFPowerState);
+                                       break;
+               }
+
+               break;
+
+               default:
+                       RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown RF type\n");
+                       break;
+       }
+
+       if (bResult) {
+               priv->rtllib->eRFPowerState = eRFPowerState;
+
+               switch (priv->rf_chip )
+               {
+                       case RF_8256:
+                       switch (priv->rtllib->eRFPowerState)
+                       {
+                               case eRfOff:
+                                       if (priv->rtllib->RfOffReason==RF_CHANGE_BY_IPS ) {
+                                               #ifdef TO_DO
+                                               dev->HalFunc.LedControlHandler(dev,LED_CTL_NO_LINK);
+                                               #endif
+                                       } else {
+                                               #ifdef TO_DO
+                                               dev->HalFunc.LedControlHandler(dev, LED_CTL_POWER_OFF);
+                                               #endif
+                                       }
+                                       break;
+
+                               case eRfOn:
+                                       if ( priv->rtllib->state == RTLLIB_LINKED) {
+                                               #ifdef TO_DO
+                                               dev->HalFunc.LedControlHandler(dev, LED_CTL_LINK);
+                                               #endif
+                                       } else {
+                                               #ifdef TO_DO
+                                               dev->HalFunc.LedControlHandler(dev, LED_CTL_NO_LINK);
+                                               #endif
+                                       }
+                                       break;
+
+                               default:
+                                       break;
+                       }
+
+                       break;
+
+                       default:
+                               RT_TRACE(COMP_ERR, "SetRFPowerState8190(): Unknown RF type\n");
+                               break;
+               }
+       }
+
+       priv->SetRFPowerStateInProgress = false;
+       RT_TRACE(COMP_PS, "<=========== SetRFPowerState8190() bResult = %d!\n", bResult);
+       return bResult;
+}
+
+
+
+bool
+SetRFPowerState(
+       struct net_device* dev,
+       RT_RF_POWER_STATE       eRFPowerState
+       )
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       bool bResult = false;
+
+       RT_TRACE(COMP_PS,"---------> SetRFPowerState(): eRFPowerState(%d)\n", eRFPowerState);
+       if (eRFPowerState == priv->rtllib->eRFPowerState && priv->bHwRfOffAction == 0) {
+               RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): discard the request for eRFPowerState(%d) is the same.\n", eRFPowerState);
+               return bResult;
+       }
+
+       bResult = SetRFPowerState8190(dev, eRFPowerState);
+
+       RT_TRACE(COMP_PS, "<--------- SetRFPowerState(): bResult(%d)\n", bResult);
+
+       return bResult;
+}
+#endif
+
+extern void
+PHY_ScanOperationBackup8192(
+       struct net_device* dev,
+       u8 Operation
+       )
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->up) {
+               switch (Operation) {
+                       case SCAN_OPT_BACKUP:
+                               priv->rtllib->InitialGainHandler(dev,IG_Backup);
+                               break;
+
+                       case SCAN_OPT_RESTORE:
+                               priv->rtllib->InitialGainHandler(dev,IG_Restore);
+                               break;
+
+                       default:
+                               RT_TRACE(COMP_SCAN, "Unknown Scan Backup Operation. \n");
+                               break;
+               }
+       }
+
+}
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_phy.h b/drivers/staging/rtl8192e/r8192E_phy.h
new file mode 100644 (file)
index 0000000..ad0b9fd
--- /dev/null
@@ -0,0 +1,164 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _R819XU_PHY_H
+#define _R819XU_PHY_H
+
+#define MAX_DOZE_WAITING_TIMES_9x 64
+
+#define MAX_PRECMD_CNT 16
+#define MAX_RFDEPENDCMD_CNT 16
+#define MAX_POSTCMD_CNT 16
+
+#ifdef RTL8190P
+#define AGCTAB_ArrayLength                             AGCTAB_ArrayLengthPci
+#define MACPHY_ArrayLength                             MACPHY_ArrayLengthPci
+#define RadioA_ArrayLength                             RadioA_ArrayLengthPci
+#define RadioB_ArrayLength                             RadioB_ArrayLengthPci
+#define MACPHY_Array_PGLength                  MACPHY_Array_PGLengthPci
+#define RadioC_ArrayLength                             RadioC_ArrayLengthPci
+#define RadioD_ArrayLength                             RadioD_ArrayLengthPci
+#define PHY_REGArrayLength                             PHY_REGArrayLengthPci
+#define PHY_REG_1T2RArrayLength                                PHY_REG_1T2RArrayLengthPci
+
+#define Rtl819XMACPHY_Array_PG                 Rtl8190PciMACPHY_Array_PG
+#define Rtl819XMACPHY_Array                            Rtl8190PciMACPHY_Array
+#define Rtl819XRadioA_Array                                    Rtl8190PciRadioA_Array
+#define Rtl819XRadioB_Array                                    Rtl8190PciRadioB_Array
+#define Rtl819XRadioC_Array                                    Rtl8190PciRadioC_Array
+#define Rtl819XRadioD_Array                                    Rtl8190PciRadioD_Array
+#define Rtl819XAGCTAB_Array                            Rtl8190PciAGCTAB_Array
+#define Rtl819XPHY_REGArray                            Rtl8190PciPHY_REGArray
+#define Rtl819XPHY_REG_1T2RArray               Rtl8190PciPHY_REG_1T2RArray
+#endif
+
+#ifdef RTL8192E
+#define AGCTAB_ArrayLength                             AGCTAB_ArrayLengthPciE
+#define MACPHY_ArrayLength                             MACPHY_ArrayLengthPciE
+#define RadioA_ArrayLength                             RadioA_ArrayLengthPciE
+#define RadioB_ArrayLength                             RadioB_ArrayLengthPciE
+#define MACPHY_Array_PGLength                  MACPHY_Array_PGLengthPciE
+#define RadioC_ArrayLength                             RadioC_ArrayLengthPciE
+#define RadioD_ArrayLength                             RadioD_ArrayLengthPciE
+#define PHY_REGArrayLength                             PHY_REGArrayLengthPciE
+#define PHY_REG_1T2RArrayLength                                PHY_REG_1T2RArrayLengthPciE
+
+#define Rtl819XMACPHY_Array_PG                 Rtl8192PciEMACPHY_Array_PG
+#define Rtl819XMACPHY_Array                            Rtl8192PciEMACPHY_Array
+#define Rtl819XRadioA_Array                            Rtl8192PciERadioA_Array
+#define Rtl819XRadioB_Array                            Rtl8192PciERadioB_Array
+#define Rtl819XRadioC_Array                            Rtl8192PciERadioC_Array
+#define Rtl819XRadioD_Array                            Rtl8192PciERadioD_Array
+#define Rtl819XAGCTAB_Array                            Rtl8192PciEAGCTAB_Array
+#define Rtl819XPHY_REGArray                            Rtl8192PciEPHY_REGArray
+#define Rtl819XPHY_REG_1T2RArray                       Rtl8192PciEPHY_REG_1T2RArray
+#endif
+
+
+
+typedef enum _SwChnlCmdID{
+       CmdID_End,
+       CmdID_SetTxPowerLevel,
+       CmdID_BBRegWrite10,
+       CmdID_WritePortUlong,
+       CmdID_WritePortUshort,
+       CmdID_WritePortUchar,
+       CmdID_RF_WriteReg,
+}SwChnlCmdID;
+
+/*--------------------------------Define structure--------------------------------*/
+typedef struct _SwChnlCmd{
+       SwChnlCmdID     CmdID;
+       u32                     Para1;
+       u32                     Para2;
+       u32                     msDelay;
+}__attribute__ ((packed)) SwChnlCmd;
+
+extern u32 rtl819XMACPHY_Array_PG[];
+extern u32 rtl819XPHY_REG_1T2RArray[];
+extern u32 rtl819XAGCTAB_Array[];
+extern u32 rtl819XRadioA_Array[];
+extern u32 rtl819XRadioB_Array[];
+extern u32 rtl819XRadioC_Array[];
+extern u32 rtl819XRadioD_Array[];
+
+typedef enum _HW90_BLOCK{
+       HW90_BLOCK_MAC = 0,
+       HW90_BLOCK_PHY0 = 1,
+       HW90_BLOCK_PHY1 = 2,
+       HW90_BLOCK_RF = 3,
+       HW90_BLOCK_MAXIMUM = 4,
+}HW90_BLOCK_E, *PHW90_BLOCK_E;
+
+typedef enum _RF90_RADIO_PATH{
+       RF90_PATH_A = 0,
+       RF90_PATH_B = 1,
+       RF90_PATH_C = 2,
+       RF90_PATH_D = 3,
+       RF90_PATH_MAX
+}RF90_RADIO_PATH_E, *PRF90_RADIO_PATH_E;
+
+#define bMaskByte0                0xff
+#define bMaskByte1                0xff00
+#define bMaskByte2                0xff0000
+#define bMaskByte3                0xff000000
+#define bMaskHWord                0xffff0000
+#define bMaskLWord                0x0000ffff
+#define bMaskDWord                0xffffffff
+
+extern u8 rtl8192_phy_CheckIsLegalRFPath(struct net_device* dev, u32 eRFPath);
+extern void rtl8192_setBBreg(struct net_device* dev, u32 dwRegAddr, u32 dwBitMask, u32 dwData);
+extern u32 rtl8192_QueryBBReg(struct net_device* dev, u32 dwRegAddr, u32 dwBitMask);
+extern void rtl8192_phy_SetRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask, u32 Data);
+extern u32 rtl8192_phy_QueryRFReg(struct net_device* dev, RF90_RADIO_PATH_E eRFPath, u32 RegAddr, u32 BitMask);
+extern void rtl8192_phy_configmac(struct net_device* dev);
+extern void rtl8192_phyConfigBB(struct net_device* dev, u8 ConfigType);
+extern bool rtl8192_phy_checkBBAndRF(struct net_device* dev, HW90_BLOCK_E CheckBlock, RF90_RADIO_PATH_E eRFPath);
+extern bool rtl8192_BBConfig(struct net_device* dev);
+extern void rtl8192_phy_getTxPower(struct net_device* dev);
+extern void rtl8192_phy_setTxPower(struct net_device* dev, u8 channel);
+extern bool rtl8192_phy_RFConfig(struct net_device* dev);
+extern void rtl8192_phy_updateInitGain(struct net_device* dev);
+extern u8 rtl8192_phy_ConfigRFWithHeaderFile(struct net_device* dev, RF90_RADIO_PATH_E eRFPath);
+
+extern u8 rtl8192_phy_SwChnl(struct net_device* dev, u8 channel);
+extern void rtl8192_SetBWMode(struct net_device *dev, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
+extern void rtl8192_SwChnl_WorkItem(struct net_device *dev);
+extern void rtl8192_SetBWModeWorkItem(struct net_device *dev);
+extern void InitialGain819xPci(struct net_device *dev, u8 Operation);
+
+#if defined RTL8190P
+extern void
+PHY_SetRtl8190pRfOff(struct net_device* dev    );
+#endif
+
+#if defined RTL8192E
+extern void
+PHY_SetRtl8192eRfOff(struct net_device* dev    );
+#endif
+
+bool
+SetRFPowerState(
+       struct net_device* dev,
+       RT_RF_POWER_STATE       eRFPowerState
+       );
+#define PHY_SetRFPowerState SetRFPowerState
+
+extern void PHY_ScanOperationBackup8192(struct net_device* dev,u8 Operation);
+
+#endif
diff --git a/drivers/staging/rtl8192e/r8192E_phyreg.h b/drivers/staging/rtl8192e/r8192E_phyreg.h
new file mode 100644 (file)
index 0000000..7899dd5
--- /dev/null
@@ -0,0 +1,852 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _R819XU_PHYREG_H
+#define _R819XU_PHYREG_H
+
+
+#define   RF_DATA                              0x1d4
+
+#define rPMAC_Reset                            0x100
+#define rPMAC_TxStart                          0x104
+#define rPMAC_TxLegacySIG                      0x108
+#define rPMAC_TxHTSIG1                         0x10c
+#define rPMAC_TxHTSIG2                         0x110
+#define rPMAC_PHYDebug                         0x114
+#define rPMAC_TxPacketNum                      0x118
+#define rPMAC_TxIdle                           0x11c
+#define rPMAC_TxMACHeader0             0x120
+#define rPMAC_TxMACHeader1             0x124
+#define rPMAC_TxMACHeader2             0x128
+#define rPMAC_TxMACHeader3             0x12c
+#define rPMAC_TxMACHeader4             0x130
+#define rPMAC_TxMACHeader5             0x134
+#define rPMAC_TxDataType                       0x138
+#define rPMAC_TxRandomSeed                     0x13c
+#define rPMAC_CCKPLCPPreamble          0x140
+#define rPMAC_CCKPLCPHeader                    0x144
+#define rPMAC_CCKCRC16                         0x148
+#define rPMAC_OFDMRxCRC32OK            0x170
+#define rPMAC_OFDMRxCRC32Er            0x174
+#define rPMAC_OFDMRxParityEr                   0x178
+#define rPMAC_OFDMRxCRC8Er             0x17c
+#define rPMAC_CCKCRxRC16Er                     0x180
+#define rPMAC_CCKCRxRC32Er                     0x184
+#define rPMAC_CCKCRxRC32OK                     0x188
+#define rPMAC_TxStatus                         0x18c
+
+#define        MCS_TXAGC                               0x340
+#define        CCK_TXAGC                               0x348
+
+/*---------------------0x400~0x4ff----------------------*/
+#define        MacBlkCtrl                              0x403
+
+#define rFPGA0_RFMOD                           0x800
+#define rFPGA0_TxInfo                          0x804
+#define rFPGA0_PSDFunction                     0x808
+#define rFPGA0_TxGainStage                     0x80c
+#define rFPGA0_RFTiming1                       0x810
+#define rFPGA0_RFTiming2                       0x814
+#define rFPGA0_XA_HSSIParameter1       0x820
+#define rFPGA0_XA_HSSIParameter2       0x824
+#define rFPGA0_XB_HSSIParameter1       0x828
+#define rFPGA0_XB_HSSIParameter2       0x82c
+#define rFPGA0_XC_HSSIParameter1       0x830
+#define rFPGA0_XC_HSSIParameter2       0x834
+#define rFPGA0_XD_HSSIParameter1       0x838
+#define rFPGA0_XD_HSSIParameter2       0x83c
+#define rFPGA0_XA_LSSIParameter                0x840
+#define rFPGA0_XB_LSSIParameter                0x844
+#define rFPGA0_XC_LSSIParameter                0x848
+#define rFPGA0_XD_LSSIParameter                0x84c
+#define rFPGA0_RFWakeUpParameter       0x850
+#define rFPGA0_RFSleepUpParameter      0x854
+#define rFPGA0_XAB_SwitchControl       0x858
+#define rFPGA0_XCD_SwitchControl       0x85c
+#define rFPGA0_XA_RFInterfaceOE                0x860
+#define rFPGA0_XB_RFInterfaceOE                0x864
+#define rFPGA0_XC_RFInterfaceOE                0x868
+#define rFPGA0_XD_RFInterfaceOE                0x86c
+#define rFPGA0_XAB_RFInterfaceSW       0x870
+#define rFPGA0_XCD_RFInterfaceSW       0x874
+#define rFPGA0_XAB_RFParameter         0x878
+#define rFPGA0_XCD_RFParameter         0x87c
+#define rFPGA0_AnalogParameter1                0x880
+#define rFPGA0_AnalogParameter2                0x884
+#define rFPGA0_AnalogParameter3                0x888
+#define rFPGA0_AnalogParameter4                0x88c
+#define rFPGA0_XA_LSSIReadBack         0x8a0
+#define rFPGA0_XB_LSSIReadBack         0x8a4
+#define rFPGA0_XC_LSSIReadBack         0x8a8
+#define rFPGA0_XD_LSSIReadBack         0x8ac
+#define rFPGA0_PSDReport                       0x8b4
+#define rFPGA0_XAB_RFInterfaceRB       0x8e0
+#define rFPGA0_XCD_RFInterfaceRB       0x8e4
+
+#define rFPGA1_RFMOD                           0x900
+#define rFPGA1_TxBlock                         0x904
+#define rFPGA1_DebugSelect                     0x908
+#define rFPGA1_TxInfo                          0x90c
+
+#define rCCK0_System                           0xa00
+#define rCCK0_AFESetting                       0xa04
+#define rCCK0_CCA                                      0xa08
+#define rCCK0_RxAGC1                           0xa0c
+#define rCCK0_RxAGC2                           0xa10
+#define rCCK0_RxHP                             0xa14
+#define rCCK0_DSPParameter1            0xa18
+#define rCCK0_DSPParameter2            0xa1c
+#define rCCK0_TxFilter1                                0xa20
+#define rCCK0_TxFilter2                                0xa24
+#define rCCK0_DebugPort                                0xa28
+#define rCCK0_FalseAlarmReport         0xa2c
+#define rCCK0_TRSSIReport                      0xa50
+#define rCCK0_RxReport                         0xa54
+#define rCCK0_FACounterLower           0xa5c
+#define rCCK0_FACounterUpper           0xa58
+
+#define rOFDM0_LSTF                            0xc00
+#define rOFDM0_TRxPathEnable           0xc04
+#define rOFDM0_TRMuxPar                                0xc08
+#define rOFDM0_TRSWIsolation                   0xc0c
+#define rOFDM0_XARxAFE                         0xc10
+#define rOFDM0_XARxIQImbalance         0xc14
+#define rOFDM0_XBRxAFE                         0xc18
+#define rOFDM0_XBRxIQImbalance         0xc1c
+#define rOFDM0_XCRxAFE                         0xc20
+#define rOFDM0_XCRxIQImbalance         0xc24
+#define rOFDM0_XDRxAFE                         0xc28
+#define rOFDM0_XDRxIQImbalance         0xc2c
+#define rOFDM0_RxDetector1                     0xc30
+#define rOFDM0_RxDetector2                     0xc34
+#define rOFDM0_RxDetector3                     0xc38
+#define rOFDM0_RxDetector4                     0xc3c
+#define rOFDM0_RxDSP                           0xc40
+#define rOFDM0_CFOandDAGC              0xc44
+#define rOFDM0_CCADropThreshold                0xc48
+#define rOFDM0_ECCAThreshold           0xc4c
+#define rOFDM0_XAAGCCore1              0xc50
+#define rOFDM0_XAAGCCore2              0xc54
+#define rOFDM0_XBAGCCore1              0xc58
+#define rOFDM0_XBAGCCore2              0xc5c
+#define rOFDM0_XCAGCCore1              0xc60
+#define rOFDM0_XCAGCCore2              0xc64
+#define rOFDM0_XDAGCCore1              0xc68
+#define rOFDM0_XDAGCCore2              0xc6c
+#define rOFDM0_AGCParameter1           0xc70
+#define rOFDM0_AGCParameter2           0xc74
+#define rOFDM0_AGCRSSITable            0xc78
+#define rOFDM0_HTSTFAGC                                0xc7c
+#define rOFDM0_XATxIQImbalance         0xc80
+#define rOFDM0_XATxAFE                         0xc84
+#define rOFDM0_XBTxIQImbalance         0xc88
+#define rOFDM0_XBTxAFE                         0xc8c
+#define rOFDM0_XCTxIQImbalance         0xc90
+#define rOFDM0_XCTxAFE                         0xc94
+#define rOFDM0_XDTxIQImbalance         0xc98
+#define rOFDM0_XDTxAFE                         0xc9c
+#define rOFDM0_RxHPParameter           0xce0
+#define rOFDM0_TxPseudoNoiseWgt                0xce4
+#define rOFDM0_FrameSync                       0xcf0
+#define rOFDM0_DFSReport                       0xcf4
+#define rOFDM0_TxCoeff1                                0xca4
+#define rOFDM0_TxCoeff2                                0xca8
+#define rOFDM0_TxCoeff3                                0xcac
+#define rOFDM0_TxCoeff4                                0xcb0
+#define rOFDM0_TxCoeff5                                0xcb4
+#define rOFDM0_TxCoeff6                                0xcb8
+
+
+#define rOFDM1_LSTF                            0xd00
+#define rOFDM1_TRxPathEnable           0xd04
+#define rOFDM1_CFO                             0xd08
+#define rOFDM1_CSI1                            0xd10
+#define rOFDM1_SBD                             0xd14
+#define rOFDM1_CSI2                            0xd18
+#define rOFDM1_CFOTracking                     0xd2c
+#define rOFDM1_TRxMesaure1             0xd34
+#define rOFDM1_IntfDet                         0xd3c
+#define rOFDM1_PseudoNoiseStateAB 0xd50
+#define rOFDM1_PseudoNoiseStateCD 0xd54
+#define rOFDM1_RxPseudoNoiseWgt   0xd58
+#define rOFDM_PHYCounter1                      0xda0
+#define rOFDM_PHYCounter2                      0xda4
+#define rOFDM_PHYCounter3                      0xda8
+#define rOFDM_ShortCFOAB                       0xdac
+#define rOFDM_ShortCFOCD                       0xdb0
+#define rOFDM_LongCFOAB                                0xdb4
+#define rOFDM_LongCFOCD                                0xdb8
+#define rOFDM_TailCFOAB                                0xdbc
+#define rOFDM_TailCFOCD                                0xdc0
+#define rOFDM_PWMeasure1               0xdc4
+#define rOFDM_PWMeasure2               0xdc8
+#define rOFDM_BWReport                         0xdcc
+#define rOFDM_AGCReport                                0xdd0
+#define rOFDM_RxSNR                            0xdd4
+#define rOFDM_RxEVMCSI                         0xdd8
+#define rOFDM_SIGReport                                0xddc
+
+#define rTxAGC_Rate18_06                       0xe00
+#define rTxAGC_Rate54_24                       0xe04
+#define rTxAGC_CCK_Mcs32                       0xe08
+#define rTxAGC_Mcs03_Mcs00                     0xe10
+#define rTxAGC_Mcs07_Mcs04                     0xe14
+#define rTxAGC_Mcs11_Mcs08                     0xe18
+#define rTxAGC_Mcs15_Mcs12                     0xe1c
+
+
+#define rZebra1_HSSIEnable             0x0
+#define rZebra1_TRxEnable1             0x1
+#define rZebra1_TRxEnable2             0x2
+#define rZebra1_AGC                            0x4
+#define rZebra1_ChargePump             0x5
+#define rZebra1_Channel                                0x7
+#define rZebra1_TxGain                         0x8
+#define rZebra1_TxLPF                          0x9
+#define rZebra1_RxLPF                          0xb
+#define rZebra1_RxHPFCorner            0xc
+
+#define rGlobalCtrl                            0
+#define rRTL8256_TxLPF                         19
+#define rRTL8256_RxLPF                         11
+
+#define rRTL8258_TxLPF                         0x11
+#define rRTL8258_RxLPF                         0x13
+#define rRTL8258_RSSILPF               0xa
+
+#define bBBResetB                                      0x100
+#define bGlobalResetB                          0x200
+#define bOFDMTxStart                           0x4
+#define bCCKTxStart                                    0x8
+#define bCRC32Debug                            0x100
+#define bPMACLoopback                          0x10
+#define bTxLSIG                                                0xffffff
+#define bOFDMTxRate                            0xf
+#define bOFDMTxReserved                                0x10
+#define bOFDMTxLength                          0x1ffe0
+#define bOFDMTxParity                          0x20000
+#define bTxHTSIG1                                      0xffffff
+#define bTxHTMCSRate                           0x7f
+#define bTxHTBW                                                0x80
+#define bTxHTLength                            0xffff00
+#define bTxHTSIG2                                      0xffffff
+#define bTxHTSmoothing                         0x1
+#define bTxHTSounding                          0x2
+#define bTxHTReserved                          0x4
+#define bTxHTAggreation                                0x8
+#define bTxHTSTBC                                      0x30
+#define bTxHTAdvanceCoding                     0x40
+#define bTxHTShortGI                           0x80
+#define bTxHTNumberHT_LTF                      0x300
+#define bTxHTCRC8                                      0x3fc00
+#define bCounterReset                          0x10000
+#define bNumOfOFDMTx                           0xffff
+#define bNumOfCCKTx                            0xffff0000
+#define bTxIdleInterval                                        0xffff
+#define bOFDMService                           0xffff0000
+#define bTxMACHeader                           0xffffffff
+#define bTxDataInit                                    0xff
+#define bTxHTMode                              0x100
+#define bTxDataType                            0x30000
+#define bTxRandomSeed                          0xffffffff
+#define bCCKTxPreamble                         0x1
+#define bCCKTxSFD                                      0xffff0000
+#define bCCKTxSIG                                      0xff
+#define bCCKTxService                          0xff00
+#define bCCKLengthExt                          0x8000
+#define bCCKTxLength                           0xffff0000
+#define bCCKTxCRC16                            0xffff
+#define bCCKTxStatus                           0x1
+#define bOFDMTxStatus                          0x2
+
+#define bRFMOD                                         0x1
+#define bJapanMode                             0x2
+#define bCCKTxSC                                       0x30
+#define bCCKEn                                         0x1000000
+#define bOFDMEn                                                0x2000000
+#define bOFDMRxADCPhase                                0x10000
+#define bOFDMTxDACPhase                                0x40000
+#define bXATxAGC                                       0x3f
+#define bXBTxAGC                                       0xf00
+#define bXCTxAGC                                       0xf000
+#define bXDTxAGC                                       0xf0000
+#define bPAStart                                       0xf0000000
+#define bTRStart                                       0x00f00000
+#define bRFStart                                       0x0000f000
+#define bBBStart                                       0x000000f0
+#define bBBCCKStart                            0x0000000f
+#define bPAEnd                                         0xf
+#define bTREnd                                         0x0f000000
+#define bRFEnd                                         0x000f0000
+#define bCCAMask                                       0x000000f0
+#define bR2RCCAMask                            0x00000f00
+#define bHSSI_R2TDelay                         0xf8000000
+#define bHSSI_T2RDelay                         0xf80000
+#define bContTxHSSI                            0x400
+#define bIGFromCCK                             0x200
+#define bAGCAddress                            0x3f
+#define bRxHPTx                                                0x7000
+#define bRxHPT2R                                       0x38000
+#define bRxHPCCKIni                            0xc0000
+#define bAGCTxCode                             0xc00000
+#define bAGCRxCode                             0x300000
+#define b3WireDataLength                       0x800
+#define b3WireAddressLength                    0x400
+#define b3WireRFPowerDown                      0x1
+#define b5GPAPEPolarity                                0x40000000
+#define b2GPAPEPolarity                                0x80000000
+#define bRFSW_TxDefaultAnt                     0x3
+#define bRFSW_TxOptionAnt                      0x30
+#define bRFSW_RxDefaultAnt                     0x300
+#define bRFSW_RxOptionAnt                      0x3000
+#define bRFSI_3WireData                                0x1
+#define bRFSI_3WireClock                       0x2
+#define bRFSI_3WireLoad                                0x4
+#define bRFSI_3WireRW                          0x8
+#define bRFSI_3Wire                                    0xf
+#define bRFSI_RFENV                            0x10
+#define bRFSI_TRSW                             0x20
+#define bRFSI_TRSWB                            0x40
+#define bRFSI_ANTSW                            0x100
+#define bRFSI_ANTSWB                           0x200
+#define bRFSI_PAPE                                     0x400
+#define bRFSI_PAPE5G                           0x800
+#define bBandSelect                                    0x1
+#define bHTSIG2_GI                                     0x80
+#define bHTSIG2_Smoothing                      0x01
+#define bHTSIG2_Sounding                       0x02
+#define bHTSIG2_Aggreaton                      0x08
+#define bHTSIG2_STBC                           0x30
+#define bHTSIG2_AdvCoding                      0x40
+#define bHTSIG2_NumOfHTLTF             0x300
+#define bHTSIG2_CRC8                           0x3fc
+#define bHTSIG1_MCS                            0x7f
+#define bHTSIG1_BandWidth                      0x80
+#define bHTSIG1_HTLength                       0xffff
+#define bLSIG_Rate                                     0xf
+#define bLSIG_Reserved                         0x10
+#define bLSIG_Length                           0x1fffe
+#define bLSIG_Parity                                   0x20
+#define bCCKRxPhase                            0x4
+#define bLSSIReadAddress                       0x3f000000
+#define bLSSIReadEdge                          0x80000000
+#define bLSSIReadBackData                      0xfff
+#define bLSSIReadOKFlag                                0x1000
+#define bCCKSampleRate                         0x8
+
+#define bRegulator0Standby                     0x1
+#define bRegulatorPLLStandby                   0x2
+#define bRegulator1Standby                     0x4
+#define bPLLPowerUp                            0x8
+#define bDPLLPowerUp                           0x10
+#define bDA10PowerUp                           0x20
+#define bAD7PowerUp                            0x200
+#define bDA6PowerUp                            0x2000
+#define bXtalPowerUp                           0x4000
+#define b40MDClkPowerUP                                0x8000
+#define bDA6DebugMode                          0x20000
+#define bDA6Swing                                      0x380000
+#define bADClkPhase                            0x4000000
+#define b80MClkDelay                           0x18000000
+#define bAFEWatchDogEnable                     0x20000000
+#define bXtalCap                                       0x0f000000
+#define bXtalCap01                                     0xc0000000
+#define bXtalCap23                                     0x3
+#define bXtalCap92x                                    0x0f000000
+#define bIntDifClkEnable                       0x400
+#define bExtSigClkEnable                       0x800
+#define bBandgapMbiasPowerUp           0x10000
+#define bAD11SHGain                            0xc0000
+#define bAD11InputRange                                0x700000
+#define bAD11OPCurrent                         0x3800000
+#define bIPathLoopback                         0x4000000
+#define bQPathLoopback                         0x8000000
+#define bAFELoopback                           0x10000000
+#define bDA10Swing                             0x7e0
+#define bDA10Reverse                           0x800
+#define bDAClkSource                           0x1000
+#define bAD7InputRange                         0x6000
+#define bAD7Gain                                       0x38000
+#define bAD7OutputCMMode                       0x40000
+#define bAD7InputCMMode                                0x380000
+#define bAD7Current                                    0xc00000
+#define bRegulatorAdjust                       0x7000000
+#define bAD11PowerUpAtTx                       0x1
+#define bDA10PSAtTx                            0x10
+#define bAD11PowerUpAtRx                       0x100
+#define bDA10PSAtRx                            0x1000
+
+#define bCCKRxAGCFormat                                0x200
+
+#define bPSDFFTSamplepPoint                    0xc000
+#define bPSDAverageNum                         0x3000
+#define bIQPathControl                         0xc00
+#define bPSDFreq                                       0x3ff
+#define bPSDAntennaPath                                0x30
+#define bPSDIQSwitch                           0x40
+#define bPSDRxTrigger                          0x400000
+#define bPSDTxTrigger                          0x80000000
+#define bPSDSineToneScale                      0x7f000000
+#define bPSDReport                                     0xffff
+
+#define bOFDMTxSC                              0x30000000
+#define bCCKTxOn                                       0x1
+#define bOFDMTxOn                              0x2
+#define bDebugPage                             0xfff
+#define bDebugItem                             0xff
+#define bAntL                                  0x10
+#define bAntNonHT                                      0x100
+#define bAntHT1                                        0x1000
+#define bAntHT2                                                0x10000
+#define bAntHT1S1                                      0x100000
+#define bAntNonHTS1                            0x1000000
+
+#define bCCKBBMode                             0x3
+#define bCCKTxPowerSaving                      0x80
+#define bCCKRxPowerSaving                      0x40
+#define bCCKSideBand                           0x10
+#define bCCKScramble                           0x8
+#define bCCKAntDiversity                       0x8000
+#define bCCKCarrierRecovery            0x4000
+#define bCCKTxRate                             0x3000
+#define bCCKDCCancel                           0x0800
+#define bCCKISICancel                          0x0400
+#define bCCKMatchFilter                                0x0200
+#define bCCKEqualizer                          0x0100
+#define bCCKPreambleDetect                     0x800000
+#define bCCKFastFalseCCA                       0x400000
+#define bCCKChEstStart                         0x300000
+#define bCCKCCACount                           0x080000
+#define bCCKcs_lim                                     0x070000
+#define bCCKBistMode                           0x80000000
+#define bCCKCCAMask                            0x40000000
+#define bCCKTxDACPhase                 0x4
+#define bCCKRxADCPhase                 0x20000000
+#define bCCKr_cp_mode0                 0x0100
+#define bCCKTxDCOffset                         0xf0
+#define bCCKRxDCOffset                         0xf
+#define bCCKCCAMode                            0xc000
+#define bCCKFalseCS_lim                                0x3f00
+#define bCCKCS_ratio                           0xc00000
+#define bCCKCorgBit_sel                                0x300000
+#define bCCKPD_lim                                     0x0f0000
+#define bCCKNewCCA                             0x80000000
+#define bCCKRxHPofIG                           0x8000
+#define bCCKRxIG                                       0x7f00
+#define bCCKLNAPolarity                                0x800000
+#define bCCKRx1stGain                          0x7f0000
+#define bCCKRFExtend                           0x20000000
+#define bCCKRxAGCSatLevel                      0x1f000000
+#define bCCKRxAGCSatCount                      0xe0
+#define bCCKRxRFSettle                         0x1f
+#define bCCKFixedRxAGC                         0x8000
+#define bCCKAntennaPolarity                    0x2000
+#define bCCKTxFilterType                       0x0c00
+#define bCCKRxAGCReportType            0x0300
+#define bCCKRxDAGCEn                           0x80000000
+#define bCCKRxDAGCPeriod                       0x20000000
+#define bCCKRxDAGCSatLevel             0x1f000000
+#define bCCKTimingRecovery                     0x800000
+#define bCCKTxC0                                       0x3f0000
+#define bCCKTxC1                                       0x3f000000
+#define bCCKTxC2                                       0x3f
+#define bCCKTxC3                                       0x3f00
+#define bCCKTxC4                                       0x3f0000
+#define bCCKTxC5                                       0x3f000000
+#define bCCKTxC6                                       0x3f
+#define bCCKTxC7                                       0x3f00
+#define bCCKDebugPort                          0xff0000
+#define bCCKDACDebug                           0x0f000000
+#define bCCKFalseAlarmEnable                   0x8000
+#define bCCKFalseAlarmRead                     0x4000
+#define bCCKTRSSI                                      0x7f
+#define bCCKRxAGCReport                                0xfe
+#define bCCKRxReport_AntSel                    0x80000000
+#define bCCKRxReport_MFOff                     0x40000000
+#define bCCKRxRxReport_SQLoss          0x20000000
+#define bCCKRxReport_Pktloss                   0x10000000
+#define bCCKRxReport_Lockedbit         0x08000000
+#define bCCKRxReport_RateError         0x04000000
+#define bCCKRxReport_RxRate                    0x03000000
+#define bCCKRxFACounterLower           0xff
+#define bCCKRxFACounterUpper           0xff000000
+#define bCCKRxHPAGCStart                       0xe000
+#define bCCKRxHPAGCFinal                       0x1c00
+
+#define bCCKRxFalseAlarmEnable         0x8000
+#define bCCKFACounterFreeze                    0x4000
+
+#define bCCKTxPathSel                          0x10000000
+#define bCCKDefaultRxPath                      0xc000000
+#define bCCKOptionRxPath                       0x3000000
+
+#define bNumOfSTF                                      0x3
+#define bShift_L                                       0xc0
+#define bGI_TH                                         0xc
+#define bRxPathA                                       0x1
+#define bRxPathB                                       0x2
+#define bRxPathC                                       0x4
+#define bRxPathD                                       0x8
+#define bTxPathA                                       0x1
+#define bTxPathB                                       0x2
+#define bTxPathC                                       0x4
+#define bTxPathD                                       0x8
+#define bTRSSIFreq                                     0x200
+#define bADCBackoff                                    0x3000
+#define bDFIRBackoff                                   0xc000
+#define bTRSSILatchPhase                       0x10000
+#define bRxIDCOffset                                   0xff
+#define bRxQDCOffset                                   0xff00
+#define bRxDFIRMode                            0x1800000
+#define bRxDCNFType                            0xe000000
+#define bRXIQImb_A                                     0x3ff
+#define bRXIQImb_B                                     0xfc00
+#define bRXIQImb_C                                     0x3f0000
+#define bRXIQImb_D                                     0xffc00000
+#define bDC_dc_Notch                           0x60000
+#define bRxNBINotch                                    0x1f000000
+#define bPD_TH                                         0xf
+#define bPD_TH_Opt2                            0xc000
+#define bPWED_TH                                       0x700
+#define bIfMF_Win_L                                    0x800
+#define bPD_Option                                     0x1000
+#define bMF_Win_L                                      0xe000
+#define bBW_Search_L                           0x30000
+#define bwin_enh_L                                     0xc0000
+#define bBW_TH                                         0x700000
+#define bED_TH2                                                0x3800000
+#define bBW_option                                     0x4000000
+#define bRatio_TH                                      0x18000000
+#define bWindow_L                                      0xe0000000
+#define bSBD_Option                                    0x1
+#define bFrame_TH                                      0x1c
+#define bFS_Option                                     0x60
+#define bDC_Slope_check                                0x80
+#define bFGuard_Counter_DC_L                   0xe00
+#define bFrame_Weight_Short                    0x7000
+#define bSub_Tune                                      0xe00000
+#define bFrame_DC_Length                       0xe000000
+#define bSBD_start_offset                      0x30000000
+#define bFrame_TH_2                            0x7
+#define bFrame_GI2_TH                          0x38
+#define bGI2_Sync_en                           0x40
+#define bSarch_Short_Early                     0x300
+#define bSarch_Short_Late                      0xc00
+#define bSarch_GI2_Late                                0x70000
+#define bCFOAntSum                             0x1
+#define bCFOAcc                                                0x2
+#define bCFOStartOffset                                0xc
+#define bCFOLookBack                           0x70
+#define bCFOSumWeight                          0x80
+#define bDAGCEnable                                    0x10000
+#define bTXIQImb_A                                     0x3ff
+#define bTXIQImb_B                                     0xfc00
+#define bTXIQImb_C                                     0x3f0000
+#define bTXIQImb_D                                     0xffc00000
+#define bTxIDCOffset                                   0xff
+#define bTxQDCOffset                                   0xff00
+#define bTxDFIRMode                            0x10000
+#define bTxPesudoNoiseOn                       0x4000000
+#define bTxPesudoNoise_A                       0xff
+#define bTxPesudoNoise_B                       0xff00
+#define bTxPesudoNoise_C                       0xff0000
+#define bTxPesudoNoise_D                       0xff000000
+#define bCCADropOption                         0x20000
+#define bCCADropThres                          0xfff00000
+#define bEDCCA_H                                       0xf
+#define bEDCCA_L                                       0xf0
+#define bLambda_ED               0x300
+#define bRxInitialGain           0x7f
+#define bRxAntDivEn              0x80
+#define bRxAGCAddressForLNA      0x7f00
+#define bRxHighPowerFlow         0x8000
+#define bRxAGCFreezeThres        0xc0000
+#define bRxFreezeStep_AGC1       0x300000
+#define bRxFreezeStep_AGC2       0xc00000
+#define bRxFreezeStep_AGC3       0x3000000
+#define bRxFreezeStep_AGC0       0xc000000
+#define bRxRssi_Cmp_En           0x10000000
+#define bRxQuickAGCEn            0x20000000
+#define bRxAGCFreezeThresMode    0x40000000
+#define bRxOverFlowCheckType     0x80000000
+#define bRxAGCShift              0x7f
+#define bTRSW_Tri_Only           0x80
+#define bPowerThres              0x300
+#define bRxAGCEn                 0x1
+#define bRxAGCTogetherEn         0x2
+#define bRxAGCMin                0x4
+#define bRxHP_Ini                0x7
+#define bRxHP_TRLNA              0x70
+#define bRxHP_RSSI               0x700
+#define bRxHP_BBP1               0x7000
+#define bRxHP_BBP2               0x70000
+#define bRxHP_BBP3               0x700000
+#define bRSSI_H                  0x7f0000
+#define bRSSI_Gen                0x7f000000
+#define bRxSettle_TRSW           0x7
+#define bRxSettle_LNA            0x38
+#define bRxSettle_RSSI           0x1c0
+#define bRxSettle_BBP            0xe00
+#define bRxSettle_RxHP           0x7000
+#define bRxSettle_AntSW_RSSI     0x38000
+#define bRxSettle_AntSW          0xc0000
+#define bRxProcessTime_DAGC      0x300000
+#define bRxSettle_HSSI           0x400000
+#define bRxProcessTime_BBPPW     0x800000
+#define bRxAntennaPowerShift     0x3000000
+#define bRSSITableSelect         0xc000000
+#define bRxHP_Final              0x7000000
+#define bRxHTSettle_BBP          0x7
+#define bRxHTSettle_HSSI         0x8
+#define bRxHTSettle_RxHP         0x70
+#define bRxHTSettle_BBPPW        0x80
+#define bRxHTSettle_Idle         0x300
+#define bRxHTSettle_Reserved     0x1c00
+#define bRxHTRxHPEn              0x8000
+#define bRxHTAGCFreezeThres      0x30000
+#define bRxHTAGCTogetherEn       0x40000
+#define bRxHTAGCMin              0x80000
+#define bRxHTAGCEn               0x100000
+#define bRxHTDAGCEn              0x200000
+#define bRxHTRxHP_BBP            0x1c00000
+#define bRxHTRxHP_Final          0xe0000000
+#define bRxPWRatioTH             0x3
+#define bRxPWRatioEn             0x4
+#define bRxMFHold                0x3800
+#define bRxPD_Delay_TH1          0x38
+#define bRxPD_Delay_TH2          0x1c0
+#define bRxPD_DC_COUNT_MAX       0x600
+#define bRxPD_Delay_TH           0x8000
+#define bRxProcess_Delay         0xf0000
+#define bRxSearchrange_GI2_Early 0x700000
+#define bRxFrame_Guard_Counter_L 0x3800000
+#define bRxSGI_Guard_L           0xc000000
+#define bRxSGI_Search_L          0x30000000
+#define bRxSGI_TH                0xc0000000
+#define bDFSCnt0                 0xff
+#define bDFSCnt1                 0xff00
+#define bDFSFlag                 0xf0000
+
+#define bMFWeightSum             0x300000
+#define bMinIdxTH                0x7f000000
+
+#define bDAFormat                0x40000
+
+#define bTxChEmuEnable           0x01000000
+
+#define bTRSWIsolation_A         0x7f
+#define bTRSWIsolation_B         0x7f00
+#define bTRSWIsolation_C         0x7f0000
+#define bTRSWIsolation_D         0x7f000000
+
+#define bExtLNAGain              0x7c00
+
+#define bSTBCEn                  0x4
+#define bAntennaMapping          0x10
+#define bNss                     0x20
+#define bCFOAntSumD              0x200
+#define bPHYCounterReset         0x8000000
+#define bCFOReportGet            0x4000000
+#define bOFDMContinueTx          0x10000000
+#define bOFDMSingleCarrier       0x20000000
+#define bOFDMSingleTone          0x40000000
+#define bHTDetect                0x100
+#define bCFOEn                   0x10000
+#define bCFOValue                0xfff00000
+#define bSigTone_Re              0x3f
+#define bSigTone_Im              0x7f00
+#define bCounter_CCA             0xffff
+#define bCounter_ParityFail      0xffff0000
+#define bCounter_RateIllegal     0xffff
+#define bCounter_CRC8Fail        0xffff0000
+#define bCounter_MCSNoSupport    0xffff
+#define bCounter_FastSync        0xffff
+#define bShortCFO                0xfff
+#define bShortCFOTLength         12
+#define bShortCFOFLength         11
+#define bLongCFO                 0x7ff
+#define bLongCFOTLength          11
+#define bLongCFOFLength          11
+#define bTailCFO                 0x1fff
+#define bTailCFOTLength          13
+#define bTailCFOFLength          12
+
+#define bmax_en_pwdB             0xffff
+#define bCC_power_dB             0xffff0000
+#define bnoise_pwdB              0xffff
+#define bPowerMeasTLength        10
+#define bPowerMeasFLength        3
+#define bRx_HT_BW                0x1
+#define bRxSC                    0x6
+#define bRx_HT                   0x8
+
+#define bNB_intf_det_on          0x1
+#define bIntf_win_len_cfg        0x30
+#define bNB_Intf_TH_cfg          0x1c0
+
+#define bRFGain                  0x3f
+#define bTableSel                0x40
+#define bTRSW                    0x80
+
+#define bRxSNR_A                 0xff
+#define bRxSNR_B                 0xff00
+#define bRxSNR_C                 0xff0000
+#define bRxSNR_D                 0xff000000
+#define bSNREVMTLength           8
+#define bSNREVMFLength           1
+
+#define bCSI1st                  0xff
+#define bCSI2nd                  0xff00
+#define bRxEVM1st                0xff0000
+#define bRxEVM2nd                0xff000000
+
+#define bSIGEVM                  0xff
+#define bPWDB                    0xff00
+#define bSGIEN                   0x10000
+
+#define bSFactorQAM1             0xf
+#define bSFactorQAM2             0xf0
+#define bSFactorQAM3             0xf00
+#define bSFactorQAM4             0xf000
+#define bSFactorQAM5             0xf0000
+#define bSFactorQAM6             0xf0000
+#define bSFactorQAM7             0xf00000
+#define bSFactorQAM8             0xf000000
+#define bSFactorQAM9             0xf0000000
+#define bCSIScheme               0x100000
+
+#define bNoiseLvlTopSet          0x3
+#define bChSmooth                0x4
+#define bChSmoothCfg1            0x38
+#define bChSmoothCfg2            0x1c0
+#define bChSmoothCfg3            0xe00
+#define bChSmoothCfg4            0x7000
+#define bMRCMode                 0x800000
+#define bTHEVMCfg                0x7000000
+
+#define bLoopFitType             0x1
+#define bUpdCFO                  0x40
+#define bUpdCFOOffData           0x80
+#define bAdvUpdCFO               0x100
+#define bAdvTimeCtrl             0x800
+#define bUpdClko                 0x1000
+#define bFC                      0x6000
+#define bTrackingMode            0x8000
+#define bPhCmpEnable             0x10000
+#define bUpdClkoLTF              0x20000
+#define bComChCFO                0x40000
+#define bCSIEstiMode             0x80000
+#define bAdvUpdEqz               0x100000
+#define bUChCfg                  0x7000000
+#define bUpdEqz                  0x8000000
+
+#define bTxAGCRate18_06                        0x7f7f7f7f
+#define bTxAGCRate54_24                        0x7f7f7f7f
+#define bTxAGCRateMCS32                0x7f
+#define bTxAGCRateCCK                  0x7f00
+#define bTxAGCRateMCS3_MCS0    0x7f7f7f7f
+#define bTxAGCRateMCS7_MCS4    0x7f7f7f7f
+#define bTxAGCRateMCS11_MCS8   0x7f7f7f7f
+#define bTxAGCRateMCS15_MCS12  0x7f7f7f7f
+
+
+#define bRxPesudoNoiseOn         0x20000000
+#define bRxPesudoNoise_A         0xff
+#define bRxPesudoNoise_B         0xff00
+#define bRxPesudoNoise_C         0xff0000
+#define bRxPesudoNoise_D         0xff000000
+#define bPesudoNoiseState_A      0xffff
+#define bPesudoNoiseState_B      0xffff0000
+#define bPesudoNoiseState_C      0xffff
+#define bPesudoNoiseState_D      0xffff0000
+
+#define bZebra1_HSSIEnable        0x8
+#define bZebra1_TRxControl        0xc00
+#define bZebra1_TRxGainSetting    0x07f
+#define bZebra1_RxCorner          0xc00
+#define bZebra1_TxChargePump      0x38
+#define bZebra1_RxChargePump      0x7
+#define bZebra1_ChannelNum        0xf80
+#define bZebra1_TxLPFBW           0x400
+#define bZebra1_RxLPFBW           0x600
+
+#define bRTL8256RegModeCtrl1      0x100
+#define bRTL8256RegModeCtrl0      0x40
+#define bRTL8256_TxLPFBW          0x18
+#define bRTL8256_RxLPFBW          0x600
+
+#define bRTL8258_TxLPFBW          0xc
+#define bRTL8258_RxLPFBW          0xc00
+#define bRTL8258_RSSILPFBW        0xc0
+
+#define bByte0                    0x1
+#define bByte1                    0x2
+#define bByte2                    0x4
+#define bByte3                    0x8
+#define bWord0                    0x3
+#define bWord1                    0xc
+#define bDWord                    0xf
+
+#define bMaskByte0                0xff
+#define bMaskByte1                0xff00
+#define bMaskByte2                0xff0000
+#define bMaskByte3                0xff000000
+#define bMaskHWord                0xffff0000
+#define bMaskLWord                0x0000ffff
+#define bMaskDWord                0xffffffff
+
+#define bMask12Bits               0xfff
+
+#define bEnable                   0x1
+#define bDisable                  0x0
+
+#define LeftAntenna               0x0
+#define RightAntenna              0x1
+
+#define tCheckTxStatus            500
+#define tUpdateRxCounter          100
+
+#define rateCCK     0
+#define rateOFDM    1
+#define rateHT      2
+
+#define bPMAC_End                 0x1ff
+#define bFPGAPHY0_End             0x8ff
+#define bFPGAPHY1_End             0x9ff
+#define bCCKPHY0_End              0xaff
+#define bOFDMPHY0_End             0xcff
+#define bOFDMPHY1_End             0xdff
+
+
+#define bPMACControl              0x0
+#define bWMACControl              0x1
+#define bWNICControl              0x2
+
+#define PathA                     0x0
+#define PathB                     0x1
+#define PathC                     0x2
+#define PathD                     0x3
+
+#define        rRTL8256RxMixerPole             0xb
+#define                bZebraRxMixerPole               0x6
+#define                rRTL8256TxBBOPBias        0x9
+#define                bRTL8256TxBBOPBias       0x400
+#define                rRTL8256TxBBBW             19
+#define                bRTL8256TxBBBW                  0x18
+
+#endif
diff --git a/drivers/staging/rtl8192e/readme b/drivers/staging/rtl8192e/readme
new file mode 100644 (file)
index 0000000..10a66f5
--- /dev/null
@@ -0,0 +1,160 @@
+What this layer should do
+
+- It mantain the old mechanism as alternative, so the
+  ipw2100 driver works with really few changes.
+- Encapsulate / Decapsulate rtllib packet
+- Handle fragmentation
+- Optionally provide an alterantive mechanism for netif queue stop/wake,
+  so that the rtllib layer will pass one fragment per time instead of
+  one txb struct per time. so the driver can stop the queue in the middle
+  of a packet.
+- Provide two different TX interfaces for cards that can handle management
+  frames on one HW queue, and data on another, and for cards that have only
+  one HW queue  (the latter untested and very, very rough).
+- Optionally provide the logic for handling IBSS/MASTER/MONITOR/BSS modes
+  and for the channel, essid and wap get/set wireless extension requests.
+  so that the driver has only to change channel when the ieee stack tell it.
+- Optionally provide a scanning mechanism so that the driver has not to
+  worry about this, just implement the set channel calback and pass
+  frames to the upper layer
+- Optionally provide the bss client protocol handshaking (just with open
+  authentication)
+- Optionally provide the probe request send mechanism
+- Optionally provide the bss master mode logic to handle association
+  protocol (only open authentication) and probe responses.
+- SW wep encryption (with open authentication)
+- It collects some stats
+- It provides beacons to the card when it ask for them
+
+What this layer doesn't do (yet)
+- Perform shared authentication
+- Have full support for master mode (the AP should loop back in the air
+  frames from an associated client to another. This could be done easily
+  with few lines of code, and it is done in my previous version of the
+  stach, but a table of association must be keept and a disassociation
+  policy must be decided and implemented.
+- Handle cleanly the full ieee 802.11 protocol. In AP mode it never
+  disassociate clients, and it is really prone to always allow access.
+  In bss client mode it is a bit rough with AP deauth and disassoc requests.
+- It has not any entry point to view the collected stats.
+- Altought it takes care of the card supported rates in the management frame
+  it sends, support for rate changing on TXed packet is not complete.
+- Give up once associated in bss client mode (it never detect a
+  signal loss condition to disassociate and restart scanning)
+- Provide a mechanism for enabling the TX in monitor mode, so
+  userspace programs can TX raw packets.
+- Provide a mechanism for cards that need that the SW take care of beacon
+  TX completely, in sense that the SW has to enqueue by itself beacons
+  to the card so it TX them (if any...)
+APIs
+
+Callback functions in the original stack has been mantained.
+following has been added (from rtllib.h)
+
+       /* Softmac-generated frames (mamagement) are TXed via this
+        * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is
+        * not set. As some cards may have different HW queues that
+        * one might want to use for data and management frames
+        * the option to have two callbacks might be useful.
+        * This fucntion can't sleep.
+        */
+       int (*softmac_hard_start_xmit)(struct sk_buff *skb,
+                              struct net_device *dev);
+
+       /* used instead of hard_start_xmit (not softmac_hard_start_xmit)
+        * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data
+        * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set
+        * then also management frames are sent via this callback.
+        * This function can't sleep.
+        */
+       void (*softmac_data_hard_start_xmit)(struct sk_buff *skb,
+                              struct net_device *dev);
+
+       /* stops the HW queue for DATA frames. Useful to avoid
+        * waste time to TX data frame when we are reassociating
+        * This function can sleep.
+        */
+       void (*data_hard_stop)(struct net_device *dev);
+
+       /* OK this is complementar to data_poll_hard_stop */
+       void (*data_hard_resume)(struct net_device *dev);
+
+       /* ask to the driver to retune the radio .
+        * This function can sleep. the driver should ensure
+        * the radio has been swithced before return.
+        */
+       void (*set_chan)(struct net_device *dev,short ch);
+
+       /* These are not used if the ieee stack takes care of
+        * scanning (IEEE_SOFTMAC_SCAN feature set).
+        * In this case only the set_chan is used.
+        *
+        * The syncro version is similar to the start_scan but
+        * does not return until all channels has been scanned.
+        * this is called in user context and should sleep,
+        * it is called in a work_queue when swithcing to ad-hoc mode
+        * or in behalf of iwlist scan when the card is associated
+        * and root user ask for a scan.
+        * the fucntion stop_scan should stop both the syncro and
+        * background scanning and can sleep.
+        * The fucntion start_scan should initiate the background
+        * scanning and can't sleep.
+        */
+       void (*scan_syncro)(struct net_device *dev);
+       void (*start_scan)(struct net_device *dev);
+       void (*stop_scan)(struct net_device *dev);
+
+       /* indicate the driver that the link state is changed
+        * for example it may indicate the card is associated now.
+        * Driver might be interested in this to apply RX filter
+        * rules or simply light the LINK led
+        */
+       void (*link_change)(struct net_device *dev);
+
+Functions hard_data_[resume/stop] are optional and should not be used
+if the driver decides to uses data+management frames enqueue in a
+single HQ queue (thus using just the softmac_hard_data_start_xmit
+callback).
+
+Function that the driver can use are:
+
+rtllib_get_beacon             - this is called by the driver when
+                                   the HW needs a beacon.
+rtllib_softmac_start_protocol - this should normally be called in the
+                                   driver open function
+rtllib_softmac_stop_protocol  - the opposite of the above
+rtllib_wake_queue             - this is similar to netif_wake_queue
+rtllib_reset_queue            - this throw away fragments pending(if any)
+rtllib_stop_queue             - this is similar to netif_stop_queue
+
+
+known BUGS:
+- When performing syncro scan (possiblily when swithcing to ad-hoc mode
+  and when running iwlist scan when associated) there is still an odd
+  behaviour.. I have not looked in this more accurately (yet).
+
+locking:
+locking is done by means of three structures.
+1- ieee->lock (by means of spin_[un]lock_irq[save/restore]
+2- ieee->wx_sem
+3- ieee->scan_sem
+
+the lock 1 is what protect most of the critical sections in the ieee stack.
+the lock 2 is used to avoid that more than one of the SET wireless extension
+handlers (as well as start/stop protocol function) are running at the same time.
+the lock 1 is used when we need to modify or read the shared data in the wx handlers.
+In other words the lock 2 will prevent one SET action will run across another SET
+action (by make sleep the 2nd one) but allow GET actions, while the lock 1
+make atomic those little shared data access in both GET and SET operation.
+So get operation will be never be delayed really: they will never sleep..
+Furthermore in the top of some SET operations a flag is set before acquiring
+the lock. This is an help to make the previous running SET operation to
+finish faster if needed (just in case the second one will totally undo the
+first, so there is not need to complete the 1st really.. ).
+The background scanning mechaninsm is protected by the lock 1 except for the
+workqueue. this wq is here just to let the set_chan callback sleep (I thinked it
+might be appreciated by USB network card driver developer). In this case the lock 3
+take its turn.
+Thus the stop function needs both the locks.
+Funny in the syncro scan the lock 2 play its role (as both the syncro_scan
+function and the stop scan function are called with this semaphore held).
diff --git a/drivers/staging/rtl8192e/rtl819x_BA.h b/drivers/staging/rtl8192e/rtl819x_BA.h
new file mode 100644 (file)
index 0000000..bf8fdea
--- /dev/null
@@ -0,0 +1,78 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _BATYPE_H_
+#define _BATYPE_H_
+
+#define                TOTAL_TXBA_NUM  16
+#define        TOTAL_RXBA_NUM  16
+
+#define        BA_SETUP_TIMEOUT        200
+#define        BA_INACT_TIMEOUT        60000
+
+#define        BA_POLICY_DELAYED               0
+#define        BA_POLICY_IMMEDIATE     1
+
+#define        ADDBA_STATUS_SUCCESS                    0
+#define        ADDBA_STATUS_REFUSED            37
+#define        ADDBA_STATUS_INVALID_PARAM      38
+
+#define        DELBA_REASON_QSTA_LEAVING       36
+#define        DELBA_REASON_END_BA                     37
+#define        DELBA_REASON_UNKNOWN_BA 38
+#define        DELBA_REASON_TIMEOUT                    39
+typedef union _SEQUENCE_CONTROL{
+       u16 ShortData;
+       struct
+       {
+               u16     FragNum:4;
+               u16     SeqNum:12;
+       }field;
+}SEQUENCE_CONTROL, *PSEQUENCE_CONTROL;
+
+typedef union _BA_PARAM_SET {
+       u8 charData[2];
+       u16 shortData;
+       struct {
+               u16 AMSDU_Support:1;
+               u16 BAPolicy:1;
+               u16 TID:4;
+               u16 BufferSize:10;
+       } field;
+} BA_PARAM_SET, *PBA_PARAM_SET;
+
+typedef union _DELBA_PARAM_SET {
+       u8 charData[2];
+       u16 shortData;
+       struct {
+               u16 Reserved:11;
+               u16 Initiator:1;
+               u16 TID:4;
+       } field;
+} DELBA_PARAM_SET, *PDELBA_PARAM_SET;
+
+typedef struct _BA_RECORD {
+       struct timer_list               Timer;
+       u8                              bValid;
+       u8                              DialogToken;
+       BA_PARAM_SET            BaParamSet;
+       u16                             BaTimeoutValue;
+       SEQUENCE_CONTROL        BaStartSeqCtrl;
+} BA_RECORD, *PBA_RECORD;
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl819x_BAProc.c b/drivers/staging/rtl8192e/rtl819x_BAProc.c
new file mode 100644 (file)
index 0000000..08b9067
--- /dev/null
@@ -0,0 +1,618 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtllib.h"
+#include "rtl819x_BA.h"
+#include "rtl_core.h"
+#ifdef RTK_DMP_PLATFORM
+#include <linux/usb_setting.h>
+#endif
+
+void ActivateBAEntry(struct rtllib_device* ieee, PBA_RECORD pBA, u16 Time)
+{
+       pBA->bValid = true;
+       if (Time != 0)
+               mod_timer(&pBA->Timer, jiffies + MSECS(Time));
+}
+
+void DeActivateBAEntry( struct rtllib_device* ieee, PBA_RECORD pBA)
+{
+       pBA->bValid = false;
+       del_timer_sync(&pBA->Timer);
+}
+u8 TxTsDeleteBA( struct rtllib_device* ieee, PTX_TS_RECORD     pTxTs)
+{
+       PBA_RECORD              pAdmittedBa = &pTxTs->TxAdmittedBARecord;
+       PBA_RECORD              pPendingBa = &pTxTs->TxPendingBARecord;
+       u8                      bSendDELBA = false;
+
+       if (pPendingBa->bValid)
+       {
+               DeActivateBAEntry(ieee, pPendingBa);
+               bSendDELBA = true;
+       }
+
+       if (pAdmittedBa->bValid)
+       {
+               DeActivateBAEntry(ieee, pAdmittedBa);
+               bSendDELBA = true;
+       }
+
+       return bSendDELBA;
+}
+
+u8 RxTsDeleteBA( struct rtllib_device* ieee, PRX_TS_RECORD     pRxTs)
+{
+       PBA_RECORD              pBa = &pRxTs->RxAdmittedBARecord;
+       u8                      bSendDELBA = false;
+
+       if (pBa->bValid)
+       {
+               DeActivateBAEntry(ieee, pBa);
+               bSendDELBA = true;
+       }
+
+       return bSendDELBA;
+}
+
+void ResetBaEntry( PBA_RECORD pBA)
+{
+       pBA->bValid                     = false;
+       pBA->BaParamSet.shortData       = 0;
+       pBA->BaTimeoutValue             = 0;
+       pBA->DialogToken                = 0;
+       pBA->BaStartSeqCtrl.ShortData   = 0;
+}
+static struct sk_buff* rtllib_ADDBA(struct rtllib_device* ieee, u8* Dst, PBA_RECORD pBA, u16 StatusCode, u8 type)
+{
+       struct sk_buff *skb = NULL;
+        struct rtllib_hdr_3addr* BAReq = NULL;
+       u8* tag = NULL;
+       u16 tmp = 0;
+       u16 len = ieee->tx_headroom + 9;
+       RTLLIB_DEBUG(RTLLIB_DL_TRACE | RTLLIB_DL_BA, "========>%s(), frame(%d) sentd to:"MAC_FMT", ieee->dev:%p\n", __func__, type, MAC_ARG(Dst), ieee->dev);
+       if (pBA == NULL||ieee == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "pBA(%p) is NULL or ieee(%p) is NULL\n", pBA, ieee);
+               return NULL;
+       }
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+        skb = dev_alloc_skb(len + sizeof( struct rtllib_hdr_3addr) + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(len + sizeof( struct rtllib_hdr_3addr));
+#endif
+       if (skb == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't alloc skb for ADDBA_REQ\n");
+               return NULL;
+       }
+
+       memset(skb->data, 0, sizeof( struct rtllib_hdr_3addr));
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       BAReq = ( struct rtllib_hdr_3addr *) skb_put(skb,sizeof( struct rtllib_hdr_3addr));
+
+       memcpy(BAReq->addr1, Dst, ETH_ALEN);
+       memcpy(BAReq->addr2, ieee->dev->dev_addr, ETH_ALEN);
+
+       memcpy(BAReq->addr3, ieee->current_network.bssid, ETH_ALEN);
+       BAReq->frame_ctl = cpu_to_le16(RTLLIB_STYPE_MANAGE_ACT);
+
+       tag = (u8*)skb_put(skb, 9);
+       *tag ++= ACT_CAT_BA;
+       *tag ++= type;
+       *tag ++= pBA->DialogToken;
+
+       if (ACT_ADDBARSP == type)
+       {
+               RT_TRACE(COMP_DBG, "====>to send ADDBARSP\n");
+               tmp = cpu_to_le16(StatusCode);
+               memcpy(tag, (u8*)&tmp, 2);
+               tag += 2;
+       }
+       tmp = cpu_to_le16(pBA->BaParamSet.shortData);
+       memcpy(tag, (u8*)&tmp, 2);
+       tag += 2;
+       tmp = cpu_to_le16(pBA->BaTimeoutValue);
+       memcpy(tag, (u8*)&tmp, 2);
+       tag += 2;
+
+       if (ACT_ADDBAREQ == type)
+       {
+               memcpy(tag,(u8*)&(pBA->BaStartSeqCtrl), 2);
+               tag += 2;
+       }
+
+       RTLLIB_DEBUG_DATA(RTLLIB_DL_DATA|RTLLIB_DL_BA, skb->data, skb->len);
+       return skb;
+}
+
+static struct sk_buff* rtllib_DELBA(
+       struct rtllib_device* ieee,
+       u8*                      dst,
+       PBA_RECORD               pBA,
+       TR_SELECT                TxRxSelect,
+       u16                      ReasonCode
+       )
+{
+       DELBA_PARAM_SET DelbaParamSet;
+       struct sk_buff *skb = NULL;
+        struct rtllib_hdr_3addr* Delba = NULL;
+       u8* tag = NULL;
+       u16 tmp = 0;
+       u16 len = 6 + ieee->tx_headroom;
+
+       if (net_ratelimit())
+       RTLLIB_DEBUG(RTLLIB_DL_TRACE | RTLLIB_DL_BA, "========>%s(), ReasonCode(%d) sentd to:"MAC_FMT"\n", __func__, ReasonCode, MAC_ARG(dst));
+
+       memset(&DelbaParamSet, 0, 2);
+
+       DelbaParamSet.field.Initiator   = (TxRxSelect==TX_DIR)?1:0;
+       DelbaParamSet.field.TID = pBA->BaParamSet.field.TID;
+
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+       skb = dev_alloc_skb(len + sizeof( struct rtllib_hdr_3addr) + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(len + sizeof( struct rtllib_hdr_3addr));
+#endif
+       if (skb == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't alloc skb for ADDBA_REQ\n");
+               return NULL;
+       }
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+       skb_reserve(skb, ieee->tx_headroom);
+
+       Delba = ( struct rtllib_hdr_3addr *) skb_put(skb,sizeof( struct rtllib_hdr_3addr));
+
+       memcpy(Delba->addr1, dst, ETH_ALEN);
+       memcpy(Delba->addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(Delba->addr3, ieee->current_network.bssid, ETH_ALEN);
+       Delba->frame_ctl = cpu_to_le16(RTLLIB_STYPE_MANAGE_ACT);
+
+       tag = (u8*)skb_put(skb, 6);
+
+       *tag ++= ACT_CAT_BA;
+       *tag ++= ACT_DELBA;
+
+       tmp = cpu_to_le16(DelbaParamSet.shortData);
+       memcpy(tag, (u8*)&tmp, 2);
+       tag += 2;
+       tmp = cpu_to_le16(ReasonCode);
+       memcpy(tag, (u8*)&tmp, 2);
+       tag += 2;
+
+       RTLLIB_DEBUG_DATA(RTLLIB_DL_DATA|RTLLIB_DL_BA, skb->data, skb->len);
+       if (net_ratelimit())
+       RTLLIB_DEBUG(RTLLIB_DL_TRACE | RTLLIB_DL_BA, "<=====%s()\n", __func__);
+       return skb;
+}
+
+void rtllib_send_ADDBAReq(struct rtllib_device* ieee, u8*      dst, PBA_RECORD pBA)
+{
+       struct sk_buff *skb = NULL;
+       skb = rtllib_ADDBA(ieee, dst, pBA, 0, ACT_ADDBAREQ);
+
+       if (skb) {
+               RT_TRACE(COMP_DBG, "====>to send ADDBAREQ!!!!!\n");
+               softmac_mgmt_xmit(skb, ieee);
+       } else {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "alloc skb error in function %s()\n", __func__);
+       }
+       return;
+}
+
+void rtllib_send_ADDBARsp(struct rtllib_device* ieee, u8* dst, PBA_RECORD pBA, u16 StatusCode)
+{
+       struct sk_buff *skb = NULL;
+       skb = rtllib_ADDBA(ieee, dst, pBA, StatusCode, ACT_ADDBARSP);
+       if (skb)
+               softmac_mgmt_xmit(skb, ieee);
+       else
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "alloc skb error in function %s()\n", __func__);
+
+       return;
+
+}
+
+void rtllib_send_DELBA(struct rtllib_device* ieee, u8* dst, PBA_RECORD pBA, TR_SELECT TxRxSelect, u16 ReasonCode)
+{
+       struct sk_buff *skb = NULL;
+       skb = rtllib_DELBA(ieee, dst, pBA, TxRxSelect, ReasonCode);
+       if (skb)
+       {
+               softmac_mgmt_xmit(skb, ieee);
+       }
+       else
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "alloc skb error in function %s()\n", __func__);
+       }
+       return ;
+}
+
+int rtllib_rx_ADDBAReq( struct rtllib_device* ieee, struct sk_buff *skb)
+{
+        struct rtllib_hdr_3addr* req = NULL;
+       u16 rc = 0;
+       u8 * dst = NULL, *pDialogToken = NULL, *tag = NULL;
+       PBA_RECORD pBA = NULL;
+       PBA_PARAM_SET   pBaParamSet = NULL;
+       u16* pBaTimeoutVal = NULL;
+       PSEQUENCE_CONTROL pBaStartSeqCtrl = NULL;
+       PRX_TS_RECORD   pTS = NULL;
+
+       if (skb->len < sizeof( struct rtllib_hdr_3addr) + 9)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, " Invalid skb len in BAREQ(%d / %d)\n",(int)skb->len,       (int)(sizeof( struct rtllib_hdr_3addr) + 9));
+               return -1;
+       }
+
+       RTLLIB_DEBUG_DATA(RTLLIB_DL_DATA|RTLLIB_DL_BA, skb->data, skb->len);
+
+       req = ( struct rtllib_hdr_3addr*) skb->data;
+       tag = (u8*)req;
+       dst = (u8*)(&req->addr2[0]);
+       tag += sizeof( struct rtllib_hdr_3addr);
+       pDialogToken = tag + 2;
+       pBaParamSet = (PBA_PARAM_SET)(tag + 3);
+       pBaTimeoutVal = (u16*)(tag + 5);
+       pBaStartSeqCtrl = (PSEQUENCE_CONTROL)(req + 7);
+
+       RT_TRACE(COMP_DBG, "====>rx ADDBAREQ from :"MAC_FMT"\n", MAC_ARG(dst));
+       if (ieee->current_network.qos_data.active == 0  ||
+           (ieee->pHTInfo->bCurrentHTSupport == false) ||
+           (ieee->pHTInfo->IOTAction & HT_IOT_ACT_REJECT_ADDBA_REQ)) {
+               rc = ADDBA_STATUS_REFUSED;
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "Failed to reply on ADDBA_REQ as some capability is not ready(%d, %d)\n", ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport);
+               goto OnADDBAReq_Fail;
+       }
+       if (!GetTs(
+                       ieee,
+                       (PTS_COMMON_INFO*)(&pTS),
+                       dst,
+                       (u8)(pBaParamSet->field.TID),
+                       RX_DIR,
+                       true)   )
+       {
+               rc = ADDBA_STATUS_REFUSED;
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't get TS in %s()\n", __func__);
+               goto OnADDBAReq_Fail;
+       }
+       pBA = &pTS->RxAdmittedBARecord;
+
+       if (pBaParamSet->field.BAPolicy == BA_POLICY_DELAYED)
+       {
+               rc = ADDBA_STATUS_INVALID_PARAM;
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "BA Policy is not correct in %s()\n", __func__);
+               goto OnADDBAReq_Fail;
+       }
+
+
+       rtllib_FlushRxTsPendingPkts(ieee, pTS);
+
+       DeActivateBAEntry(ieee, pBA);
+       pBA->DialogToken = *pDialogToken;
+       pBA->BaParamSet = *pBaParamSet;
+       pBA->BaTimeoutValue = *pBaTimeoutVal;
+       pBA->BaStartSeqCtrl = *pBaStartSeqCtrl;
+
+       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev)||
+       (ieee->pHTInfo->IOTAction & HT_IOT_ACT_ALLOW_PEER_AGG_ONE_PKT))
+       pBA->BaParamSet.field.BufferSize = 1;
+       else
+       pBA->BaParamSet.field.BufferSize = 32;
+
+       ActivateBAEntry(ieee, pBA, 0);
+       rtllib_send_ADDBARsp(ieee, dst, pBA, ADDBA_STATUS_SUCCESS);
+
+       return 0;
+
+OnADDBAReq_Fail:
+       {
+               BA_RECORD       BA;
+               BA.BaParamSet = *pBaParamSet;
+               BA.BaTimeoutValue = *pBaTimeoutVal;
+               BA.DialogToken = *pDialogToken;
+               BA.BaParamSet.field.BAPolicy = BA_POLICY_IMMEDIATE;
+               rtllib_send_ADDBARsp(ieee, dst, &BA, rc);
+               return 0;
+       }
+
+}
+
+int rtllib_rx_ADDBARsp( struct rtllib_device* ieee, struct sk_buff *skb)
+{
+        struct rtllib_hdr_3addr* rsp = NULL;
+       PBA_RECORD              pPendingBA, pAdmittedBA;
+       PTX_TS_RECORD           pTS = NULL;
+       u8* dst = NULL, *pDialogToken = NULL, *tag = NULL;
+       u16* pStatusCode = NULL, *pBaTimeoutVal = NULL;
+       PBA_PARAM_SET           pBaParamSet = NULL;
+       u16                     ReasonCode;
+
+       if (skb->len < sizeof( struct rtllib_hdr_3addr) + 9)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, " Invalid skb len in BARSP(%d / %d)\n", (int)skb->len,      (int)(sizeof( struct rtllib_hdr_3addr) + 9));
+               return -1;
+       }
+       rsp = ( struct rtllib_hdr_3addr*)skb->data;
+       tag = (u8*)rsp;
+       dst = (u8*)(&rsp->addr2[0]);
+       tag += sizeof( struct rtllib_hdr_3addr);
+       pDialogToken = tag + 2;
+       pStatusCode = (u16*)(tag + 3);
+       pBaParamSet = (PBA_PARAM_SET)(tag + 5);
+       pBaTimeoutVal = (u16*)(tag + 7);
+
+       RT_TRACE(COMP_DBG, "====>rx ADDBARSP from :"MAC_FMT"\n", MAC_ARG(dst));
+       if (
+               ieee->current_network.qos_data.active == 0  ||
+               ieee->pHTInfo->bCurrentHTSupport == false ||
+               ieee->pHTInfo->bCurrentAMPDUEnable == false )
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "reject to ADDBA_RSP as some capability is not ready(%d, %d, %d)\n",ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport, ieee->pHTInfo->bCurrentAMPDUEnable);
+               ReasonCode = DELBA_REASON_UNKNOWN_BA;
+               goto OnADDBARsp_Reject;
+       }
+
+
+       if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTS), dst,
+                  (u8)(pBaParamSet->field.TID), TX_DIR, false)) {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't get TS in %s()\n", __func__);
+               ReasonCode = DELBA_REASON_UNKNOWN_BA;
+               goto OnADDBARsp_Reject;
+       }
+
+       pTS->bAddBaReqInProgress = false;
+       pPendingBA = &pTS->TxPendingBARecord;
+       pAdmittedBA = &pTS->TxAdmittedBARecord;
+
+
+       if ((pAdmittedBA->bValid==true))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_BA, "OnADDBARsp(): Recv ADDBA Rsp. Drop because already admit it! \n");
+               return -1;
+       }
+       else if ((pPendingBA->bValid == false) ||(*pDialogToken != pPendingBA->DialogToken))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR,  "OnADDBARsp(): Recv ADDBA Rsp. BA invalid, DELBA! \n");
+               ReasonCode = DELBA_REASON_UNKNOWN_BA;
+               goto OnADDBARsp_Reject;
+       }
+       else
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_BA, "OnADDBARsp(): Recv ADDBA Rsp. BA is admitted! Status code:%X\n", *pStatusCode);
+               DeActivateBAEntry(ieee, pPendingBA);
+       }
+
+
+       if (*pStatusCode == ADDBA_STATUS_SUCCESS)
+       {
+               if (pBaParamSet->field.BAPolicy == BA_POLICY_DELAYED)
+               {
+                       pTS->bAddBaReqDelayed = true;
+                       DeActivateBAEntry(ieee, pAdmittedBA);
+                       ReasonCode = DELBA_REASON_END_BA;
+                       goto OnADDBARsp_Reject;
+               }
+
+
+               pAdmittedBA->DialogToken = *pDialogToken;
+               pAdmittedBA->BaTimeoutValue = *pBaTimeoutVal;
+               pAdmittedBA->BaStartSeqCtrl = pPendingBA->BaStartSeqCtrl;
+               pAdmittedBA->BaParamSet = *pBaParamSet;
+               DeActivateBAEntry(ieee, pAdmittedBA);
+               ActivateBAEntry(ieee, pAdmittedBA, *pBaTimeoutVal);
+       } else {
+               pTS->bAddBaReqDelayed = true;
+               pTS->bDisable_AddBa = true;
+               ReasonCode = DELBA_REASON_END_BA;
+               goto OnADDBARsp_Reject;
+       }
+
+       return 0;
+
+OnADDBARsp_Reject:
+       {
+               BA_RECORD       BA;
+               BA.BaParamSet = *pBaParamSet;
+               rtllib_send_DELBA(ieee, dst, &BA, TX_DIR, ReasonCode);
+               return 0;
+       }
+
+}
+
+int rtllib_rx_DELBA(struct rtllib_device* ieee,struct sk_buff *skb)
+{
+        struct rtllib_hdr_3addr* delba = NULL;
+       PDELBA_PARAM_SET        pDelBaParamSet = NULL;
+       u16*                    pReasonCode = NULL;
+       u8*                     dst = NULL;
+
+       if (skb->len < sizeof( struct rtllib_hdr_3addr) + 6)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, " Invalid skb len in DELBA(%d / %d)\n", (int)skb->len,      (int)(sizeof( struct rtllib_hdr_3addr) + 6));
+               return -1;
+       }
+
+       if (
+               ieee->current_network.qos_data.active == 0  ||
+               ieee->pHTInfo->bCurrentHTSupport == false )
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "received DELBA while QOS or HT is not supported(%d, %d)\n",ieee->current_network.qos_data.active, ieee->pHTInfo->bCurrentHTSupport);
+               return -1;
+       }
+
+       RTLLIB_DEBUG_DATA(RTLLIB_DL_DATA|RTLLIB_DL_BA, skb->data, skb->len);
+       delba = ( struct rtllib_hdr_3addr*)skb->data;
+       dst = (u8*)(&delba->addr2[0]);
+       delba += sizeof( struct rtllib_hdr_3addr);
+       pDelBaParamSet = (PDELBA_PARAM_SET)(delba+2);
+       pReasonCode = (u16*)(delba+4);
+
+       if (pDelBaParamSet->field.Initiator == 1)
+       {
+               PRX_TS_RECORD   pRxTs;
+
+               if ( !GetTs(
+                               ieee,
+                               (PTS_COMMON_INFO*)&pRxTs,
+                               dst,
+                               (u8)pDelBaParamSet->field.TID,
+                               RX_DIR,
+                               false)  )
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR,  "can't get TS for RXTS in %s().dst:"MAC_FMT" TID:%d\n", __func__, MAC_ARG(dst), (u8)pDelBaParamSet->field.TID);
+                       return -1;
+               }
+
+               RxTsDeleteBA(ieee, pRxTs);
+       }
+       else
+       {
+               PTX_TS_RECORD   pTxTs;
+
+               if (!GetTs(
+                       ieee,
+                       (PTS_COMMON_INFO*)&pTxTs,
+                       dst,
+                       (u8)pDelBaParamSet->field.TID,
+                       TX_DIR,
+                       false)  )
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR,  "can't get TS for TXTS in %s()\n", __func__);
+                       return -1;
+               }
+
+               pTxTs->bUsingBa = false;
+               pTxTs->bAddBaReqInProgress = false;
+               pTxTs->bAddBaReqDelayed = false;
+               del_timer_sync(&pTxTs->TsAddBaTimer);
+               TxTsDeleteBA(ieee, pTxTs);
+       }
+       return 0;
+}
+
+void
+TsInitAddBA(
+       struct rtllib_device* ieee,
+       PTX_TS_RECORD   pTS,
+       u8              Policy,
+       u8              bOverwritePending
+       )
+{
+       PBA_RECORD                      pBA = &pTS->TxPendingBARecord;
+
+       if (pBA->bValid==true && bOverwritePending==false)
+               return;
+
+       DeActivateBAEntry(ieee, pBA);
+
+       pBA->DialogToken++;
+       pBA->BaParamSet.field.AMSDU_Support = 0;
+       pBA->BaParamSet.field.BAPolicy = Policy;
+       pBA->BaParamSet.field.TID = pTS->TsCommonInfo.TSpec.f.TSInfo.field.ucTSID;
+       pBA->BaParamSet.field.BufferSize = 32;
+       pBA->BaTimeoutValue = 0;
+       pBA->BaStartSeqCtrl.field.SeqNum = (pTS->TxCurSeq + 3) % 4096;
+
+       ActivateBAEntry(ieee, pBA, BA_SETUP_TIMEOUT);
+
+       rtllib_send_ADDBAReq(ieee, pTS->TsCommonInfo.Addr, pBA);
+}
+
+void
+TsInitDelBA( struct rtllib_device* ieee, PTS_COMMON_INFO pTsCommonInfo, TR_SELECT TxRxSelect)
+{
+
+       if (TxRxSelect == TX_DIR)
+       {
+               PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)pTsCommonInfo;
+
+               if (TxTsDeleteBA(ieee, pTxTs))
+                       rtllib_send_DELBA(
+                               ieee,
+                               pTsCommonInfo->Addr,
+                               (pTxTs->TxAdmittedBARecord.bValid)?(&pTxTs->TxAdmittedBARecord):(&pTxTs->TxPendingBARecord),
+                               TxRxSelect,
+                               DELBA_REASON_END_BA);
+       }
+       else if (TxRxSelect == RX_DIR)
+       {
+               PRX_TS_RECORD   pRxTs = (PRX_TS_RECORD)pTsCommonInfo;
+               if (RxTsDeleteBA(ieee, pRxTs))
+                       rtllib_send_DELBA(
+                               ieee,
+                               pTsCommonInfo->Addr,
+                               &pRxTs->RxAdmittedBARecord,
+                               TxRxSelect,
+                               DELBA_REASON_END_BA     );
+       }
+}
+void BaSetupTimeOut(unsigned long data)
+{
+       PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)data;
+
+       pTxTs->bAddBaReqInProgress = false;
+       pTxTs->bAddBaReqDelayed = true;
+       pTxTs->TxPendingBARecord.bValid = false;
+}
+
+void TxBaInactTimeout(unsigned long data)
+{
+       PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)data;
+       struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device, TxTsRecord[pTxTs->num]);
+       TxTsDeleteBA(ieee, pTxTs);
+       rtllib_send_DELBA(
+               ieee,
+               pTxTs->TsCommonInfo.Addr,
+               &pTxTs->TxAdmittedBARecord,
+               TX_DIR,
+               DELBA_REASON_TIMEOUT);
+}
+
+void RxBaInactTimeout(unsigned long data)
+{
+       PRX_TS_RECORD   pRxTs = (PRX_TS_RECORD)data;
+       struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device, RxTsRecord[pRxTs->num]);
+
+       RxTsDeleteBA(ieee, pRxTs);
+       rtllib_send_DELBA(
+               ieee,
+               pRxTs->TsCommonInfo.Addr,
+               &pRxTs->RxAdmittedBARecord,
+               RX_DIR,
+               DELBA_REASON_TIMEOUT);
+       return ;
+}
diff --git a/drivers/staging/rtl8192e/rtl819x_HT.h b/drivers/staging/rtl8192e/rtl819x_HT.h
new file mode 100644 (file)
index 0000000..15878ad
--- /dev/null
@@ -0,0 +1,493 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _RTL819XU_HTTYPE_H_
+#define _RTL819XU_HTTYPE_H_
+
+
+#define HT_OPMODE_NO_PROTECT           0
+#define HT_OPMODE_OPTIONAL             1
+#define HT_OPMODE_40MHZ_PROTECT        2
+#define HT_OPMODE_MIXED                        3
+
+#define MIMO_PS_STATIC                         0
+#define MIMO_PS_DYNAMIC                        1
+#define MIMO_PS_NOLIMIT                        3
+
+
+
+#define sHTCLng        4
+
+
+#define HT_SUPPORTED_MCS_1SS_BITMAP                                    0x000000ff
+#define HT_SUPPORTED_MCS_2SS_BITMAP                                    0x0000ff00
+#define HT_SUPPORTED_MCS_1SS_2SS_BITMAP                        HT_MCS_1SS_BITMAP|HT_MCS_1SS_2SS_BITMAP
+
+
+typedef enum _HT_MCS_RATE{
+       HT_MCS0   = 0x00000001,
+       HT_MCS1   = 0x00000002,
+       HT_MCS2   = 0x00000004,
+       HT_MCS3   = 0x00000008,
+       HT_MCS4   = 0x00000010,
+       HT_MCS5   = 0x00000020,
+       HT_MCS6   = 0x00000040,
+       HT_MCS7   = 0x00000080,
+       HT_MCS8   = 0x00000100,
+       HT_MCS9   = 0x00000200,
+       HT_MCS10 = 0x00000400,
+       HT_MCS11 = 0x00000800,
+       HT_MCS12 = 0x00001000,
+       HT_MCS13 = 0x00002000,
+       HT_MCS14 = 0x00004000,
+       HT_MCS15 = 0x00008000,
+}HT_MCS_RATE,*PHT_MCS_RATE;
+
+typedef enum _HT_CHANNEL_WIDTH{
+       HT_CHANNEL_WIDTH_20 = 0,
+       HT_CHANNEL_WIDTH_20_40 = 1,
+}HT_CHANNEL_WIDTH, *PHT_CHANNEL_WIDTH;
+
+typedef enum _HT_EXTCHNL_OFFSET{
+       HT_EXTCHNL_OFFSET_NO_EXT = 0,
+       HT_EXTCHNL_OFFSET_UPPER = 1,
+       HT_EXTCHNL_OFFSET_NO_DEF = 2,
+       HT_EXTCHNL_OFFSET_LOWER = 3,
+}HT_EXTCHNL_OFFSET, *PHT_EXTCHNL_OFFSET;
+
+typedef enum _CHNLOP{
+       CHNLOP_NONE = 0,
+       CHNLOP_SCAN = 1,
+       CHNLOP_SWBW = 2,
+       CHNLOP_SWCHNL = 3,
+} CHNLOP, *PCHNLOP;
+
+#define CHHLOP_IN_PROGRESS(_pHTInfo)   \
+               ((_pHTInfo)->ChnlOp > CHNLOP_NONE) ? true : false
+
+/*
+typedef        union _HT_CAPABILITY{
+       u16     ShortData;
+       u8      CharData[2];
+       struct
+       {
+               u16     AdvCoding:1;
+               u16     ChlWidth:1;
+               u16     MimoPwrSave:2;
+               u16     GreenField:1;
+               u16     ShortGI20Mhz:1;
+               u16     ShortGI40Mhz:1;
+               u16     STBC:1;
+               u16     BeamForm:1;
+               u16     DelayBA:1;
+               u16     MaxAMSDUSize:1;
+               u16     DssCCk:1;
+               u16     PSMP:1;
+               u16     Rsvd:3;
+       }Field;
+}HT_CAPABILITY, *PHT_CAPABILITY;
+
+typedef        union _HT_CAPABILITY_MACPARA{
+       u8      ShortData;
+       u8      CharData[1];
+       struct
+       {
+               u8      MaxRxAMPDU:2;
+               u8      MPDUDensity:2;
+               u8      Rsvd:4;
+       }Field;
+}HT_CAPABILITY_MACPARA, *PHT_CAPABILITY_MACPARA;
+*/
+
+typedef enum _HT_ACTION{
+       ACT_RECOMMAND_WIDTH             = 0,
+       ACT_MIMO_PWR_SAVE               = 1,
+       ACT_PSMP                                        = 2,
+       ACT_SET_PCO_PHASE               = 3,
+       ACT_MIMO_CHL_MEASURE    = 4,
+       ACT_RECIPROCITY_CORRECT = 5,
+       ACT_MIMO_CSI_MATRICS            = 6,
+       ACT_MIMO_NOCOMPR_STEER  = 7,
+       ACT_MIMO_COMPR_STEER            = 8,
+       ACT_ANTENNA_SELECT              = 9,
+} HT_ACTION, *PHT_ACTION;
+
+
+typedef enum _HT_Bandwidth_40MHZ_Sub_Carrier{
+       SC_MODE_DUPLICATE = 0,
+       SC_MODE_LOWER = 1,
+       SC_MODE_UPPER = 2,
+       SC_MODE_FULL40MHZ = 3,
+}HT_BW40_SC_E;
+
+typedef        struct _HT_CAPABILITY_ELE{
+
+       u8      AdvCoding:1;
+       u8      ChlWidth:1;
+       u8      MimoPwrSave:2;
+       u8      GreenField:1;
+       u8      ShortGI20Mhz:1;
+       u8      ShortGI40Mhz:1;
+       u8      TxSTBC:1;
+       u8      RxSTBC:2;
+       u8      DelayBA:1;
+       u8      MaxAMSDUSize:1;
+       u8      DssCCk:1;
+       u8      PSMP:1;
+       u8      Rsvd1:1;
+       u8      LSigTxopProtect:1;
+
+       u8      MaxRxAMPDUFactor:2;
+       u8      MPDUDensity:3;
+       u8      Rsvd2:3;
+
+       u8      MCS[16];
+
+
+       u16     ExtHTCapInfo;
+
+       u8      TxBFCap[4];
+
+       u8      ASCap;
+
+} __attribute__ ((packed)) HT_CAPABILITY_ELE, *PHT_CAPABILITY_ELE;
+
+
+typedef struct _HT_INFORMATION_ELE{
+       u8      ControlChl;
+
+       u8      ExtChlOffset:2;
+       u8      RecommemdedTxWidth:1;
+       u8      RIFS:1;
+       u8      PSMPAccessOnly:1;
+       u8      SrvIntGranularity:3;
+
+       u8      OptMode:2;
+       u8      NonGFDevPresent:1;
+       u8      Revd1:5;
+       u8      Revd2:8;
+
+       u8      Rsvd3:6;
+       u8      DualBeacon:1;
+       u8      DualCTSProtect:1;
+
+       u8      SecondaryBeacon:1;
+       u8      LSigTxopProtectFull:1;
+       u8      PcoActive:1;
+       u8      PcoPhase:1;
+       u8      Rsvd4:4;
+
+       u8      BasicMSC[16];
+} __attribute__ ((packed)) HT_INFORMATION_ELE, *PHT_INFORMATION_ELE;
+
+typedef struct _MIMOPS_CTRL{
+       u8      MimoPsEnable:1;
+       u8      MimoPsMode:1;
+       u8      Reserved:6;
+} MIMOPS_CTRL, *PMIMOPS_CTRL;
+
+typedef enum _HT_SPEC_VER{
+       HT_SPEC_VER_IEEE = 0,
+       HT_SPEC_VER_EWC = 1,
+}HT_SPEC_VER, *PHT_SPEC_VER;
+
+typedef enum _HT_AGGRE_MODE_E{
+       HT_AGG_AUTO = 0,
+       HT_AGG_FORCE_ENABLE = 1,
+       HT_AGG_FORCE_DISABLE = 2,
+}HT_AGGRE_MODE_E, *PHT_AGGRE_MODE_E;
+
+
+typedef struct _RT_HIGH_THROUGHPUT{
+       u8                              bEnableHT;
+       u8                              bCurrentHTSupport;
+
+       u8                              bRegBW40MHz;
+       u8                              bCurBW40MHz;
+
+       u8                              bRegShortGI40MHz;
+       u8                              bCurShortGI40MHz;
+
+       u8                              bRegShortGI20MHz;
+       u8                              bCurShortGI20MHz;
+
+       u8                              bRegSuppCCK;
+       u8                              bCurSuppCCK;
+
+       HT_SPEC_VER                     ePeerHTSpecVer;
+
+
+       HT_CAPABILITY_ELE       SelfHTCap;
+       HT_INFORMATION_ELE      SelfHTInfo;
+
+       u8                              PeerHTCapBuf[32];
+       u8                              PeerHTInfoBuf[32];
+
+
+       u8                              bAMSDU_Support;
+       u16                             nAMSDU_MaxSize;
+       u8                              bCurrent_AMSDU_Support;
+       u16                             nCurrent_AMSDU_MaxSize;
+
+       u8                              bAMPDUEnable;
+       u8                              bCurrentAMPDUEnable;
+       u8                              AMPDU_Factor;
+       u8                              CurrentAMPDUFactor;
+       u8                              MPDU_Density;
+       u8                              CurrentMPDUDensity;
+
+       HT_AGGRE_MODE_E ForcedAMPDUMode;
+       u8                              ForcedAMPDUFactor;
+       u8                              ForcedMPDUDensity;
+
+       HT_AGGRE_MODE_E ForcedAMSDUMode;
+       u16                             ForcedAMSDUMaxSize;
+
+       u8                              bForcedShortGI;
+
+       u8                              CurrentOpMode;
+
+       u8                              SelfMimoPs;
+       u8                              PeerMimoPs;
+
+       HT_EXTCHNL_OFFSET       CurSTAExtChnlOffset;
+       u8                              bCurTxBW40MHz;
+       u8                              PeerBandwidth;
+
+       u8                              bSwBwInProgress;
+       CHNLOP                          ChnlOp;
+       u8                              SwBwStep;
+
+       u8                              bRegRT2RTAggregation;
+       u8                              RT2RT_HT_Mode;
+       u8                              bCurrentRT2RTAggregation;
+       u8                              bCurrentRT2RTLongSlotTime;
+       u8                              szRT2RTAggBuffer[10];
+
+       u8                              bRegRxReorderEnable;
+       u8                              bCurRxReorderEnable;
+       u8                              RxReorderWinSize;
+       u8                              RxReorderPendingTime;
+       u16                             RxReorderDropCounter;
+
+#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
+       u8                              UsbTxAggrNum;
+#endif
+#ifdef USB_RX_AGGREGATION_SUPPORT
+       u8                              UsbRxFwAggrEn;
+       u8                              UsbRxFwAggrPageNum;
+       u8                              UsbRxFwAggrPacketNum;
+       u8                              UsbRxFwAggrTimeout;
+       u8                              UsbRxPageSize;
+#endif
+
+       u8                              bIsPeerBcm;
+
+       u8                              IOTPeer;
+       u32                             IOTAction;
+       u8                              IOTRaFunc;
+
+       u8      bWAIotBroadcom;
+       u8      WAIotTH;
+
+#ifdef RTL8192CE
+       u8                              bRDGEnable;
+#endif
+
+       u8                              bAcceptAddbaReq;
+} __attribute__ ((packed)) RT_HIGH_THROUGHPUT, *PRT_HIGH_THROUGHPUT;
+
+
+
+typedef struct _RT_HTINFO_STA_ENTRY{
+       u8                      bEnableHT;
+
+       u8                      bSupportCck;
+
+       u16                     AMSDU_MaxSize;
+
+       u8                      AMPDU_Factor;
+       u8                      MPDU_Density;
+
+       u8                      HTHighestOperaRate;
+
+       u8                      bBw40MHz;
+
+       u8                      bCurTxBW40MHz;
+
+       u8                      bCurShortGI20MHz;
+
+       u8                      bCurShortGI40MHz;
+
+       u8                      MimoPs;
+
+       u8                      McsRateSet[16];
+
+       u8                      bCurRxReorderEnable;
+
+       u16                     nAMSDU_MaxSize;
+
+}RT_HTINFO_STA_ENTRY, *PRT_HTINFO_STA_ENTRY;
+
+
+
+
+
+
+typedef struct _BSS_HT{
+
+       u8                              bdSupportHT;
+
+       u8                                      bdHTCapBuf[32];
+       u16                                     bdHTCapLen;
+       u8                                      bdHTInfoBuf[32];
+       u16                                     bdHTInfoLen;
+
+       HT_SPEC_VER                             bdHTSpecVer;
+       HT_CHANNEL_WIDTH                        bdBandWidth;
+
+       u8                                      bdRT2RTAggregation;
+       u8                                      bdRT2RTLongSlotTime;
+       u8                                      RT2RT_HT_Mode;
+       u8                                      bdHT1R;
+} __attribute__ ((packed)) BSS_HT, *PBSS_HT;
+
+typedef struct _MIMO_RSSI{
+       u32     EnableAntenna;
+       u32     AntennaA;
+       u32     AntennaB;
+       u32     AntennaC;
+       u32     AntennaD;
+       u32     Average;
+}MIMO_RSSI, *PMIMO_RSSI;
+
+typedef struct _MIMO_EVM{
+       u32     EVM1;
+       u32    EVM2;
+}MIMO_EVM, *PMIMO_EVM;
+
+typedef struct _FALSE_ALARM_STATISTICS{
+       u32     Cnt_Parity_Fail;
+       u32     Cnt_Rate_Illegal;
+       u32     Cnt_Crc8_fail;
+       u32     Cnt_Mcs_fail;
+       u32     Cnt_Ofdm_fail;
+       u32     Cnt_Cck_fail;
+       u32     Cnt_all;
+}FALSE_ALARM_STATISTICS, *PFALSE_ALARM_STATISTICS;
+
+
+extern u8 MCS_FILTER_ALL[16];
+extern u8 MCS_FILTER_1SS[16];
+
+#define PICK_RATE(_nLegacyRate, _nMcsRate)     \
+               (_nMcsRate==0)?(_nLegacyRate&0x7f):(_nMcsRate)
+#define        LEGACY_WIRELESS_MODE    IEEE_MODE_MASK
+
+#define CURRENT_RATE(WirelessMode, LegacyRate, HTRate) \
+                                       ((WirelessMode & (LEGACY_WIRELESS_MODE))!=0)?\
+                                               (LegacyRate):\
+                                               (PICK_RATE(LegacyRate, HTRate))
+
+
+
+#define        RATE_ADPT_1SS_MASK              0xFF
+#define        RATE_ADPT_2SS_MASK              0xF0
+#define        RATE_ADPT_MCS32_MASK            0x01
+
+#define                IS_11N_MCS_RATE(rate)           (rate&0x80)
+
+typedef enum _HT_AGGRE_SIZE{
+       HT_AGG_SIZE_8K = 0,
+       HT_AGG_SIZE_16K = 1,
+       HT_AGG_SIZE_32K = 2,
+       HT_AGG_SIZE_64K = 3,
+}HT_AGGRE_SIZE_E, *PHT_AGGRE_SIZE_E;
+
+typedef enum _HT_IOT_PEER
+{
+       HT_IOT_PEER_UNKNOWN = 0,
+       HT_IOT_PEER_REALTEK = 1,
+       HT_IOT_PEER_REALTEK_92SE = 2,
+       HT_IOT_PEER_BROADCOM = 3,
+       HT_IOT_PEER_RALINK = 4,
+       HT_IOT_PEER_ATHEROS = 5,
+       HT_IOT_PEER_CISCO= 6,
+       HT_IOT_PEER_MARVELL=7,
+       HT_IOT_PEER_92U_SOFTAP = 8,
+       HT_IOT_PEER_SELF_SOFTAP = 9,
+       HT_IOT_PEER_AIRGO = 10,
+       HT_IOT_PEER_MAX = 11,
+}HT_IOT_PEER_E, *PHTIOT_PEER_E;
+
+typedef enum _HT_IOT_PEER_SUBTYPE
+{
+       HT_IOT_PEER_ATHEROS_DIR635 = 0,
+}HT_IOT_PEER_SUBTYPE_E, *PHTIOT_PEER_SUBTYPE_E;
+
+typedef enum _HT_IOT_ACTION{
+       HT_IOT_ACT_TX_USE_AMSDU_4K = 0x00000001,
+       HT_IOT_ACT_TX_USE_AMSDU_8K = 0x00000002,
+       HT_IOT_ACT_DISABLE_MCS14 = 0x00000004,
+       HT_IOT_ACT_DISABLE_MCS15 = 0x00000008,
+       HT_IOT_ACT_DISABLE_ALL_2SS = 0x00000010,
+       HT_IOT_ACT_DISABLE_EDCA_TURBO = 0x00000020,
+       HT_IOT_ACT_MGNT_USE_CCK_6M = 0x00000040,
+       HT_IOT_ACT_CDD_FSYNC = 0x00000080,
+       HT_IOT_ACT_PURE_N_MODE = 0x00000100,
+       HT_IOT_ACT_FORCED_CTS2SELF = 0x00000200,
+       HT_IOT_ACT_FORCED_RTS = 0x00000400,
+       HT_IOT_ACT_AMSDU_ENABLE = 0x00000800,
+       HT_IOT_ACT_REJECT_ADDBA_REQ = 0x00001000,
+       HT_IOT_ACT_ALLOW_PEER_AGG_ONE_PKT = 0x00002000,
+       HT_IOT_ACT_EDCA_BIAS_ON_RX = 0x00004000,
+
+       HT_IOT_ACT_HYBRID_AGGREGATION = 0x00010000,
+       HT_IOT_ACT_DISABLE_SHORT_GI = 0x00020000,
+       HT_IOT_ACT_DISABLE_HIGH_POWER = 0x00040000,
+       HT_IOT_ACT_DISABLE_TX_40_MHZ = 0x00080000,
+       HT_IOT_ACT_TX_NO_AGGREGATION = 0x00100000,
+       HT_IOT_ACT_DISABLE_TX_2SS = 0x00200000,
+
+        HT_IOT_ACT_MID_HIGHPOWER = 0x00400000,
+        HT_IOT_ACT_NULL_DATA_POWER_SAVING = 0x00800000,
+
+        HT_IOT_ACT_DISABLE_CCK_RATE = 0x01000000,
+       HT_IOT_ACT_FORCED_ENABLE_BE_TXOP = 0x02000000,
+       HT_IOT_ACT_WA_IOT_Broadcom = 0x04000000,
+
+       HT_IOT_ACT_DISABLE_RX_40MHZ_SHORT_GI = 0x08000000,
+
+}HT_IOT_ACTION_E, *PHT_IOT_ACTION_E;
+
+typedef enum _HT_IOT_RAFUNC{
+       HT_IOT_RAFUNC_DISABLE_ALL = 0x00,
+       HT_IOT_RAFUNC_PEER_1R = 0x01,
+       HT_IOT_RAFUNC_TX_AMSDU = 0x02,
+}HT_IOT_RAFUNC, *PHT_IOT_RAFUNC;
+
+typedef enum _RT_HT_CAP{
+       RT_HT_CAP_USE_TURBO_AGGR = 0x01,
+       RT_HT_CAP_USE_LONG_PREAMBLE = 0x02,
+       RT_HT_CAP_USE_AMPDU = 0x04,
+       RT_HT_CAP_USE_WOW = 0x8,
+       RT_HT_CAP_USE_SOFTAP = 0x10,
+       RT_HT_CAP_USE_92SE = 0x20,
+}RT_HT_CAPBILITY, *PRT_HT_CAPBILITY;
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl819x_HTProc.c b/drivers/staging/rtl8192e/rtl819x_HTProc.c
new file mode 100644 (file)
index 0000000..eaf7367
--- /dev/null
@@ -0,0 +1,1531 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtllib.h"
+#include "rtl819x_HT.h"
+u8 MCS_FILTER_ALL[16] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+u8 MCS_FILTER_1SS[16] = {0xff, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+
+u16 MCS_DATA_RATE[2][2][77] =
+       {       {       {13, 26, 39, 52, 78, 104, 117, 130, 26, 52, 78 ,104, 156, 208, 234, 260,
+                       39, 78, 117, 234, 312, 351, 390, 52, 104, 156, 208, 312, 416, 468, 520,
+                       0, 78, 104, 130, 117, 156, 195, 104, 130, 130, 156, 182, 182, 208, 156, 195,
+                       195, 234, 273, 273, 312, 130, 156, 181, 156, 181, 208, 234, 208, 234, 260, 260,
+                       286, 195, 234, 273, 234, 273, 312, 351, 312, 351, 390, 390, 429},
+                       {14, 29, 43, 58, 87, 116, 130, 144, 29, 58, 87, 116, 173, 231, 260, 289,
+                       43, 87, 130, 173, 260, 347, 390, 433, 58, 116, 173, 231, 347, 462, 520, 578,
+                       0, 87, 116, 144, 130, 173, 217, 116, 144, 144, 173, 202, 202, 231, 173, 217,
+                       217, 260, 303, 303, 347, 144, 173, 202, 173, 202, 231, 260, 231, 260, 289, 289,
+                       318, 217, 260, 303, 260, 303, 347, 390, 347, 390, 433, 433, 477}        },
+               {       {27, 54, 81, 108, 162, 216, 243, 270, 54, 108, 162, 216, 324, 432, 486, 540,
+                       81, 162, 243, 324, 486, 648, 729, 810, 108, 216, 324, 432, 648, 864, 972, 1080,
+                       12, 162, 216, 270, 243, 324, 405, 216, 270, 270, 324, 378, 378, 432, 324, 405,
+                       405, 486, 567, 567, 648, 270, 324, 378, 324, 378, 432, 486, 432, 486, 540, 540,
+                       594, 405, 486, 567, 486, 567, 648, 729, 648, 729, 810, 810, 891},
+                       {30, 60, 90, 120, 180, 240, 270, 300, 60, 120, 180, 240, 360, 480, 540, 600,
+                       90, 180, 270, 360, 540, 720, 810, 900, 120, 240, 360, 480, 720, 960, 1080, 1200,
+                       13, 180, 240, 300, 270, 360, 450, 240, 300, 300, 360, 420, 420, 480, 360, 450,
+                       450, 540, 630, 630, 720, 300, 360, 420, 360, 420, 480, 540, 480, 540, 600, 600,
+                       660, 450, 540, 630, 540, 630, 720, 810, 720, 810, 900, 900, 990}        }
+       };
+
+static u8 UNKNOWN_BORADCOM[3] = {0x00, 0x14, 0xbf};
+static u8 LINKSYSWRT330_LINKSYSWRT300_BROADCOM[3] = {0x00, 0x1a, 0x70};
+static u8 LINKSYSWRT350_LINKSYSWRT150_BROADCOM[3] = {0x00, 0x1d, 0x7e};
+static u8 BELKINF5D8233V1_RALINK[3] = {0x00, 0x17, 0x3f};
+static u8 BELKINF5D82334V3_RALINK[3] = {0x00, 0x1c, 0xdf};
+static u8 PCI_RALINK[3] = {0x00, 0x90, 0xcc};
+static u8 EDIMAX_RALINK[3] = {0x00, 0x0e, 0x2e};
+static u8 AIRLINK_RALINK[3] = {0x00, 0x18, 0x02};
+static u8 DLINK_ATHEROS_1[3] = {0x00, 0x1c, 0xf0};
+static u8 DLINK_ATHEROS_2[3] = {0x00, 0x21, 0x91};
+static u8 CISCO_BROADCOM[3] = {0x00, 0x17, 0x94};
+#if defined(RTL8192SU)
+static u8 NETGEAR_BROADCOM[3] = {0x00, 0x1f, 0x33};
+#endif
+static u8 LINKSYS_MARVELL_4400N[3] = {0x00, 0x14, 0xa4};
+void HTUpdateDefaultSetting(struct rtllib_device* ieee)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+
+#ifdef RTL8192CE
+       pHTInfo->bRDGEnable = 0;
+#endif
+
+       pHTInfo->bAcceptAddbaReq = 1;
+
+       pHTInfo->bRegShortGI20MHz= 1;
+       pHTInfo->bRegShortGI40MHz= 1;
+
+       pHTInfo->bRegBW40MHz = 1;
+
+       if (pHTInfo->bRegBW40MHz)
+               pHTInfo->bRegSuppCCK = 1;
+       else
+               pHTInfo->bRegSuppCCK = true;
+
+       pHTInfo->nAMSDU_MaxSize = 7935UL;
+       pHTInfo->bAMSDU_Support = 0;
+
+       pHTInfo->bAMPDUEnable = 1;
+       pHTInfo->AMPDU_Factor = 2;
+       pHTInfo->MPDU_Density = 0;
+
+       pHTInfo->SelfMimoPs = 3;
+       if (pHTInfo->SelfMimoPs == 2)
+               pHTInfo->SelfMimoPs = 3;
+       ieee->bTxDisableRateFallBack = 0;
+       ieee->bTxUseDriverAssingedRate = 0;
+
+       ieee->bTxEnableFwCalcDur = 1;
+
+       pHTInfo->bRegRT2RTAggregation = 1;
+
+       pHTInfo->bRegRxReorderEnable = 1;
+       pHTInfo->RxReorderWinSize = 64;
+       pHTInfo->RxReorderPendingTime = 30;
+
+#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
+       pHTInfo->UsbTxAggrNum = 4;
+#endif
+#ifdef USB_RX_AGGREGATION_SUPPORT
+#ifdef RTL8192SU
+       pHTInfo->UsbRxFwAggrEn = 1;
+       pHTInfo->UsbRxFwAggrPageNum = 48;
+       pHTInfo->UsbRxFwAggrPacketNum = 8;
+       pHTInfo->UsbRxFwAggrTimeout = 4;
+       pHTInfo->UsbRxPageSize= 128;
+#else
+       pHTInfo->UsbRxFwAggrEn = 1;
+       pHTInfo->UsbRxFwAggrPageNum = 24;
+       pHTInfo->UsbRxFwAggrPacketNum = 8;
+       pHTInfo->UsbRxFwAggrTimeout = 8;
+#endif
+#endif
+
+
+}
+void HTDebugHTCapability(u8* CapIE, u8* TitleString )
+{
+
+       static u8       EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
+       PHT_CAPABILITY_ELE              pCapELE;
+
+       if (!memcmp(CapIE, EWC11NHTCap, sizeof(EWC11NHTCap)))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_HT, "EWC IE in %s()\n", __func__);
+               pCapELE = (PHT_CAPABILITY_ELE)(&CapIE[4]);
+       }else
+               pCapELE = (PHT_CAPABILITY_ELE)(&CapIE[0]);
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "<Log HT Capability>. Called by %s\n", TitleString );
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tSupported Channel Width = %s\n", (pCapELE->ChlWidth)?"20MHz": "20/40MHz");
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tSupport Short GI for 20M = %s\n", (pCapELE->ShortGI20Mhz)?"YES": "NO");
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tSupport Short GI for 40M = %s\n", (pCapELE->ShortGI40Mhz)?"YES": "NO");
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tSupport TX STBC = %s\n", (pCapELE->TxSTBC)?"YES": "NO");
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tMax AMSDU Size = %s\n", (pCapELE->MaxAMSDUSize)?"3839": "7935");
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tSupport CCK in 20/40 mode = %s\n", (pCapELE->DssCCk)?"YES": "NO");
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tMax AMPDU Factor = %d\n", pCapELE->MaxRxAMPDUFactor);
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tMPDU Density = %d\n", pCapELE->MPDUDensity);
+       RTLLIB_DEBUG(RTLLIB_DL_HT,  "\tMCS Rate Set = [%x][%x][%x][%x][%x]\n", pCapELE->MCS[0],\
+                               pCapELE->MCS[1], pCapELE->MCS[2], pCapELE->MCS[3], pCapELE->MCS[4]);
+       return;
+
+}
+void HTDebugHTInfo(u8* InfoIE, u8* TitleString)
+{
+
+       static u8       EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x34};
+       PHT_INFORMATION_ELE             pHTInfoEle;
+
+       if (!memcmp(InfoIE, EWC11NHTInfo, sizeof(EWC11NHTInfo)))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_HT, "EWC IE in %s()\n", __func__);
+               pHTInfoEle = (PHT_INFORMATION_ELE)(&InfoIE[4]);
+       }else
+               pHTInfoEle = (PHT_INFORMATION_ELE)(&InfoIE[0]);
+
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "<Log HT Information Element>. Called by %s\n", TitleString);
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "\tPrimary channel = %d\n", pHTInfoEle->ControlChl);
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "\tSenondary channel =");
+       switch (pHTInfoEle->ExtChlOffset)
+       {
+               case 0:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "Not Present\n");
+                       break;
+               case 1:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "Upper channel\n");
+                       break;
+               case 2:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "Reserved. Eooro!!!\n");
+                       break;
+               case 3:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "Lower Channel\n");
+                       break;
+       }
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "\tRecommended channel width = %s\n", (pHTInfoEle->RecommemdedTxWidth)?"20Mhz": "40Mhz");
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "\tOperation mode for protection = ");
+       switch (pHTInfoEle->OptMode)
+       {
+               case 0:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "No Protection\n");
+                       break;
+               case 1:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "HT non-member protection mode\n");
+                       break;
+               case 2:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "Suggest to open protection\n");
+                       break;
+               case 3:
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "HT mixed mode\n");
+                       break;
+       }
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "\tBasic MCS Rate Set = [%x][%x][%x][%x][%x]\n", pHTInfoEle->BasicMSC[0],\
+                               pHTInfoEle->BasicMSC[1], pHTInfoEle->BasicMSC[2], pHTInfoEle->BasicMSC[3], pHTInfoEle->BasicMSC[4]);
+       return;
+}
+
+bool IsHTHalfNmode40Bandwidth(struct rtllib_device* ieee)
+{
+       bool                    retValue = false;
+       PRT_HIGH_THROUGHPUT      pHTInfo = ieee->pHTInfo;
+
+       if (pHTInfo->bCurrentHTSupport == false )
+               retValue = false;
+       else if (pHTInfo->bRegBW40MHz == false)
+               retValue = false;
+       else if (!ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+               retValue = false;
+       else if (((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ChlWidth)
+               retValue = true;
+       else
+               retValue = false;
+
+       return retValue;
+}
+
+bool IsHTHalfNmodeSGI(struct rtllib_device* ieee, bool is40MHz)
+{
+       bool                    retValue = false;
+       PRT_HIGH_THROUGHPUT      pHTInfo = ieee->pHTInfo;
+
+       if (pHTInfo->bCurrentHTSupport == false )
+               retValue = false;
+       else if (!ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+               retValue = false;
+       else if (is40MHz)
+       {
+               if (((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ShortGI40Mhz)
+                       retValue = true;
+               else
+                       retValue = false;
+       }
+       else
+       {
+               if (((PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf))->ShortGI20Mhz)
+                       retValue = true;
+               else
+                       retValue = false;
+       }
+
+       return retValue;
+}
+
+u16 HTHalfMcsToDataRate(struct rtllib_device* ieee,    u8      nMcsRate)
+{
+
+       u8      is40MHz;
+       u8      isShortGI;
+
+       is40MHz  =  (IsHTHalfNmode40Bandwidth(ieee))?1:0;
+       isShortGI = (IsHTHalfNmodeSGI(ieee, is40MHz))? 1:0;
+
+       return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate&0x7f)];
+}
+
+
+u16 HTMcsToDataRate( struct rtllib_device* ieee, u8 nMcsRate)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+
+       u8      is40MHz = (pHTInfo->bCurBW40MHz)?1:0;
+       u8      isShortGI = (pHTInfo->bCurBW40MHz)?
+                                               ((pHTInfo->bCurShortGI40MHz)?1:0):
+                                               ((pHTInfo->bCurShortGI20MHz)?1:0);
+       return MCS_DATA_RATE[is40MHz][isShortGI][(nMcsRate&0x7f)];
+}
+
+u16  TxCountToDataRate( struct rtllib_device* ieee, u8 nDataRate)
+{
+       u16             CCKOFDMRate[12] = {0x02 , 0x04 , 0x0b , 0x16 , 0x0c , 0x12 , 0x18 , 0x24 , 0x30 , 0x48 , 0x60 , 0x6c};
+       u8      is40MHz = 0;
+       u8      isShortGI = 0;
+
+       if (nDataRate < 12)
+       {
+               return CCKOFDMRate[nDataRate];
+       }
+       else
+       {
+               if (nDataRate >= 0x10 && nDataRate <= 0x1f)
+               {
+                       is40MHz = 0;
+                       isShortGI = 0;
+
+               }
+               else if (nDataRate >=0x20  && nDataRate <= 0x2f )
+               {
+                       is40MHz = 1;
+                       isShortGI = 0;
+
+               }
+               else if (nDataRate >= 0x30  && nDataRate <= 0x3f )
+               {
+                       is40MHz = 0;
+                       isShortGI = 1;
+
+               }
+               else if (nDataRate >= 0x40  && nDataRate <= 0x4f )
+               {
+                       is40MHz = 1;
+                       isShortGI = 1;
+
+               }
+               return MCS_DATA_RATE[is40MHz][isShortGI][nDataRate&0xf];
+       }
+}
+
+
+
+bool IsHTHalfNmodeAPs(struct rtllib_device* ieee)
+{
+       bool                    retValue = false;
+       struct rtllib_network* net = &ieee->current_network;
+
+       if ((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
+                    (memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3)==0) ||
+                    (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
+                    (memcmp(net->bssid, EDIMAX_RALINK, 3)==0) ||
+                    (memcmp(net->bssid, AIRLINK_RALINK, 3)==0) ||
+                    (net->ralink_cap_exist))
+               retValue = true;
+       else if ((memcmp(net->bssid, UNKNOWN_BORADCOM, 3)==0) ||
+                   (memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
+                   (memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)||
+                   (net->broadcom_cap_exist))
+                 retValue = true;
+       else if (net->bssht.bdRT2RTAggregation)
+               retValue = true;
+       else
+               retValue = false;
+
+       return retValue;
+}
+
+void HTIOTPeerDetermine(struct rtllib_device* ieee)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       struct rtllib_network* net = &ieee->current_network;
+       if (net->bssht.bdRT2RTAggregation){
+               pHTInfo->IOTPeer = HT_IOT_PEER_REALTEK;
+               if (net->bssht.RT2RT_HT_Mode & RT_HT_CAP_USE_92SE){
+                       pHTInfo->IOTPeer = HT_IOT_PEER_REALTEK_92SE;
+               }
+               if (net->bssht.RT2RT_HT_Mode & RT_HT_CAP_USE_SOFTAP){
+                       pHTInfo->IOTPeer = HT_IOT_PEER_92U_SOFTAP;
+               }
+       }
+       else if (net->broadcom_cap_exist)
+               pHTInfo->IOTPeer = HT_IOT_PEER_BROADCOM;
+       else if ((memcmp(net->bssid, UNKNOWN_BORADCOM, 3)==0) ||
+                       (memcmp(net->bssid, LINKSYSWRT330_LINKSYSWRT300_BROADCOM, 3)==0)||
+                       (memcmp(net->bssid, LINKSYSWRT350_LINKSYSWRT150_BROADCOM, 3)==0)/*||
+                       (memcmp(net->bssid, NETGEAR834Bv2_BROADCOM, 3)==0) */)
+               pHTInfo->IOTPeer = HT_IOT_PEER_BROADCOM;
+       else if ((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
+                       (memcmp(net->bssid, BELKINF5D82334V3_RALINK, 3)==0) ||
+                       (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
+                       (memcmp(net->bssid, EDIMAX_RALINK, 3)==0) ||
+                       (memcmp(net->bssid, AIRLINK_RALINK, 3)==0) ||
+                        net->ralink_cap_exist)
+               pHTInfo->IOTPeer = HT_IOT_PEER_RALINK;
+       else if ((net->atheros_cap_exist )||
+               (memcmp(net->bssid, DLINK_ATHEROS_1, 3) == 0)||
+               (memcmp(net->bssid, DLINK_ATHEROS_2, 3) == 0))
+               pHTInfo->IOTPeer = HT_IOT_PEER_ATHEROS;
+       else if ((memcmp(net->bssid, CISCO_BROADCOM, 3)==0)||net->cisco_cap_exist)
+               pHTInfo->IOTPeer = HT_IOT_PEER_CISCO;
+       else if ((memcmp(net->bssid, LINKSYS_MARVELL_4400N, 3) == 0) ||
+                 net->marvell_cap_exist)
+               pHTInfo->IOTPeer = HT_IOT_PEER_MARVELL;
+       else if (net->airgo_cap_exist)
+               pHTInfo->IOTPeer = HT_IOT_PEER_AIRGO;
+       else
+               pHTInfo->IOTPeer = HT_IOT_PEER_UNKNOWN;
+
+       RTLLIB_DEBUG(RTLLIB_DL_IOT, "Joseph debug!! IOTPEER: %x\n", pHTInfo->IOTPeer);
+}
+
+u8 HTIOTActIsDisableMCS14(struct rtllib_device* ieee, u8* PeerMacAddr)
+{
+       return 0;
+ }
+
+
+bool HTIOTActIsDisableMCS15(struct rtllib_device* ieee)
+{
+       bool retValue = false;
+
+#if defined(RTL8192U)
+       if (ieee->current_network.bssht.bdBandWidth == HT_CHANNEL_WIDTH_20_40)
+       retValue = true;
+       else
+               retValue = false;
+#endif
+
+
+       return retValue;
+}
+
+bool HTIOTActIsDisableMCSTwoSpatialStream(struct rtllib_device* ieee)
+{
+       bool retValue = false;
+#ifdef RTL8192U
+       struct rtllib_network* net = &ieee->current_network;
+
+       if ((ieee->pHTInfo->bCurrentHTSupport == true) && (ieee->pairwise_key_type == KEY_TYPE_CCMP))
+       {
+               if ((memcmp(net->bssid, BELKINF5D8233V1_RALINK, 3)==0) ||
+                               (memcmp(net->bssid, PCI_RALINK, 3)==0) ||
+                               (memcmp(net->bssid, EDIMAX_RALINK, 3)==0))
+               {
+                       retValue = false;
+               }
+       }
+#endif
+#if defined(RTL8192SU) || defined RTL8192CE
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       if (ieee->rtllib_ap_sec_type &&
+               (ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_WEP|SEC_ALG_TKIP)))
+       {
+               if ( (pHTInfo->IOTPeer != HT_IOT_PEER_ATHEROS) &&
+                       (pHTInfo->IOTPeer != HT_IOT_PEER_UNKNOWN) &&
+                       (pHTInfo->IOTPeer != HT_IOT_PEER_MARVELL) &&
+                       (pHTInfo->IOTPeer != HT_IOT_PEER_REALTEK_92SE) &&
+                       (pHTInfo->IOTPeer != HT_IOT_PEER_RALINK) )
+                       retValue = true;
+       }
+#elif defined(RTL8192SE)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       if (ieee->rtllib_ap_sec_type &&
+               (ieee->rtllib_ap_sec_type(ieee)&SEC_ALG_TKIP)) {
+                       if (pHTInfo->IOTPeer == HT_IOT_PEER_RALINK){
+                               retValue = true;
+                       }
+               }
+#endif
+       return retValue;
+}
+
+u8 HTIOTActIsDisableEDCATurbo(struct rtllib_device*    ieee, u8* PeerMacAddr)
+{
+       return false;
+}
+
+
+bool HTIOTActIsEnableBETxOPLimit(struct rtllib_device* ieee)
+{
+       bool    retValue = false;
+
+#if defined RTL8192SU
+       if (ieee->mode == IEEE_G)
+               retValue = true;
+#elif defined RTL8192CE
+       if (ieee->mode == IEEE_G ||
+               (ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_WEP|SEC_ALG_TKIP)))
+               retValue = true;
+#endif
+
+       return retValue;
+}
+
+
+u8 HTIOTActIsMgntUseCCK6M(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8      retValue = 0;
+
+
+#if (defined RTL8192U || defined RTL8192E || defined RTL8190P)
+       {
+       if (ieee->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               retValue = 1;
+       }
+       }
+#endif
+
+       return retValue;
+}
+
+u8
+HTIOTActWAIOTBroadcom(struct rtllib_device* ieee)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       u8              retValue = false;
+       u8              boundary=59;
+
+       pHTInfo->bWAIotBroadcom = false;
+       if (ieee->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               if (ieee->current_network.bssht.bdBandWidth == HT_CHANNEL_WIDTH_20_40)
+               {
+                       if (!(pHTInfo->bRegBW40MHz))
+                       {
+                               if (ieee->current_network.mode != WIRELESS_MODE_B)
+                               {
+                                       pHTInfo->bWAIotBroadcom = true;
+
+                                       if (ieee->b_customer_lenovo_id == true)
+                                               boundary = 30;
+
+                                       if ( ieee->current_network.RSSI >= boundary)
+                                               retValue = true;
+                               }
+                       }else{
+                               ;
+                       }
+               }
+       }
+       return retValue;
+}
+
+u8 HTIOTActIsForcedCTS2Self(struct rtllib_device *ieee, struct rtllib_network *network)
+{
+       u8      retValue = 0;
+#if (defined RTL8192SE || defined RTL8192SU || defined RTL8192CE)
+       if ((ieee->pHTInfo->IOTPeer == HT_IOT_PEER_MARVELL) ||(ieee->pHTInfo->IOTPeer == HT_IOT_PEER_ATHEROS) )
+#else
+       if (ieee->pHTInfo->IOTPeer == HT_IOT_PEER_MARVELL)
+#endif
+       {
+               retValue = 1;
+       }
+
+       return retValue;
+}
+
+u8 HTIOTActIsForcedRTSCTS(struct rtllib_device *ieee, struct rtllib_network *network)
+{
+       u8      retValue = 0;
+#if defined(RTL8192SE) || defined(RTL8192SU)
+       if (ieee->pHTInfo->bCurrentHTSupport)
+       {
+               if ((ieee->pHTInfo->IOTPeer != HT_IOT_PEER_REALTEK)&&
+                  (ieee->pHTInfo->IOTPeer != HT_IOT_PEER_REALTEK_92SE))
+       {
+                       if ((ieee->pHTInfo->IOTAction & HT_IOT_ACT_TX_NO_AGGREGATION) == 0)
+                               retValue = 1;
+               }
+       }
+#endif
+       return retValue;
+}
+
+u8
+HTIOTActIsForcedAMSDU8K(struct rtllib_device *ieee, struct rtllib_network *network)
+{
+       u8 retValue = 0;
+
+       return retValue;
+}
+
+u8 HTIOTActIsCCDFsync(struct rtllib_device *ieee)
+{
+       u8      retValue = 0;
+#if (defined RTL8190P || defined RTL8192U  || defined RTL8192SU)
+       if (ieee->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               retValue = 1;
+       }
+#endif
+       return retValue;
+}
+
+u8
+HTIOCActRejcectADDBARequest(struct rtllib_network *network)
+{
+       u8      retValue = 0;
+#if (defined RTL8192SE || defined RTL8192SU || defined RTL8192CE)
+       {
+
+
+       }
+#endif
+
+       return retValue;
+
+}
+
+u8
+  HTIOTActIsEDCABiasRx(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8      retValue = 0;
+#ifdef RTL8192SU
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       {
+               if (pHTInfo->IOTPeer==HT_IOT_PEER_ATHEROS ||
+                  pHTInfo->IOTPeer==HT_IOT_PEER_BROADCOM ||
+                  pHTInfo->IOTPeer==HT_IOT_PEER_RALINK)
+                       return 1;
+
+       }
+#elif defined RTL8192CE
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       {
+               if (pHTInfo->IOTPeer==HT_IOT_PEER_ATHEROS ||
+                  pHTInfo->IOTPeer==HT_IOT_PEER_RALINK)
+                       return 1;
+
+       }
+#elif defined RTL8192SE
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       {
+            if (ieee->rtllib_ap_sec_type != NULL)
+                if (ieee->rtllib_ap_sec_type(ieee) == SEC_ALG_CCMP)
+                    if (pHTInfo->IOTPeer==HT_IOT_PEER_RALINK){
+                        return 1;
+                    }
+
+       }
+#endif
+       return retValue;
+}
+
+u8
+HTIOTActDisableShortGI(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8      retValue = 0;
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+
+       if (pHTInfo->IOTPeer==HT_IOT_PEER_RALINK)
+       {
+                       retValue = 1;
+       }
+
+       return retValue;
+}
+
+u8
+HTIOTActDisableHighPower(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8      retValue = 0;
+#if (defined RTL8192SE || defined RTL8192SU || defined RTL8192CE)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+#endif
+
+#ifdef RTL8192SU
+       if (pHTInfo->IOTPeer==HT_IOT_PEER_RALINK ||
+               pHTInfo->IOTPeer==HT_IOT_PEER_REALTEK ||
+               pHTInfo->IOTPeer==HT_IOT_PEER_REALTEK_92SE)
+       {
+                       retValue = 1;
+       }
+#elif defined RTL8192SE || defined RTL8192CE
+       if (pHTInfo->IOTPeer==HT_IOT_PEER_RALINK ||
+               pHTInfo->IOTPeer==HT_IOT_PEER_REALTEK )
+       {
+                       retValue = 1;
+       }
+#endif
+       return retValue;
+}
+
+void
+HTIOTActDetermineRaFunc(struct rtllib_device* ieee,    bool    bPeerRx2ss)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       pHTInfo->IOTRaFunc &= HT_IOT_RAFUNC_DISABLE_ALL;
+
+       if (pHTInfo->IOTPeer == HT_IOT_PEER_RALINK && !bPeerRx2ss)
+               pHTInfo->IOTRaFunc |= HT_IOT_RAFUNC_PEER_1R;
+
+       if (pHTInfo->IOTAction & HT_IOT_ACT_AMSDU_ENABLE)
+               pHTInfo->IOTRaFunc |= HT_IOT_RAFUNC_TX_AMSDU;
+
+}
+
+
+u8
+HTIOTActIsDisableTx40MHz(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8      retValue = 0;
+
+#if (defined RTL8192SU || defined RTL8192SE || defined RTL8192CE)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       if (    (KEY_TYPE_WEP104 == ieee->pairwise_key_type) ||
+               (KEY_TYPE_WEP40 == ieee->pairwise_key_type) ||
+               (KEY_TYPE_WEP104 == ieee->group_key_type) ||
+               (KEY_TYPE_WEP40 == ieee->group_key_type) ||
+               (KEY_TYPE_TKIP == ieee->pairwise_key_type) )
+       {
+               if ((pHTInfo->IOTPeer==HT_IOT_PEER_REALTEK) && (network->bssht.bdSupportHT))
+                       retValue = 1;
+       }
+#endif
+
+       return retValue;
+}
+
+u8
+HTIOTActIsTxNoAggregation(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8 retValue = 0;
+
+#if (defined RTL8192SU || defined RTL8192SE || defined RTL8192CE)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       if (    (KEY_TYPE_WEP104 == ieee->pairwise_key_type) ||
+               (KEY_TYPE_WEP40 == ieee->pairwise_key_type) ||
+               (KEY_TYPE_WEP104 == ieee->group_key_type) ||
+               (KEY_TYPE_WEP40 == ieee->group_key_type) ||
+               (KEY_TYPE_TKIP == ieee->pairwise_key_type) )
+       {
+               if (pHTInfo->IOTPeer==HT_IOT_PEER_REALTEK)
+                       retValue = 1;
+       }
+#endif
+
+       return retValue;
+}
+
+
+u8
+HTIOTActIsDisableTx2SS(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       u8      retValue = 0;
+
+#if (defined RTL8192SU || defined RTL8192SE || defined RTL8192CE)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       if (    (KEY_TYPE_WEP104 == ieee->pairwise_key_type) ||
+               (KEY_TYPE_WEP40 == ieee->pairwise_key_type) ||
+               (KEY_TYPE_WEP104 == ieee->group_key_type) ||
+               (KEY_TYPE_WEP40 == ieee->group_key_type) ||
+               (KEY_TYPE_TKIP == ieee->pairwise_key_type) )
+       {
+               if ((pHTInfo->IOTPeer==HT_IOT_PEER_REALTEK) && (network->bssht.bdSupportHT))
+                       retValue = 1;
+       }
+#endif
+
+       return retValue;
+}
+
+
+bool HTIOCActIsDisableCckRate(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       bool    retValue = false;
+#if defined(RTL8192SU)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               if ((memcmp(network->bssid, NETGEAR_BROADCOM, 3)==0)
+                       && (network->bssht.bdBandWidth == HT_CHANNEL_WIDTH_20_40))
+                       return true;
+       }
+#endif
+       return retValue;
+}
+
+bool HTIOCActAllowPeerAggOnePacket(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       bool    retValue = false;
+#if defined(RTL8192SE) || defined(RTL8192SU)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       {
+               if (ieee->VersionID<2)
+               if (pHTInfo->IOTPeer == HT_IOT_PEER_MARVELL)
+                       return true;
+
+       }
+#endif
+       return retValue;
+}
+
+bool
+HTIOTActIsNullDataPowerSaving(struct rtllib_device* ieee,struct rtllib_network *network)
+{
+       bool    retValue = false;
+#if defined(RTL8192SE) || defined(RTL8192SU)
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       {
+               if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+                       return true;
+
+       }
+#endif
+       return retValue;
+}
+
+void HTResetIOTSetting(
+       PRT_HIGH_THROUGHPUT             pHTInfo
+)
+{
+       pHTInfo->IOTAction = 0;
+       pHTInfo->IOTPeer = HT_IOT_PEER_UNKNOWN;
+       pHTInfo->IOTRaFunc = 0;
+}
+
+
+void HTConstructCapabilityElement(struct rtllib_device* ieee, u8* posHTCap, u8* len, u8 IsEncrypt, bool bAssoc)
+{
+       PRT_HIGH_THROUGHPUT     pHT = ieee->pHTInfo;
+       PHT_CAPABILITY_ELE      pCapELE = NULL;
+
+       if ((posHTCap == NULL) || (pHT == NULL))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "posHTCap or pHTInfo can't be null in HTConstructCapabilityElement()\n");
+               return;
+       }
+       memset(posHTCap, 0, *len);
+
+       if ((bAssoc) && (pHT->ePeerHTSpecVer == HT_SPEC_VER_EWC))
+       {
+               u8      EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
+               memcpy(posHTCap, EWC11NHTCap, sizeof(EWC11NHTCap));
+               pCapELE = (PHT_CAPABILITY_ELE)&(posHTCap[4]);
+               *len = 30 + 2;
+       }else
+       {
+               pCapELE = (PHT_CAPABILITY_ELE)posHTCap;
+               *len = 26 + 2;
+       }
+
+       pCapELE->AdvCoding              = 0;
+       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+               pCapELE->ChlWidth = 0;
+       else
+                       pCapELE->ChlWidth = (pHT->bRegBW40MHz?1:0);
+
+       pCapELE->MimoPwrSave            = pHT->SelfMimoPs;
+       pCapELE->GreenField             = 0;
+       pCapELE->ShortGI20Mhz           = 1;
+       pCapELE->ShortGI40Mhz           = 1;
+
+       pCapELE->TxSTBC                 = 1;
+#if defined RTL8192SE || defined RTL8192CE
+       pCapELE->TxSTBC                 = 0;
+#endif
+       pCapELE->RxSTBC                 = 0;
+       pCapELE->DelayBA                = 0;
+       pCapELE->MaxAMSDUSize   = (MAX_RECEIVE_BUFFER_SIZE>=7935)?1:0;
+       pCapELE->DssCCk                 = ((pHT->bRegBW40MHz)?(pHT->bRegSuppCCK?1:0):0);
+       pCapELE->PSMP                   = 0;
+       pCapELE->LSigTxopProtect        = 0;
+
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "TX HT cap/info ele BW=%d MaxAMSDUSize:%d DssCCk:%d\n", pCapELE->ChlWidth, pCapELE->MaxAMSDUSize, pCapELE->DssCCk);
+
+       if ( IsEncrypt)
+       {
+               pCapELE->MPDUDensity    = 7;
+               pCapELE->MaxRxAMPDUFactor       = 2;
+       }
+       else
+       {
+               pCapELE->MaxRxAMPDUFactor       = 3;
+               pCapELE->MPDUDensity    = 0;
+       }
+
+       memcpy(pCapELE->MCS, ieee->Regdot11HTOperationalRateSet, 16);
+       memset(&pCapELE->ExtHTCapInfo, 0, 2);
+       memset(pCapELE->TxBFCap, 0, 4);
+
+       pCapELE->ASCap = 0;
+
+       if (bAssoc) {
+               if (pHT->IOTAction & HT_IOT_ACT_DISABLE_MCS15)
+                       pCapELE->MCS[1] &= 0x7f;
+
+               if (pHT->IOTAction & HT_IOT_ACT_DISABLE_MCS14)
+                       pCapELE->MCS[1] &= 0xbf;
+
+               if (pHT->IOTAction & HT_IOT_ACT_DISABLE_ALL_2SS)
+                       pCapELE->MCS[1] &= 0x00;
+
+               if (pHT->IOTAction & HT_IOT_ACT_DISABLE_RX_40MHZ_SHORT_GI)
+                       pCapELE->ShortGI40Mhz           = 0;
+
+               if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+               {
+                       pCapELE->ChlWidth = 0;
+
+                       pCapELE->MCS[1] = 0;
+               }
+       }
+
+
+
+
+
+       return;
+
+}
+void HTConstructInfoElement(struct rtllib_device* ieee, u8* posHTInfo, u8* len, u8 IsEncrypt)
+{
+       PRT_HIGH_THROUGHPUT     pHT = ieee->pHTInfo;
+       PHT_INFORMATION_ELE             pHTInfoEle = (PHT_INFORMATION_ELE)posHTInfo;
+       if ((posHTInfo == NULL) || (pHTInfoEle == NULL))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "posHTInfo or pHTInfoEle can't be null in HTConstructInfoElement()\n");
+               return;
+       }
+
+       memset(posHTInfo, 0, *len);
+       if ( (ieee->iw_mode == IW_MODE_ADHOC) || (ieee->iw_mode == IW_MODE_MASTER))
+       {
+               pHTInfoEle->ControlChl  = ieee->current_network.channel;
+               pHTInfoEle->ExtChlOffset = ((pHT->bRegBW40MHz == false)?HT_EXTCHNL_OFFSET_NO_EXT:
+                                                       (ieee->current_network.channel<=6)?
+                                                       HT_EXTCHNL_OFFSET_UPPER:HT_EXTCHNL_OFFSET_LOWER);
+               pHTInfoEle->RecommemdedTxWidth  = pHT->bRegBW40MHz;
+               pHTInfoEle->RIFS                                        = 0;
+               pHTInfoEle->PSMPAccessOnly              = 0;
+               pHTInfoEle->SrvIntGranularity           = 0;
+               pHTInfoEle->OptMode                             = pHT->CurrentOpMode;
+               pHTInfoEle->NonGFDevPresent             = 0;
+               pHTInfoEle->DualBeacon                  = 0;
+               pHTInfoEle->SecondaryBeacon             = 0;
+               pHTInfoEle->LSigTxopProtectFull         = 0;
+               pHTInfoEle->PcoActive                           = 0;
+               pHTInfoEle->PcoPhase                            = 0;
+
+               memset(pHTInfoEle->BasicMSC, 0, 16);
+
+
+               *len = 22 + 2;
+
+       }
+       else
+       {
+               *len = 0;
+       }
+       return;
+}
+
+void HTConstructRT2RTAggElement(struct rtllib_device* ieee, u8* posRT2RTAgg, u8* len)
+{
+       if (posRT2RTAgg == NULL) {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "posRT2RTAgg can't be null in HTConstructRT2RTAggElement()\n");
+               return;
+       }
+       memset(posRT2RTAgg, 0, *len);
+       *posRT2RTAgg++ = 0x00;
+       *posRT2RTAgg++ = 0xe0;
+       *posRT2RTAgg++ = 0x4c;
+       *posRT2RTAgg++ = 0x02;
+       *posRT2RTAgg++ = 0x01;
+
+#ifdef RTL8192CE
+       *posRT2RTAgg = 0x70;
+#else
+       *posRT2RTAgg = 0x30;
+#endif
+
+       if (ieee->bSupportRemoteWakeUp) {
+               *posRT2RTAgg |= RT_HT_CAP_USE_WOW;
+       }
+
+       *len = 6 + 2;
+
+       return;
+
+#ifdef TODO
+       posRT2RTAgg->Length = 6;
+#endif
+
+
+
+
+}
+
+u8 HT_PickMCSRate(struct rtllib_device* ieee, u8* pOperateMCS)
+{
+       u8                                      i;
+       if (pOperateMCS == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "pOperateMCS can't be null in HT_PickMCSRate()\n");
+               return false;
+       }
+
+       switch (ieee->mode) {
+       case IEEE_A:
+       case IEEE_B:
+       case IEEE_G:
+               for (i=0;i<=15;i++)
+                               pOperateMCS[i] = 0;
+               break;
+       case IEEE_N_24G:
+       case IEEE_N_5G:
+               pOperateMCS[0] &=RATE_ADPT_1SS_MASK;
+               pOperateMCS[1] &=RATE_ADPT_2SS_MASK;
+               pOperateMCS[3] &=RATE_ADPT_MCS32_MASK;
+               break;
+       default:
+               break;
+
+       }
+
+       return true;
+}
+
+u8 HTGetHighestMCSRate(struct rtllib_device* ieee, u8* pMCSRateSet, u8* pMCSFilter)
+{
+       u8              i, j;
+       u8              bitMap;
+       u8              mcsRate = 0;
+       u8              availableMcsRate[16];
+       if (pMCSRateSet == NULL || pMCSFilter == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "pMCSRateSet or pMCSFilter can't be null in HTGetHighestMCSRate()\n");
+               return false;
+       }
+       for (i=0; i<16; i++)
+               availableMcsRate[i] = pMCSRateSet[i] & pMCSFilter[i];
+
+       for (i = 0; i < 16; i++)
+       {
+               if (availableMcsRate[i] != 0)
+                       break;
+       }
+       if (i == 16)
+               return false;
+
+       for (i = 0; i < 16; i++)
+       {
+               if (availableMcsRate[i] != 0)
+               {
+                       bitMap = availableMcsRate[i];
+                       for (j = 0; j < 8; j++)
+                       {
+                               if ((bitMap%2) != 0)
+                               {
+                                       if (HTMcsToDataRate(ieee, (8*i+j)) > HTMcsToDataRate(ieee, mcsRate))
+                                               mcsRate = (8*i+j);
+                               }
+                               bitMap = bitMap>>1;
+                       }
+               }
+       }
+       return (mcsRate|0x80);
+}
+
+u8 HTFilterMCSRate( struct rtllib_device* ieee, u8* pSupportMCS, u8* pOperateMCS)
+{
+
+       u8 i=0;
+
+       for (i=0;i<=15;i++){
+               pOperateMCS[i] = ieee->Regdot11TxHTOperationalRateSet[i]&pSupportMCS[i];
+       }
+
+
+
+       HT_PickMCSRate(ieee, pOperateMCS);
+
+       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+               pOperateMCS[1] = 0;
+
+       for (i=2; i<=15; i++)
+               pOperateMCS[i] = 0;
+
+       return true;
+}
+void HTSetConnectBwMode(struct rtllib_device* ieee, HT_CHANNEL_WIDTH   Bandwidth, HT_EXTCHNL_OFFSET    Offset);
+void HTOnAssocRsp(struct rtllib_device *ieee)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       PHT_CAPABILITY_ELE              pPeerHTCap = NULL;
+       PHT_INFORMATION_ELE             pPeerHTInfo = NULL;
+       u16     nMaxAMSDUSize = 0;
+       u8*     pMcsFilter = NULL;
+
+       static u8                               EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
+       static u8                               EWC11NHTInfo[] = {0x00, 0x90, 0x4c, 0x34};
+
+       if ( pHTInfo->bCurrentHTSupport == false )
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "<=== HTOnAssocRsp(): HT_DISABLE\n");
+               return;
+       }
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "===> HTOnAssocRsp_wq(): HT_ENABLE\n");
+
+       if (!memcmp(pHTInfo->PeerHTCapBuf,EWC11NHTCap, sizeof(EWC11NHTCap)))
+               pPeerHTCap = (PHT_CAPABILITY_ELE)(&pHTInfo->PeerHTCapBuf[4]);
+       else
+               pPeerHTCap = (PHT_CAPABILITY_ELE)(pHTInfo->PeerHTCapBuf);
+
+       if (!memcmp(pHTInfo->PeerHTInfoBuf, EWC11NHTInfo, sizeof(EWC11NHTInfo)))
+               pPeerHTInfo = (PHT_INFORMATION_ELE)(&pHTInfo->PeerHTInfoBuf[4]);
+       else
+               pPeerHTInfo = (PHT_INFORMATION_ELE)(pHTInfo->PeerHTInfoBuf);
+
+       RTLLIB_DEBUG_DATA(RTLLIB_DL_DATA|RTLLIB_DL_HT, pPeerHTCap, sizeof(HT_CAPABILITY_ELE));
+       HTSetConnectBwMode(ieee, (HT_CHANNEL_WIDTH)(pPeerHTCap->ChlWidth), (HT_EXTCHNL_OFFSET)(pPeerHTInfo->ExtChlOffset));
+       pHTInfo->bCurTxBW40MHz = ((pPeerHTInfo->RecommemdedTxWidth == 1)?true:false);
+
+       pHTInfo->bCurShortGI20MHz=
+               ((pHTInfo->bRegShortGI20MHz)?((pPeerHTCap->ShortGI20Mhz==1)?true:false):false);
+       pHTInfo->bCurShortGI40MHz=
+               ((pHTInfo->bRegShortGI40MHz)?((pPeerHTCap->ShortGI40Mhz==1)?true:false):false);
+
+       pHTInfo->bCurSuppCCK =
+               ((pHTInfo->bRegSuppCCK)?((pPeerHTCap->DssCCk==1)?true:false):false);
+
+
+       pHTInfo->bCurrent_AMSDU_Support = pHTInfo->bAMSDU_Support;
+
+       nMaxAMSDUSize = (pPeerHTCap->MaxAMSDUSize==0)?3839:7935;
+
+       if (pHTInfo->nAMSDU_MaxSize > nMaxAMSDUSize )
+               pHTInfo->nCurrent_AMSDU_MaxSize = nMaxAMSDUSize;
+       else
+               pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
+
+       pHTInfo->bCurrentAMPDUEnable = pHTInfo->bAMPDUEnable;
+       if (ieee->rtllib_ap_sec_type &&
+          (ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_WEP|SEC_ALG_TKIP))){
+               if ( (pHTInfo->IOTPeer== HT_IOT_PEER_ATHEROS) ||
+                               (pHTInfo->IOTPeer == HT_IOT_PEER_UNKNOWN) )
+                       pHTInfo->bCurrentAMPDUEnable = false;
+       }
+
+       if (!pHTInfo->bRegRT2RTAggregation)
+       {
+               if (pHTInfo->AMPDU_Factor > pPeerHTCap->MaxRxAMPDUFactor)
+                       pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
+               else
+                       pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
+
+       } else {
+               if (ieee->current_network.bssht.bdRT2RTAggregation)
+               {
+                       if ( ieee->pairwise_key_type != KEY_TYPE_NA)
+                               pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
+                       else
+                               pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_64K;
+               }else
+               {
+                       if (pPeerHTCap->MaxRxAMPDUFactor < HT_AGG_SIZE_32K)
+                               pHTInfo->CurrentAMPDUFactor = pPeerHTCap->MaxRxAMPDUFactor;
+                       else
+                               pHTInfo->CurrentAMPDUFactor = HT_AGG_SIZE_32K;
+               }
+       }
+       if (pHTInfo->MPDU_Density > pPeerHTCap->MPDUDensity)
+               pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
+       else
+               pHTInfo->CurrentMPDUDensity = pPeerHTCap->MPDUDensity;
+#if (defined RTL8192SE || defined RTL8192SU || defined RTL8192CE)
+        if (ieee->SetHwRegHandler != NULL) {
+            ieee->SetHwRegHandler( ieee->dev, HW_VAR_SHORTGI_DENSITY,  (u8*)(&ieee->MaxMssDensity));
+            ieee->SetHwRegHandler(ieee->dev, HW_VAR_AMPDU_FACTOR, &pHTInfo->CurrentAMPDUFactor);
+            ieee->SetHwRegHandler(ieee->dev, HW_VAR_AMPDU_MIN_SPACE, &pHTInfo->CurrentMPDUDensity);
+        }
+#elif defined RTL8192CE
+        if (ieee->SetHwRegHandler != NULL) {
+            ieee->SetHwRegHandler(ieee->dev, HW_VAR_AMPDU_FACTOR, &pHTInfo->CurrentAMPDUFactor);
+            ieee->SetHwRegHandler(ieee->dev, HW_VAR_AMPDU_MIN_SPACE, &pHTInfo->CurrentMPDUDensity);
+        }
+#endif
+#ifndef RTL8190P
+       if (pHTInfo->IOTAction & HT_IOT_ACT_TX_USE_AMSDU_8K)
+#else
+       if ( 0 )
+#endif
+       {
+               pHTInfo->bCurrentAMPDUEnable = false;
+               pHTInfo->ForcedAMSDUMode = HT_AGG_FORCE_ENABLE;
+               pHTInfo->ForcedAMSDUMaxSize = 7935;
+       }
+       pHTInfo->bCurRxReorderEnable = pHTInfo->bRegRxReorderEnable;
+
+       if (pPeerHTCap->MCS[0] == 0)
+               pPeerHTCap->MCS[0] = 0xff;
+
+       HTIOTActDetermineRaFunc(ieee, ((pPeerHTCap->MCS[1])!=0));
+
+       HTFilterMCSRate(ieee, pPeerHTCap->MCS, ieee->dot11HTOperationalRateSet);
+
+       pHTInfo->PeerMimoPs = pPeerHTCap->MimoPwrSave;
+       if (pHTInfo->PeerMimoPs == MIMO_PS_STATIC)
+               pMcsFilter = MCS_FILTER_1SS;
+       else
+               pMcsFilter = MCS_FILTER_ALL;
+       ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee, ieee->dot11HTOperationalRateSet, pMcsFilter);
+       ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
+
+       pHTInfo->CurrentOpMode = pPeerHTInfo->OptMode;
+
+}
+
+void HTSetConnectBwModeCallback(struct rtllib_device* ieee);
+void HTInitializeHTInfo(struct rtllib_device* ieee)
+{
+       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "===========>%s()\n", __func__);
+       pHTInfo->bCurrentHTSupport = false;
+
+       pHTInfo->bCurBW40MHz = false;
+       pHTInfo->bCurTxBW40MHz = false;
+
+       pHTInfo->bCurShortGI20MHz = false;
+       pHTInfo->bCurShortGI40MHz = false;
+       pHTInfo->bForcedShortGI = false;
+
+       pHTInfo->bCurSuppCCK = true;
+
+       pHTInfo->bCurrent_AMSDU_Support = false;
+       pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
+       pHTInfo->CurrentMPDUDensity = pHTInfo->MPDU_Density;
+       pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
+
+       memset((void*)(&(pHTInfo->SelfHTCap)), 0, sizeof(pHTInfo->SelfHTCap));
+       memset((void*)(&(pHTInfo->SelfHTInfo)), 0, sizeof(pHTInfo->SelfHTInfo));
+       memset((void*)(&(pHTInfo->PeerHTCapBuf)), 0, sizeof(pHTInfo->PeerHTCapBuf));
+       memset((void*)(&(pHTInfo->PeerHTInfoBuf)), 0, sizeof(pHTInfo->PeerHTInfoBuf));
+
+       pHTInfo->bSwBwInProgress = false;
+       pHTInfo->ChnlOp = CHNLOP_NONE;
+
+       pHTInfo->ePeerHTSpecVer = HT_SPEC_VER_IEEE;
+
+       pHTInfo->bCurrentRT2RTAggregation = false;
+       pHTInfo->bCurrentRT2RTLongSlotTime = false;
+       pHTInfo->RT2RT_HT_Mode = (RT_HT_CAPBILITY)0;
+
+       pHTInfo->IOTPeer = 0;
+       pHTInfo->IOTAction = 0;
+       pHTInfo->IOTRaFunc = 0;
+
+       {
+               u8* RegHTSuppRateSets = &(ieee->RegHTSuppRateSet[0]);
+               RegHTSuppRateSets[0] = 0xFF;
+               RegHTSuppRateSets[1] = 0xFF;
+               RegHTSuppRateSets[4] = 0x01;
+       }
+}
+void HTInitializeBssDesc(PBSS_HT pBssHT)
+{
+
+       pBssHT->bdSupportHT = false;
+       memset(pBssHT->bdHTCapBuf, 0, sizeof(pBssHT->bdHTCapBuf));
+       pBssHT->bdHTCapLen = 0;
+       memset(pBssHT->bdHTInfoBuf, 0, sizeof(pBssHT->bdHTInfoBuf));
+       pBssHT->bdHTInfoLen = 0;
+
+       pBssHT->bdHTSpecVer= HT_SPEC_VER_IEEE;
+
+       pBssHT->bdRT2RTAggregation = false;
+       pBssHT->bdRT2RTLongSlotTime = false;
+       pBssHT->RT2RT_HT_Mode = (RT_HT_CAPBILITY)0;
+}
+
+void HTResetSelfAndSavePeerSetting(struct rtllib_device* ieee, struct rtllib_network * pNetwork)
+{
+       PRT_HIGH_THROUGHPUT             pHTInfo = ieee->pHTInfo;
+       u8      bIOTAction = 0;
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "==============>%s()\n", __func__);
+       /*unmark bEnableHT flag here is the same reason why unmarked in function rtllib_softmac_new_net. WB 2008.09.10*/
+       if (pNetwork->bssht.bdSupportHT)
+       {
+               pHTInfo->bCurrentHTSupport = true;
+               pHTInfo->ePeerHTSpecVer = pNetwork->bssht.bdHTSpecVer;
+
+               if (pNetwork->bssht.bdHTCapLen > 0 &&   pNetwork->bssht.bdHTCapLen <= sizeof(pHTInfo->PeerHTCapBuf))
+                       memcpy(pHTInfo->PeerHTCapBuf, pNetwork->bssht.bdHTCapBuf, pNetwork->bssht.bdHTCapLen);
+
+               if (pNetwork->bssht.bdHTInfoLen > 0 && pNetwork->bssht.bdHTInfoLen <= sizeof(pHTInfo->PeerHTInfoBuf))
+                       memcpy(pHTInfo->PeerHTInfoBuf, pNetwork->bssht.bdHTInfoBuf, pNetwork->bssht.bdHTInfoLen);
+
+               if (pHTInfo->bRegRT2RTAggregation)
+               {
+                       pHTInfo->bCurrentRT2RTAggregation = pNetwork->bssht.bdRT2RTAggregation;
+                       pHTInfo->bCurrentRT2RTLongSlotTime = pNetwork->bssht.bdRT2RTLongSlotTime;
+                       pHTInfo->RT2RT_HT_Mode = pNetwork->bssht.RT2RT_HT_Mode;
+               }
+               else
+               {
+                       pHTInfo->bCurrentRT2RTAggregation = false;
+                       pHTInfo->bCurrentRT2RTLongSlotTime = false;
+                       pHTInfo->RT2RT_HT_Mode = (RT_HT_CAPBILITY)0;
+               }
+
+               HTIOTPeerDetermine(ieee);
+
+               pHTInfo->IOTAction = 0;
+               bIOTAction = HTIOTActIsDisableMCS14(ieee, pNetwork->bssid);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_MCS14;
+
+               bIOTAction = HTIOTActIsDisableMCS15(ieee);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_MCS15;
+
+               bIOTAction = HTIOTActIsDisableMCSTwoSpatialStream(ieee);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_ALL_2SS;
+
+
+               bIOTAction = HTIOTActIsDisableEDCATurbo(ieee, pNetwork->bssid);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_EDCA_TURBO;
+
+#if defined(RTL8190P) || defined(RTL8192E) || defined(RTL8192U)
+               bIOTAction = HTIOTActIsMgntUseCCK6M(ieee,pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_MGNT_USE_CCK_6M;
+#elif defined(RTL8192SE) || defined(RTL8192SU) || defined RTL8192CE
+               bIOTAction = HTIOTActWAIOTBroadcom(ieee);
+               if (bIOTAction)
+               {
+                       pHTInfo->IOTAction |= HT_IOT_ACT_WA_IOT_Broadcom;
+               }
+#endif
+               bIOTAction = HTIOTActIsCCDFsync(ieee);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_CDD_FSYNC;
+#if defined(RTL8192SU) || defined(RTL8192SE) || defined RTL8192CE
+               bIOTAction = HTIOTActIsForcedCTS2Self(ieee,pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
+
+
+               bIOTAction = HTIOTActIsEnableBETxOPLimit(ieee);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_ENABLE_BE_TXOP;
+
+#if defined(RTL8192SU)
+               bIOTAction = HTIOCActRejcectADDBARequest(pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_REJECT_ADDBA_REQ;
+#endif
+
+               bIOTAction = HTIOCActAllowPeerAggOnePacket(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_ALLOW_PEER_AGG_ONE_PKT;
+
+               bIOTAction = HTIOTActIsEDCABiasRx(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_EDCA_BIAS_ON_RX;
+
+#if defined(RTL8192SU)
+               bIOTAction = HTIOCActIsDisableCckRate(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_CCK_RATE;
+#endif
+               bIOTAction = HTIOTActDisableShortGI(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_SHORT_GI;
+
+               bIOTAction = HTIOTActDisableHighPower(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_HIGH_POWER;
+
+
+               bIOTAction = HTIOTActIsForcedAMSDU8K(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_TX_USE_AMSDU_8K;
+
+#if defined(RTL8192SU)
+               bIOTAction = HTIOTActIsTxNoAggregation(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_TX_NO_AGGREGATION;
+
+               bIOTAction = HTIOTActIsDisableTx40MHz(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_TX_40_MHZ;
+
+               bIOTAction = HTIOTActIsDisableTx2SS(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_DISABLE_TX_2SS;
+#endif
+
+               bIOTAction = HTIOTActIsForcedRTSCTS(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_RTS;
+
+               bIOTAction = HTIOTActIsNullDataPowerSaving(ieee, pNetwork);
+               if (bIOTAction)
+                       pHTInfo->IOTAction |= HT_IOT_ACT_NULL_DATA_POWER_SAVING;
+#endif
+
+       } else {
+               pHTInfo->bCurrentHTSupport = false;
+               pHTInfo->bCurrentRT2RTAggregation = false;
+               pHTInfo->bCurrentRT2RTLongSlotTime = false;
+               pHTInfo->RT2RT_HT_Mode = (RT_HT_CAPBILITY)0;
+
+               pHTInfo->IOTAction = 0;
+               pHTInfo->IOTRaFunc = 0;
+       }
+
+}
+
+void HTUpdateSelfAndPeerSetting(struct rtllib_device* ieee,    struct rtllib_network * pNetwork)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       PHT_INFORMATION_ELE             pPeerHTInfo = (PHT_INFORMATION_ELE)pNetwork->bssht.bdHTInfoBuf;
+
+       if (pHTInfo->bCurrentHTSupport)
+       {
+               if (pNetwork->bssht.bdHTInfoLen != 0)
+                       pHTInfo->CurrentOpMode = pPeerHTInfo->OptMode;
+
+       }
+}
+
+void HTUseDefaultSetting(struct rtllib_device* ieee)
+{
+       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
+
+       if (pHTInfo->bEnableHT)
+       {
+               pHTInfo->bCurrentHTSupport = true;
+               pHTInfo->bCurSuppCCK = pHTInfo->bRegSuppCCK;
+
+               pHTInfo->bCurBW40MHz = pHTInfo->bRegBW40MHz;
+               pHTInfo->bCurShortGI20MHz= pHTInfo->bRegShortGI20MHz;
+
+               pHTInfo->bCurShortGI40MHz= pHTInfo->bRegShortGI40MHz;
+
+               if (ieee->iw_mode == IW_MODE_ADHOC)
+               {
+                       ieee->current_network.qos_data.active = ieee->current_network.qos_data.supported;
+               }
+               pHTInfo->bCurrent_AMSDU_Support = pHTInfo->bAMSDU_Support;
+               pHTInfo->nCurrent_AMSDU_MaxSize = pHTInfo->nAMSDU_MaxSize;
+
+               pHTInfo->bCurrentAMPDUEnable = pHTInfo->bAMPDUEnable;
+               pHTInfo->CurrentAMPDUFactor = pHTInfo->AMPDU_Factor;
+
+               pHTInfo->CurrentMPDUDensity = pHTInfo->CurrentMPDUDensity;
+
+
+               HTFilterMCSRate(ieee, ieee->Regdot11TxHTOperationalRateSet, ieee->dot11HTOperationalRateSet);
+#ifdef TODO
+               Adapter->HalFunc.InitHalRATRTableHandler( Adapter, &pMgntInfo->dot11OperationalRateSet, pMgntInfo->dot11HTOperationalRateSet);
+#endif
+               ieee->HTHighestOperaRate = HTGetHighestMCSRate(ieee, ieee->dot11HTOperationalRateSet, MCS_FILTER_ALL);
+               ieee->HTCurrentOperaRate = ieee->HTHighestOperaRate;
+
+#if (defined RTL8192SE || defined RTL8192SU || defined RTL8192CE)
+               if (ieee->SetHwRegHandler != NULL) {
+                       ieee->SetHwRegHandler( ieee->dev, HW_VAR_SHORTGI_DENSITY,  (u8*)(&ieee->MaxMssDensity));
+                       ieee->SetHwRegHandler(ieee->dev, HW_VAR_AMPDU_FACTOR, &pHTInfo->CurrentAMPDUFactor);
+                       ieee->SetHwRegHandler(ieee->dev, HW_VAR_AMPDU_MIN_SPACE, &pHTInfo->CurrentMPDUDensity);
+               }
+#endif
+
+       }
+       else
+       {
+               pHTInfo->bCurrentHTSupport = false;
+       }
+       return;
+}
+u8 HTCCheck(struct rtllib_device* ieee, u8*    pFrame)
+{
+       if (ieee->pHTInfo->bCurrentHTSupport)
+       {
+               if ( (IsQoSDataFrame(pFrame) && Frame_Order(pFrame)) == 1)
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_HT, "HT CONTROL FILED EXIST!!\n");
+                       return true;
+               }
+       }
+       return false;
+}
+
+void HTSetConnectBwMode(struct rtllib_device* ieee, HT_CHANNEL_WIDTH   Bandwidth, HT_EXTCHNL_OFFSET    Offset)
+{
+       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
+
+       if (pHTInfo->bRegBW40MHz == false)
+               return;
+
+       if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+               Bandwidth=HT_CHANNEL_WIDTH_20;
+
+
+       if (pHTInfo->bSwBwInProgress) {
+               printk("%s: bSwBwInProgress!!\n", __func__);
+               return;
+       }
+       if (Bandwidth==HT_CHANNEL_WIDTH_20_40)
+        {
+               if (ieee->current_network.channel<2 && Offset==HT_EXTCHNL_OFFSET_LOWER)
+                       Offset = HT_EXTCHNL_OFFSET_NO_EXT;
+               if (Offset==HT_EXTCHNL_OFFSET_UPPER || Offset==HT_EXTCHNL_OFFSET_LOWER) {
+                       pHTInfo->bCurBW40MHz = true;
+                       pHTInfo->CurSTAExtChnlOffset = Offset;
+               } else {
+                       pHTInfo->bCurBW40MHz = false;
+                       pHTInfo->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
+               }
+       } else {
+               pHTInfo->bCurBW40MHz = false;
+               pHTInfo->CurSTAExtChnlOffset = HT_EXTCHNL_OFFSET_NO_EXT;
+       }
+
+       printk("%s():pHTInfo->bCurBW40MHz:%x\n", __func__, pHTInfo->bCurBW40MHz);
+
+       pHTInfo->bSwBwInProgress = true;
+
+       HTSetConnectBwModeCallback(ieee);
+
+}
+
+void HTSetConnectBwModeCallback(struct rtllib_device* ieee)
+{
+       PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
+
+       RTLLIB_DEBUG(RTLLIB_DL_HT, "======>%s()\n", __func__);
+       if (pHTInfo->bCurBW40MHz)
+       {
+               if (pHTInfo->CurSTAExtChnlOffset==HT_EXTCHNL_OFFSET_UPPER)
+                       ieee->set_chan(ieee->dev, ieee->current_network.channel+2);
+               else if (pHTInfo->CurSTAExtChnlOffset==HT_EXTCHNL_OFFSET_LOWER)
+                       ieee->set_chan(ieee->dev, ieee->current_network.channel-2);
+               else
+                       ieee->set_chan(ieee->dev, ieee->current_network.channel);
+
+               ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20_40, pHTInfo->CurSTAExtChnlOffset);
+       } else {
+               ieee->set_chan(ieee->dev, ieee->current_network.channel);
+               ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
+       }
+
+       pHTInfo->bSwBwInProgress = false;
+}
diff --git a/drivers/staging/rtl8192e/rtl819x_Qos.h b/drivers/staging/rtl8192e/rtl819x_Qos.h
new file mode 100644 (file)
index 0000000..4c89a76
--- /dev/null
@@ -0,0 +1,422 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef __INC_QOS_TYPE_H
+#define __INC_QOS_TYPE_H
+
+#include "rtllib_endianfree.h"
+
+#define BIT0                    0x00000001
+#define BIT1                    0x00000002
+#define BIT2                    0x00000004
+#define BIT3                    0x00000008
+#define BIT4                    0x00000010
+#define BIT5                    0x00000020
+#define BIT6                    0x00000040
+#define BIT7                    0x00000080
+#define BIT8                    0x00000100
+#define BIT9                    0x00000200
+#define BIT10                   0x00000400
+#define BIT11                   0x00000800
+#define BIT12                   0x00001000
+#define BIT13                   0x00002000
+#define BIT14                   0x00004000
+#define BIT15                   0x00008000
+#define BIT16                   0x00010000
+#define BIT17                   0x00020000
+#define BIT18                   0x00040000
+#define BIT19                   0x00080000
+#define BIT20                   0x00100000
+#define BIT21                   0x00200000
+#define BIT22                   0x00400000
+#define BIT23                   0x00800000
+#define BIT24                   0x01000000
+#define BIT25                   0x02000000
+#define BIT26                   0x04000000
+#define BIT27                   0x08000000
+#define BIT28                   0x10000000
+#define BIT29                   0x20000000
+#define BIT30                   0x40000000
+#define BIT31                   0x80000000
+
+#ifndef RTK_DMP_PLATFORM
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
+#ifndef bool
+typedef enum{false = 0, true} bool;
+#endif
+#endif
+#endif
+
+typedef union _QOS_TSINFO{
+       u8              charData[3];
+       struct {
+               u8              ucTrafficType:1;
+               u8              ucTSID:4;
+               u8              ucDirection:2;
+               u8              ucAccessPolicy:2;
+               u8              ucAggregation:1;
+               u8              ucPSB:1;
+               u8              ucUP:3;
+               u8              ucTSInfoAckPolicy:2;
+               u8              ucSchedule:1;
+               u8              ucReserved:7;
+       }field;
+}QOS_TSINFO, *PQOS_TSINFO;
+typedef union _TSPEC_BODY{
+       u8              charData[55];
+
+       struct
+       {
+               QOS_TSINFO      TSInfo;
+               u16     NominalMSDUsize;
+               u16     MaxMSDUsize;
+               u32     MinServiceItv;
+               u32     MaxServiceItv;
+               u32     InactivityItv;
+               u32     SuspenItv;
+               u32     ServiceStartTime;
+               u32     MinDataRate;
+               u32     MeanDataRate;
+               u32     PeakDataRate;
+               u32     MaxBurstSize;
+               u32     DelayBound;
+               u32     MinPhyRate;
+               u16     SurplusBandwidthAllowance;
+               u16     MediumTime;
+       } f;
+}TSPEC_BODY, *PTSPEC_BODY;
+
+typedef struct _WMM_TSPEC{
+       u8              ID;
+       u8              Length;
+       u8              OUI[3];
+       u8              OUI_Type;
+       u8              OUI_SubType;
+       u8              Version;
+       TSPEC_BODY      Body;
+} WMM_TSPEC, *PWMM_TSPEC;
+
+typedef struct _OCTET_STRING{
+        u8             *Octet;
+        u16             Length;
+}OCTET_STRING, *POCTET_STRING;
+#define        MAX_WMMELE_LENGTH       64
+
+typedef u32 QOS_MODE, *PQOS_MODE;
+#define QOS_DISABLE            0
+#define QOS_WMM                1
+#define QOS_WMMSA              2
+#define QOS_EDCA               4
+#define QOS_HCCA               8
+#define QOS_WMM_UAPSD          16
+
+#define WMM_PARAM_ELE_BODY_LEN 18
+
+#define MAX_STA_TS_COUNT                       16
+#define MAX_AP_TS_COUNT                        32
+#define QOS_TSTREAM_KEY_SIZE           13
+
+#define WMM_ACTION_CATEGORY_CODE       17
+#define WMM_PARAM_ELE_BODY_LEN 18
+
+#define MAX_TSPEC_TSID                         15
+#define SESSION_REJECT_TSID                    0xfe
+#define DEFAULT_TSID                                   0xff
+
+#define ADDTS_TIME_SLOT                                100
+
+#define ACM_TIMEOUT                            1000
+#define SESSION_REJECT_TIMEOUT         60000
+
+typedef        enum _ACK_POLICY{
+       eAckPlc0_ACK            = 0x00,
+       eAckPlc1_NoACK          = 0x01,
+}ACK_POLICY,*PACK_POLICY;
+
+
+#define SET_WMM_QOS_INFO_FIELD(_pStart, _val)                                          WriteEF1Byte(_pStart, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart)             LE_BITS_TO_1BYTE(_pStart, 0, 4)
+#define SET_WMM_QOS_INFO_FIELD_PARAMETERSET_COUNT(_pStart, _val)       SET_BITS_TO_LE_1BYTE(_pStart, 0, 4, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart)                                       LE_BITS_TO_1BYTE(_pStart, 7, 1)
+#define SET_WMM_QOS_INFO_FIELD_AP_UAPSD(_pStart, _val)                         SET_BITS_TO_LE_1BYTE(_pStart, 7, 1, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart)                        LE_BITS_TO_1BYTE(_pStart, 0, 1)
+#define SET_WMM_QOS_INFO_FIELD_STA_AC_VO_UAPSD(_pStart, _val)          SET_BITS_TO_LE_1BYTE(_pStart, 0, 1, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart)                        LE_BITS_TO_1BYTE(_pStart, 1, 1)
+#define SET_WMM_QOS_INFO_FIELD_STA_AC_VI_UAPSD(_pStart, _val)          SET_BITS_TO_LE_1BYTE(_pStart, 1, 1, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart)                        LE_BITS_TO_1BYTE(_pStart, 2, 1)
+#define SET_WMM_QOS_INFO_FIELD_STA_AC_BE_UAPSD(_pStart, _val)          SET_BITS_TO_LE_1BYTE(_pStart, 2, 1, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart)                        LE_BITS_TO_1BYTE(_pStart, 3, 1)
+#define SET_WMM_QOS_INFO_FIELD_STA_AC_BK_UAPSD(_pStart, _val)          SET_BITS_TO_LE_1BYTE(_pStart, 3, 1, _val)
+
+#define GET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart)                 LE_BITS_TO_1BYTE(_pStart, 5, 2)
+#define SET_WMM_QOS_INFO_FIELD_STA_MAX_SP_LEN(_pStart, _val)           SET_BITS_TO_LE_1BYTE(_pStart, 5, 2, _val)
+
+typedef enum {
+       QOSIE_SRC_ADDTSREQ,
+       QOSIE_SRC_ADDTSRSP,
+       QOSIE_SRC_REASOCREQ,
+       QOSIE_SRC_REASOCRSP,
+       QOSIE_SRC_DELTS,
+} QOSIE_SOURCE;
+
+
+typedef u32 AC_CODING;
+#define AC0_BE 0
+#define AC1_BK 1
+#define AC2_VI 2
+#define AC3_VO 3
+#define AC_MAX 4
+
+
+#define AC_PARAM_SIZE  4
+
+#define GET_WMM_AC_PARAM_AIFSN(_pStart)                                ( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 4) )
+#define SET_WMM_AC_PARAM_AIFSN(_pStart, _val)          SET_BITS_TO_LE_4BYTE(_pStart, 0, 4, _val)
+
+#define GET_WMM_AC_PARAM_ACM(_pStart)                          ( (u8)LE_BITS_TO_4BYTE(_pStart, 4, 1) )
+#define SET_WMM_AC_PARAM_ACM(_pStart, _val)                    SET_BITS_TO_LE_4BYTE(_pStart, 4, 1, _val)
+
+#define GET_WMM_AC_PARAM_ACI(_pStart)                          ( (u8)LE_BITS_TO_4BYTE(_pStart, 5, 2) )
+#define SET_WMM_AC_PARAM_ACI(_pStart, _val)                    SET_BITS_TO_LE_4BYTE(_pStart, 5, 2, _val)
+
+#define GET_WMM_AC_PARAM_ACI_AIFSN(_pStart)                    ( (u8)LE_BITS_TO_4BYTE(_pStart, 0, 8) )
+#define SET_WMM_AC_PARAM_ACI_AIFSN(_pStart, _val)      SET_BITS_TO_LE_4BYTE(_pStart, 0, 8, _val)
+
+#define GET_WMM_AC_PARAM_ECWMIN(_pStart)                       ( (u8)LE_BITS_TO_4BYTE(_pStart, 8, 4) )
+#define SET_WMM_AC_PARAM_ECWMIN(_pStart, _val)         SET_BITS_TO_LE_4BYTE(_pStart, 8, 4, _val)
+
+#define GET_WMM_AC_PARAM_ECWMAX(_pStart)                       ( (u8)LE_BITS_TO_4BYTE(_pStart, 12, 4) )
+#define SET_WMM_AC_PARAM_ECWMAX(_pStart, _val)         SET_BITS_TO_LE_4BYTE(_pStart, 12, 4, _val)
+
+#define GET_WMM_AC_PARAM_TXOP_LIMIT(_pStart)           ( (u8)LE_BITS_TO_4BYTE(_pStart, 16, 16) )
+#define SET_WMM_AC_PARAM_TXOP_LIMIT(_pStart, _val)     SET_BITS_TO_LE_4BYTE(_pStart, 16, 16, _val)
+
+
+
+#define WMM_PARAM_ELEMENT_SIZE (8+(4*AC_PARAM_SIZE))
+
+typedef        enum _QOS_ELE_SUBTYPE{
+       QOSELE_TYPE_INFO                = 0x00,
+       QOSELE_TYPE_PARAM       = 0x01,
+}QOS_ELE_SUBTYPE,*PQOS_ELE_SUBTYPE;
+
+
+typedef        enum _DIRECTION_VALUE{
+       DIR_UP                  = 0,
+       DIR_DOWN                = 1,
+       DIR_DIRECT              = 2,
+       DIR_BI_DIR              = 3,
+}DIRECTION_VALUE,*PDIRECTION_VALUE;
+
+typedef        enum _ACM_METHOD{
+       eAcmWay0_SwAndHw                = 0,
+       eAcmWay1_HW                     = 1,
+       eAcmWay2_SW                     = 2,
+}ACM_METHOD,*PACM_METHOD;
+
+
+typedef struct _ACM{
+       u64             UsedTime;
+       u64             MediumTime;
+       u8              HwAcmCtl;
+}ACM, *PACM;
+
+
+
+typedef        u8              AC_UAPSD, *PAC_UAPSD;
+
+#define        GET_VO_UAPSD(_apsd) ((_apsd) & BIT0)
+#define        SET_VO_UAPSD(_apsd) ((_apsd) |= BIT0)
+
+#define        GET_VI_UAPSD(_apsd) ((_apsd) & BIT1)
+#define        SET_VI_UAPSD(_apsd) ((_apsd) |= BIT1)
+
+#define        GET_BK_UAPSD(_apsd) ((_apsd) & BIT2)
+#define        SET_BK_UAPSD(_apsd) ((_apsd) |= BIT2)
+
+#define        GET_BE_UAPSD(_apsd) ((_apsd) & BIT3)
+#define        SET_BE_UAPSD(_apsd) ((_apsd) |= BIT3)
+
+typedef union _QOS_TCLAS{
+
+       struct _TYPE_GENERAL{
+               u8              Priority;
+               u8              ClassifierType;
+               u8              Mask;
+       } TYPE_GENERAL;
+
+       struct _TYPE0_ETH{
+               u8              Priority;
+               u8              ClassifierType;
+               u8              Mask;
+               u8              SrcAddr[6];
+               u8              DstAddr[6];
+               u16             Type;
+       } TYPE0_ETH;
+
+       struct _TYPE1_IPV4{
+               u8              Priority;
+               u8              ClassifierType;
+               u8              Mask;
+               u8              Version;
+               u8              SrcIP[4];
+               u8              DstIP[4];
+               u16             SrcPort;
+               u16             DstPort;
+               u8              DSCP;
+               u8              Protocol;
+               u8              Reserved;
+       } TYPE1_IPV4;
+
+       struct _TYPE1_IPV6{
+               u8              Priority;
+               u8              ClassifierType;
+               u8              Mask;
+               u8              Version;
+               u8              SrcIP[16];
+               u8              DstIP[16];
+               u16             SrcPort;
+               u16             DstPort;
+               u8              FlowLabel[3];
+       } TYPE1_IPV6;
+
+       struct _TYPE2_8021Q{
+               u8              Priority;
+               u8              ClassifierType;
+               u8              Mask;
+               u16             TagType;
+       } TYPE2_8021Q;
+} QOS_TCLAS, *PQOS_TCLAS;
+
+typedef struct _QOS_TSTREAM{
+
+       bool                    bUsed;
+       u16                     MsduLifetime;
+       bool                    bEstablishing;
+       u8                      TimeSlotCount;
+       u8                      DialogToken;
+       WMM_TSPEC       TSpec;
+       WMM_TSPEC       OutStandingTSpec;
+       u8                      NominalPhyRate;
+} QOS_TSTREAM, *PQOS_TSTREAM;
+
+typedef struct _STA_QOS{
+       u8                              WMMIEBuf[MAX_WMMELE_LENGTH];
+       u8*                             WMMIE;
+
+       QOS_MODE                QosCapability;
+       QOS_MODE                CurrentQosMode;
+
+       AC_UAPSD                b4ac_Uapsd;
+       AC_UAPSD                Curr4acUapsd;
+       u8                              bInServicePeriod;
+       u8                              MaxSPLength;
+       int                             NumBcnBeforeTrigger;
+
+       u8 *                            pWMMInfoEle;
+       u8                              WMMParamEle[WMM_PARAM_ELEMENT_SIZE];
+
+       ACM                             acm[4];
+       ACM_METHOD              AcmMethod;
+
+       QOS_TSTREAM             StaTsArray[MAX_STA_TS_COUNT];
+       u8                              DialogToken;
+       WMM_TSPEC               TSpec;
+
+       u8                              QBssWirelessMode;
+
+       bool                            bNoAck;
+
+       bool                            bEnableRxImmBA;
+
+}STA_QOS, *PSTA_QOS;
+
+#define QBSS_LOAD_SIZE 5
+#define GET_QBSS_LOAD_STA_COUNT(__pStart)                                      ReadEF2Byte(__pStart)
+#define SET_QBSS_LOAD_STA_COUNT(__pStart, __Value)                     WriteEF2Byte(__pStart, __Value)
+#define GET_QBSS_LOAD_CHNL_UTILIZATION(__pStart)                       ReadEF1Byte((u8*)(__pStart) + 2)
+#define SET_QBSS_LOAD_CHNL_UTILIZATION(__pStart, __Value)              WriteEF1Byte((u8*)(__pStart) + 2, __Value)
+#define GET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart)                     ReadEF2Byte((u8*)(__pStart) + 3)
+#define SET_QBSS_LOAD_AVAILABLE_CAPACITY(__pStart, __Value)    WriteEF2Byte((u8*)(__pStart) + 3, __Value)
+
+typedef struct _BSS_QOS{
+
+       QOS_MODE                        bdQoSMode;
+       u8                                      bdWMMIEBuf[MAX_WMMELE_LENGTH];
+       OCTET_STRING                    bdWMMIE;
+
+       QOS_ELE_SUBTYPE         EleSubType;
+
+       u8*                                     pWMMInfoEle;
+       u8*                                     pWMMParamEle;
+
+       u8                                      QBssLoad[QBSS_LOAD_SIZE];
+       bool                                    bQBssLoadValid;
+}BSS_QOS, *PBSS_QOS;
+
+#define sQoSCtlLng     2
+#define QOS_CTRL_LEN(_QosMode)         ( (_QosMode > QOS_DISABLE)? sQoSCtlLng : 0 )
+
+
+#define IsACValid(ac)          ( ( ac>=0 && ac<=7 )? true : false )
+
+
+typedef        union _ACI_AIFSN{
+       u8      charData;
+
+       struct
+       {
+               u8      AIFSN:4;
+               u8      ACM:1;
+               u8      ACI:2;
+               u8      Reserved:1;
+       }f;
+}ACI_AIFSN, *PACI_AIFSN;
+
+typedef        union _ECW{
+       u8      charData;
+       struct
+       {
+               u8      ECWmin:4;
+               u8      ECWmax:4;
+       }f;
+}ECW, *PECW;
+
+typedef        union _AC_PARAM{
+       u32     longData;
+       u8      charData[4];
+
+       struct
+       {
+               ACI_AIFSN       AciAifsn;
+               ECW             Ecw;
+               u16             TXOPLimit;
+       }f;
+}AC_PARAM, *PAC_PARAM;
+
+
+
+
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl819x_TS.h b/drivers/staging/rtl8192e/rtl819x_TS.h
new file mode 100644 (file)
index 0000000..095edfd
--- /dev/null
@@ -0,0 +1,71 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _TSTYPE_H_
+#define _TSTYPE_H_
+#include "rtl819x_Qos.h"
+#define TS_SETUP_TIMEOUT       60
+#define TS_INACT_TIMEOUT       60
+#define TS_ADDBA_DELAY         60
+
+#define TOTAL_TS_NUM           16
+#define TCLAS_NUM              4
+
+typedef enum _TR_SELECT {
+       TX_DIR = 0,
+       RX_DIR = 1,
+} TR_SELECT, *PTR_SELECT;
+
+typedef struct _TS_COMMON_INFO{
+       struct list_head                List;
+       struct timer_list               SetupTimer;
+       struct timer_list               InactTimer;
+       u8                              Addr[6];
+       TSPEC_BODY                      TSpec;
+       QOS_TCLAS                       TClass[TCLAS_NUM];
+       u8                              TClasProc;
+       u8                              TClasNum;
+} TS_COMMON_INFO, *PTS_COMMON_INFO;
+
+typedef struct _TX_TS_RECORD{
+       TS_COMMON_INFO          TsCommonInfo;
+       u16                             TxCurSeq;
+       BA_RECORD                       TxPendingBARecord;
+       BA_RECORD                       TxAdmittedBARecord;
+       u8                              bAddBaReqInProgress;
+       u8                              bAddBaReqDelayed;
+       u8                              bUsingBa;
+       u8                              bDisable_AddBa;
+       struct timer_list               TsAddBaTimer;
+       u8                              num;
+} TX_TS_RECORD, *PTX_TS_RECORD;
+
+typedef struct _RX_TS_RECORD {
+       TS_COMMON_INFO          TsCommonInfo;
+       u16                             RxIndicateSeq;
+       u16                             RxTimeoutIndicateSeq;
+       struct list_head                RxPendingPktList;
+       struct timer_list               RxPktPendingTimer;
+       BA_RECORD                       RxAdmittedBARecord;
+       u16                             RxLastSeqNum;
+       u8                              RxLastFragNum;
+       u8                              num;
+} RX_TS_RECORD, *PRX_TS_RECORD;
+
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl819x_TSProc.c b/drivers/staging/rtl8192e/rtl819x_TSProc.c
new file mode 100644 (file)
index 0000000..0900bfa
--- /dev/null
@@ -0,0 +1,647 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtllib.h"
+#include <linux/etherdevice.h>
+#include "rtl819x_TS.h"
+extern void _setup_timer( struct timer_list*, void*, unsigned long);
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+#define list_for_each_entry_safe(pos, n, head, member) \
+       for (pos = list_entry((head)->next, typeof(*pos), member), \
+               n = list_entry(pos->member.next, typeof(*pos), member); \
+               &pos->member != (head); \
+               pos = n, n = list_entry(n->member.next, typeof(*n), member))
+#endif
+void TsSetupTimeOut(unsigned long data)
+{
+}
+
+void TsInactTimeout(unsigned long data)
+{
+}
+
+void RxPktPendingTimeout(unsigned long data)
+{
+       PRX_TS_RECORD   pRxTs = (PRX_TS_RECORD)data;
+       struct rtllib_device *ieee = container_of(pRxTs, struct rtllib_device, RxTsRecord[pRxTs->num]);
+
+       PRX_REORDER_ENTRY       pReorderEntry = NULL;
+
+       unsigned long flags = 0;
+       struct rtllib_rxb *stats_IndicateArray[REORDER_WIN_SIZE];
+       u8 index = 0;
+       bool bPktInBuf = false;
+
+       spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
+       if (pRxTs->RxTimeoutIndicateSeq != 0xffff)
+       {
+               while(!list_empty(&pRxTs->RxPendingPktList))
+               {
+                       pReorderEntry = (PRX_REORDER_ENTRY)list_entry(pRxTs->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
+                       if (index == 0)
+                               pRxTs->RxIndicateSeq = pReorderEntry->SeqNum;
+
+                       if ( SN_LESS(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq) ||
+                               SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq)   )
+                       {
+                               list_del_init(&pReorderEntry->List);
+
+                               if (SN_EQUAL(pReorderEntry->SeqNum, pRxTs->RxIndicateSeq))
+                                       pRxTs->RxIndicateSeq = (pRxTs->RxIndicateSeq + 1) % 4096;
+
+                               RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Indicate SeqNum: %d\n",__func__, pReorderEntry->SeqNum);
+                               stats_IndicateArray[index] = pReorderEntry->prxb;
+                               index++;
+
+                               list_add_tail(&pReorderEntry->List, &ieee->RxReorder_Unused_List);
+                       }
+                       else
+                       {
+                               bPktInBuf = true;
+                               break;
+                       }
+               }
+       }
+
+       if (index>0){
+               pRxTs->RxTimeoutIndicateSeq = 0xffff;
+
+               if (index > REORDER_WIN_SIZE){
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer buffer full!! \n");
+                       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
+                       return;
+               }
+               rtllib_indicate_packets(ieee, stats_IndicateArray, index);
+               bPktInBuf = false;
+       }
+
+       if (bPktInBuf && (pRxTs->RxTimeoutIndicateSeq==0xffff)){
+               pRxTs->RxTimeoutIndicateSeq = pRxTs->RxIndicateSeq;
+               mod_timer(&pRxTs->RxPktPendingTimer,  jiffies + MSECS(ieee->pHTInfo->RxReorderPendingTime));
+       }
+       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
+}
+
+void TsAddBaProcess(unsigned long data)
+{
+       PTX_TS_RECORD   pTxTs = (PTX_TS_RECORD)data;
+       u8 num = pTxTs->num;
+       struct rtllib_device *ieee = container_of(pTxTs, struct rtllib_device, TxTsRecord[num]);
+
+       TsInitAddBA(ieee, pTxTs, BA_POLICY_IMMEDIATE, false);
+       RTLLIB_DEBUG(RTLLIB_DL_BA, "TsAddBaProcess(): ADDBA Req is started!! \n");
+}
+
+
+void ResetTsCommonInfo(PTS_COMMON_INFO pTsCommonInfo)
+{
+       memset(pTsCommonInfo->Addr, 0, 6);
+       memset(&pTsCommonInfo->TSpec, 0, sizeof(TSPEC_BODY));
+       memset(&pTsCommonInfo->TClass, 0, sizeof(QOS_TCLAS)*TCLAS_NUM);
+       pTsCommonInfo->TClasProc = 0;
+       pTsCommonInfo->TClasNum = 0;
+}
+
+void ResetTxTsEntry(PTX_TS_RECORD pTS)
+{
+       ResetTsCommonInfo(&pTS->TsCommonInfo);
+       pTS->TxCurSeq = 0;
+       pTS->bAddBaReqInProgress = false;
+       pTS->bAddBaReqDelayed = false;
+       pTS->bUsingBa = false;
+       pTS->bDisable_AddBa = false;
+       ResetBaEntry(&pTS->TxAdmittedBARecord);
+       ResetBaEntry(&pTS->TxPendingBARecord);
+}
+
+void ResetRxTsEntry(PRX_TS_RECORD pTS)
+{
+       ResetTsCommonInfo(&pTS->TsCommonInfo);
+       pTS->RxIndicateSeq = 0xffff;
+       pTS->RxTimeoutIndicateSeq = 0xffff;
+       ResetBaEntry(&pTS->RxAdmittedBARecord);
+}
+#ifdef _RTL8192_EXT_PATCH_
+void ResetAdmitTRStream(struct rtllib_device *ieee, u8 *Addr)
+{
+       u8      dir;
+       bool                            search_dir[4] = {0, 0, 0, 0};
+       struct list_head*               psearch_list;
+       PTS_COMMON_INFO pRet = NULL;
+       PRX_TS_RECORD pRxTS = NULL;
+       PTX_TS_RECORD pTxTS = NULL;
+
+       if (ieee->iw_mode != IW_MODE_MESH)
+               return;
+
+       search_dir[DIR_DOWN]    = true;
+       psearch_list = &ieee->Rx_TS_Admit_List;
+       for (dir = 0; dir <= DIR_BI_DIR; dir++)
+       {
+               if (search_dir[dir] ==false )
+                       continue;
+               list_for_each_entry(pRet, psearch_list, List){
+                       if ((memcmp(pRet->Addr, Addr, 6) == 0) && (pRet->TSpec.f.TSInfo.field.ucDirection == dir))
+                       {
+                               pRxTS = (PRX_TS_RECORD)pRet;
+                               pRxTS->RxIndicateSeq = 0xffff;
+                               pRxTS->RxTimeoutIndicateSeq = 0xffff;
+                       }
+
+               }
+       }
+       search_dir[DIR_UP]      = true;
+       psearch_list = &ieee->Tx_TS_Admit_List;
+       for (dir = 0; dir <= DIR_BI_DIR; dir++)
+       {
+               if (search_dir[dir] ==false )
+                       continue;
+               list_for_each_entry(pRet, psearch_list, List){
+                       if ((memcmp(pRet->Addr, Addr, 6) == 0) && (pRet->TSpec.f.TSInfo.field.ucDirection == dir))
+                       {
+                               pTxTS = (PTX_TS_RECORD)pRet;
+                               pTxTS->TxCurSeq = 0xffff;
+                       }
+
+               }
+       }
+
+       return;
+}
+#endif
+
+void TSInitialize(struct rtllib_device *ieee)
+{
+       PTX_TS_RECORD           pTxTS  = ieee->TxTsRecord;
+       PRX_TS_RECORD           pRxTS  = ieee->RxTsRecord;
+       PRX_REORDER_ENTRY       pRxReorderEntry = ieee->RxReorderEntry;
+       u8                              count = 0;
+       RTLLIB_DEBUG(RTLLIB_DL_TS, "==========>%s()\n", __func__);
+       INIT_LIST_HEAD(&ieee->Tx_TS_Admit_List);
+       INIT_LIST_HEAD(&ieee->Tx_TS_Pending_List);
+       INIT_LIST_HEAD(&ieee->Tx_TS_Unused_List);
+
+       for (count = 0; count < TOTAL_TS_NUM; count++)
+       {
+               pTxTS->num = count;
+               _setup_timer(&pTxTS->TsCommonInfo.SetupTimer,
+                           TsSetupTimeOut,
+                           (unsigned long) pTxTS);
+
+               _setup_timer(&pTxTS->TsCommonInfo.InactTimer,
+                           TsInactTimeout,
+                           (unsigned long) pTxTS);
+
+               _setup_timer(&pTxTS->TsAddBaTimer,
+                           TsAddBaProcess,
+                           (unsigned long) pTxTS);
+
+               _setup_timer(&pTxTS->TxPendingBARecord.Timer,
+                           BaSetupTimeOut,
+                           (unsigned long) pTxTS);
+               _setup_timer(&pTxTS->TxAdmittedBARecord.Timer,
+                           TxBaInactTimeout,
+                           (unsigned long) pTxTS);
+
+               ResetTxTsEntry(pTxTS);
+               list_add_tail(&pTxTS->TsCommonInfo.List,
+                               &ieee->Tx_TS_Unused_List);
+               pTxTS++;
+       }
+
+       INIT_LIST_HEAD(&ieee->Rx_TS_Admit_List);
+       INIT_LIST_HEAD(&ieee->Rx_TS_Pending_List);
+       INIT_LIST_HEAD(&ieee->Rx_TS_Unused_List);
+       for (count = 0; count < TOTAL_TS_NUM; count++)
+       {
+               pRxTS->num = count;
+               INIT_LIST_HEAD(&pRxTS->RxPendingPktList);
+
+               _setup_timer(&pRxTS->TsCommonInfo.SetupTimer,
+                           TsSetupTimeOut,
+                           (unsigned long) pRxTS);
+
+               _setup_timer(&pRxTS->TsCommonInfo.InactTimer,
+                           TsInactTimeout,
+                           (unsigned long) pRxTS);
+
+               _setup_timer(&pRxTS->RxAdmittedBARecord.Timer,
+                           RxBaInactTimeout,
+                           (unsigned long) pRxTS);
+
+               _setup_timer(&pRxTS->RxPktPendingTimer,
+                           RxPktPendingTimeout,
+                           (unsigned long) pRxTS);
+
+               ResetRxTsEntry(pRxTS);
+               list_add_tail(&pRxTS->TsCommonInfo.List, &ieee->Rx_TS_Unused_List);
+               pRxTS++;
+       }
+       INIT_LIST_HEAD(&ieee->RxReorder_Unused_List);
+       for (count = 0; count < REORDER_ENTRY_NUM; count++)
+       {
+               list_add_tail( &pRxReorderEntry->List,&ieee->RxReorder_Unused_List);
+               if (count == (REORDER_ENTRY_NUM-1))
+                       break;
+               pRxReorderEntry = &ieee->RxReorderEntry[count+1];
+       }
+
+}
+
+void AdmitTS(struct rtllib_device *ieee, PTS_COMMON_INFO pTsCommonInfo, u32 InactTime)
+{
+       del_timer_sync(&pTsCommonInfo->SetupTimer);
+       del_timer_sync(&pTsCommonInfo->InactTimer);
+
+       if (InactTime!=0)
+               mod_timer(&pTsCommonInfo->InactTimer, jiffies + MSECS(InactTime));
+}
+
+
+PTS_COMMON_INFO SearchAdmitTRStream(struct rtllib_device *ieee, u8*    Addr, u8 TID, TR_SELECT TxRxSelect)
+{
+       u8      dir;
+       bool                            search_dir[4] = {0, 0, 0, 0};
+       struct list_head*               psearch_list;
+       PTS_COMMON_INFO pRet = NULL;
+       if (ieee->iw_mode == IW_MODE_MASTER)
+       {
+               if (TxRxSelect == TX_DIR)
+               {
+                       search_dir[DIR_DOWN] = true;
+                       search_dir[DIR_BI_DIR]= true;
+               }
+               else
+               {
+                       search_dir[DIR_UP]      = true;
+                       search_dir[DIR_BI_DIR]= true;
+               }
+       }
+       else if (ieee->iw_mode == IW_MODE_ADHOC)
+       {
+               if (TxRxSelect == TX_DIR)
+                       search_dir[DIR_UP]      = true;
+               else
+                       search_dir[DIR_DOWN] = true;
+       }
+       else
+       {
+               if (TxRxSelect == TX_DIR)
+               {
+                       search_dir[DIR_UP]      = true;
+                       search_dir[DIR_BI_DIR]= true;
+                       search_dir[DIR_DIRECT]= true;
+               }
+               else
+               {
+                       search_dir[DIR_DOWN] = true;
+                       search_dir[DIR_BI_DIR]= true;
+                       search_dir[DIR_DIRECT]= true;
+               }
+       }
+
+       if (TxRxSelect == TX_DIR)
+               psearch_list = &ieee->Tx_TS_Admit_List;
+       else
+               psearch_list = &ieee->Rx_TS_Admit_List;
+
+       for (dir = 0; dir <= DIR_BI_DIR; dir++)
+       {
+               if (search_dir[dir] ==false )
+                       continue;
+               list_for_each_entry(pRet, psearch_list, List){
+                       if (memcmp(pRet->Addr, Addr, 6) == 0)
+                               if (pRet->TSpec.f.TSInfo.field.ucTSID == TID)
+                                       if (pRet->TSpec.f.TSInfo.field.ucDirection == dir)
+                                       {
+                                               break;
+                                       }
+
+               }
+               if (&pRet->List  != psearch_list)
+                       break;
+       }
+
+       if (&pRet->List  != psearch_list){
+               return pRet ;
+       }
+       else
+               return NULL;
+}
+
+void MakeTSEntry(
+               PTS_COMMON_INFO pTsCommonInfo,
+               u8*             Addr,
+               PTSPEC_BODY     pTSPEC,
+               PQOS_TCLAS      pTCLAS,
+               u8              TCLAS_Num,
+               u8              TCLAS_Proc
+       )
+{
+       u8      count;
+
+       if (pTsCommonInfo == NULL)
+               return;
+
+       memcpy(pTsCommonInfo->Addr, Addr, 6);
+
+       if (pTSPEC != NULL)
+               memcpy((u8*)(&(pTsCommonInfo->TSpec)), (u8*)pTSPEC, sizeof(TSPEC_BODY));
+
+       for (count = 0; count < TCLAS_Num; count++)
+               memcpy((u8*)(&(pTsCommonInfo->TClass[count])), (u8*)pTCLAS, sizeof(QOS_TCLAS));
+
+       pTsCommonInfo->TClasProc = TCLAS_Proc;
+       pTsCommonInfo->TClasNum = TCLAS_Num;
+}
+
+#ifdef _RTL8192_EXT_PATCH_
+void dump_ts_list(struct list_head * ts_list)
+{
+       PTS_COMMON_INFO pRet = NULL;
+       u8 i=0;
+       list_for_each_entry(pRet, ts_list, List){
+               printk("i=%d ADD:"MAC_FMT", TID:%d, dir:%d\n",i,MAC_ARG(pRet->Addr), pRet->TSpec.f.TSInfo.field.ucTSID, pRet->TSpec.f.TSInfo.field.ucDirection);
+               i++;
+       }
+
+}
+#endif
+
+bool GetTs(
+       struct rtllib_device*   ieee,
+       PTS_COMMON_INFO                 *ppTS,
+       u8*                             Addr,
+       u8                              TID,
+       TR_SELECT                       TxRxSelect,
+       bool                            bAddNewTs)
+{
+       u8      UP = 0;
+       if (is_broadcast_ether_addr(Addr) || is_multicast_ether_addr(Addr))
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! get TS for Broadcast or Multicast\n");
+               return false;
+       }
+       if (ieee->current_network.qos_data.supported == 0) {
+               UP = 0;
+       } else {
+               if (!IsACValid(TID)) {
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR! in %s(), TID(%d) is not valid\n", __func__, TID);
+                       return false;
+               }
+
+               switch (TID) {
+               case 0:
+               case 3:
+                       UP = 0;
+                       break;
+               case 1:
+               case 2:
+                       UP = 2;
+                       break;
+               case 4:
+               case 5:
+                       UP = 5;
+                       break;
+               case 6:
+               case 7:
+                       UP = 7;
+                       break;
+               }
+       }
+
+       *ppTS = SearchAdmitTRStream(
+                       ieee,
+                       Addr,
+                       UP,
+                       TxRxSelect);
+       if (*ppTS != NULL)
+       {
+               return true;
+       }
+       else
+       {
+               if (bAddNewTs == false)
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_TS, "add new TS failed(tid:%d)\n", UP);
+                       return false;
+               }
+               else
+               {
+                       TSPEC_BODY      TSpec;
+                       PQOS_TSINFO             pTSInfo = &TSpec.f.TSInfo;
+                       struct list_head*       pUnusedList =
+                                                               (TxRxSelect == TX_DIR)?
+                                                               (&ieee->Tx_TS_Unused_List):
+                                                               (&ieee->Rx_TS_Unused_List);
+
+                       struct list_head*       pAddmitList =
+                                                               (TxRxSelect == TX_DIR)?
+                                                               (&ieee->Tx_TS_Admit_List):
+                                                               (&ieee->Rx_TS_Admit_List);
+
+                       DIRECTION_VALUE         Dir =           (ieee->iw_mode == IW_MODE_MASTER)?
+                                                               ((TxRxSelect==TX_DIR)?DIR_DOWN:DIR_UP):
+                                                               ((TxRxSelect==TX_DIR)?DIR_UP:DIR_DOWN);
+                       RTLLIB_DEBUG(RTLLIB_DL_TS, "to add Ts\n");
+                       if (!list_empty(pUnusedList))
+                       {
+                               (*ppTS) = list_entry(pUnusedList->next, TS_COMMON_INFO, List);
+                               list_del_init(&(*ppTS)->List);
+                               if (TxRxSelect==TX_DIR)
+                               {
+                                       PTX_TS_RECORD tmp = container_of(*ppTS, TX_TS_RECORD, TsCommonInfo);
+                                       ResetTxTsEntry(tmp);
+                               }
+                               else{
+                                       PRX_TS_RECORD tmp = container_of(*ppTS, RX_TS_RECORD, TsCommonInfo);
+                                       ResetRxTsEntry(tmp);
+                               }
+
+                               RTLLIB_DEBUG(RTLLIB_DL_TS, "to init current TS, UP:%d, Dir:%d, addr:"MAC_FMT" ppTs=%p\n", UP, Dir, MAC_ARG(Addr), *ppTS);
+                               pTSInfo->field.ucTrafficType = 0;
+                               pTSInfo->field.ucTSID = UP;
+                               pTSInfo->field.ucDirection = Dir;
+                               pTSInfo->field.ucAccessPolicy = 1;
+                               pTSInfo->field.ucAggregation = 0;
+                               pTSInfo->field.ucPSB = 0;
+                               pTSInfo->field.ucUP = UP;
+                               pTSInfo->field.ucTSInfoAckPolicy = 0;
+                               pTSInfo->field.ucSchedule = 0;
+
+                               MakeTSEntry(*ppTS, Addr, &TSpec, NULL, 0, 0);
+                               AdmitTS(ieee, *ppTS, 0);
+                               list_add_tail(&((*ppTS)->List), pAddmitList);
+
+                               return true;
+                       }
+                       else
+                       {
+                               RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!in function %s() There is not enough dir=%d(0=up down=1) TS record to be used!!", __func__,Dir);
+                               return false;
+                       }
+               }
+       }
+}
+
+void RemoveTsEntry(
+       struct rtllib_device*   ieee,
+       PTS_COMMON_INFO                 pTs,
+       TR_SELECT                       TxRxSelect
+       )
+{
+       del_timer_sync(&pTs->SetupTimer);
+       del_timer_sync(&pTs->InactTimer);
+       TsInitDelBA(ieee, pTs, TxRxSelect);
+
+       if (TxRxSelect == RX_DIR)
+       {
+               PRX_REORDER_ENTRY       pRxReorderEntry;
+               PRX_TS_RECORD           pRxTS = (PRX_TS_RECORD)pTs;
+
+               if (timer_pending(&pRxTS->RxPktPendingTimer))
+                       del_timer_sync(&pRxTS->RxPktPendingTimer);
+
+               while(!list_empty(&pRxTS->RxPendingPktList)){
+                       pRxReorderEntry = (PRX_REORDER_ENTRY)list_entry(pRxTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
+                       RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Delete SeqNum %d!\n",__func__, pRxReorderEntry->SeqNum);
+                       list_del_init(&pRxReorderEntry->List);
+                       {
+                               int i = 0;
+                               struct rtllib_rxb * prxb = pRxReorderEntry->prxb;
+                               if (unlikely(!prxb)){
+                                       return;
+                               }
+                               for (i =0; i < prxb->nr_subframes; i++) {
+                                       dev_kfree_skb(prxb->subframes[i]);
+                               }
+                               kfree(prxb);
+                               prxb = NULL;
+                       }
+                       list_add_tail(&pRxReorderEntry->List,&ieee->RxReorder_Unused_List);
+               }
+       }
+       else{
+               PTX_TS_RECORD pTxTS = (PTX_TS_RECORD)pTs;
+               del_timer_sync(&pTxTS->TsAddBaTimer);
+       }
+}
+
+void RemovePeerTS(struct rtllib_device* ieee, u8* Addr)
+{
+       PTS_COMMON_INFO pTS, pTmpTS;
+       printk("===========>RemovePeerTS,"MAC_FMT"\n", MAC_ARG(Addr));
+#if 1
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List)
+       {
+               if (memcmp(pTS->Addr, Addr, 6) == 0)
+               {
+                       RemoveTsEntry(ieee, pTS, TX_DIR);
+                       list_del_init(&pTS->List);
+                       list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
+               }
+       }
+
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List)
+       {
+               if (memcmp(pTS->Addr, Addr, 6) == 0)
+               {
+                       printk("====>remove Tx_TS_admin_list\n");
+                       RemoveTsEntry(ieee, pTS, TX_DIR);
+                       list_del_init(&pTS->List);
+                       list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
+               }
+       }
+
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List)
+       {
+               if (memcmp(pTS->Addr, Addr, 6) == 0)
+               {
+                       RemoveTsEntry(ieee, pTS, RX_DIR);
+                       list_del_init(&pTS->List);
+                       list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
+               }
+       }
+
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List)
+       {
+               if (memcmp(pTS->Addr, Addr, 6) == 0)
+               {
+                       RemoveTsEntry(ieee, pTS, RX_DIR);
+                       list_del_init(&pTS->List);
+                       list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
+               }
+       }
+#endif
+}
+
+void RemoveAllTS(struct rtllib_device* ieee)
+{
+       PTS_COMMON_INFO pTS, pTmpTS;
+#if 1
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Pending_List, List)
+       {
+               RemoveTsEntry(ieee, pTS, TX_DIR);
+               list_del_init(&pTS->List);
+               list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
+       }
+
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Tx_TS_Admit_List, List)
+       {
+               RemoveTsEntry(ieee, pTS, TX_DIR);
+               list_del_init(&pTS->List);
+               list_add_tail(&pTS->List, &ieee->Tx_TS_Unused_List);
+       }
+
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Pending_List, List)
+       {
+               RemoveTsEntry(ieee, pTS, RX_DIR);
+               list_del_init(&pTS->List);
+               list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
+       }
+
+       list_for_each_entry_safe(pTS, pTmpTS, &ieee->Rx_TS_Admit_List, List)
+       {
+               RemoveTsEntry(ieee, pTS, RX_DIR);
+               list_del_init(&pTS->List);
+               list_add_tail(&pTS->List, &ieee->Rx_TS_Unused_List);
+       }
+#endif
+}
+
+void TsStartAddBaProcess(struct rtllib_device* ieee, PTX_TS_RECORD     pTxTS)
+{
+       if (pTxTS->bAddBaReqInProgress == false)
+       {
+               pTxTS->bAddBaReqInProgress = true;
+#if 1
+               if (pTxTS->bAddBaReqDelayed)
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_BA, "TsStartAddBaProcess(): Delayed Start ADDBA after 60 sec!!\n");
+                       mod_timer(&pTxTS->TsAddBaTimer, jiffies + MSECS(TS_ADDBA_DELAY));
+               }
+               else
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_BA,"TsStartAddBaProcess(): Immediately Start ADDBA now!!\n");
+                       mod_timer(&pTxTS->TsAddBaTimer, jiffies+10);
+               }
+#endif
+       }
+       else
+               RTLLIB_DEBUG(RTLLIB_DL_BA, "%s()==>BA timer is already added\n", __func__);
+}
diff --git a/drivers/staging/rtl8192e/rtl_cam.c b/drivers/staging/rtl8192e/rtl_cam.c
new file mode 100644 (file)
index 0000000..c2d51bc
--- /dev/null
@@ -0,0 +1,379 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtl_core.h"
+#include "r8192E_phy.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h" /* RTL8225 Radio frontend */
+#include "r8192E_cmdpkt.h"
+
+extern int hwwep;
+void CamResetAllEntry(struct net_device *dev)
+{
+       u32 ulcommand = 0;
+
+       ulcommand |= BIT31|BIT30;
+       write_nic_dword(dev, RWCAM, ulcommand);
+}
+
+void write_cam(struct net_device *dev, u8 addr, u32 data)
+{
+       write_nic_dword(dev, WCAMI, data);
+       write_nic_dword(dev, RWCAM, BIT31|BIT16|(addr&0xff) );
+}
+
+u32 read_cam(struct net_device *dev, u8 addr)
+{
+       write_nic_dword(dev, RWCAM, 0x80000000|(addr&0xff) );
+       return read_nic_dword(dev, 0xa8);
+}
+
+void EnableHWSecurityConfig8192(struct net_device *dev)
+{
+       u8 SECR_value = 0x0;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+       SECR_value = SCR_TxEncEnable | SCR_RxDecEnable;
+       if (((KEY_TYPE_WEP40 == ieee->pairwise_key_type) || (KEY_TYPE_WEP104 == ieee->pairwise_key_type)) && (priv->rtllib->auth_mode != 2))
+       {
+               SECR_value |= SCR_RxUseDK;
+               SECR_value |= SCR_TxUseDK;
+       }
+       else if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->pairwise_key_type & (KEY_TYPE_CCMP | KEY_TYPE_TKIP)))
+       {
+               SECR_value |= SCR_RxUseDK;
+               SECR_value |= SCR_TxUseDK;
+       }
+
+
+       ieee->hwsec_active = 1;
+       if ((ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE) || !hwwep)
+       {
+               ieee->hwsec_active = 0;
+               SECR_value &= ~SCR_RxDecEnable;
+       }
+
+       RT_TRACE(COMP_SEC,"%s:, hwsec:%d, pairwise_key:%d, SECR_value:%x\n", __func__, \
+                       ieee->hwsec_active, ieee->pairwise_key_type, SECR_value);
+       {
+               write_nic_byte(dev, SECR,  SECR_value);
+       }
+}
+
+void set_swcam(struct net_device *dev,
+               u8 EntryNo,
+               u8 KeyIndex,
+               u16 KeyType,
+               u8 *MacAddr,
+               u8 DefaultKey,
+               u32 *KeyContent,
+               u8 is_mesh)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device *ieee = priv->rtllib;
+       RT_TRACE(COMP_DBG, "===========>%s():EntryNo is %d,KeyIndex is "
+                "%d,KeyType is %d,is_mesh is %d\n", __func__, EntryNo,
+                KeyIndex, KeyType, is_mesh);
+       if (is_mesh){
+       } else {
+               ieee->swcamtable[EntryNo].bused=true;
+               ieee->swcamtable[EntryNo].key_index=KeyIndex;
+               ieee->swcamtable[EntryNo].key_type=KeyType;
+               memcpy(ieee->swcamtable[EntryNo].macaddr,MacAddr,6);
+               ieee->swcamtable[EntryNo].useDK=DefaultKey;
+               memcpy(ieee->swcamtable[EntryNo].key_buf,(u8*)KeyContent,16);
+       }
+}
+
+void setKey(struct net_device *dev,
+               u8 EntryNo,
+               u8 KeyIndex,
+               u16 KeyType,
+               u8 *MacAddr,
+               u8 DefaultKey,
+               u32 *KeyContent )
+{
+       u32 TargetCommand = 0;
+       u32 TargetContent = 0;
+       u16 usConfig = 0;
+       u8 i;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       RT_RF_POWER_STATE       rtState;
+       rtState = priv->rtllib->eRFPowerState;
+       if (priv->rtllib->PowerSaveControl.bInactivePs){
+               if (rtState == eRfOff){
+                       if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
+                       {
+                               RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__func__);
+                               return ;
+                       }
+                       else{
+                               down(&priv->rtllib->ips_sem);
+                               IPSLeave(dev);
+                               up(&priv->rtllib->ips_sem);                     }
+               }
+       }
+       priv->rtllib->is_set_key = true;
+       if (EntryNo >= TOTAL_CAM_ENTRY)
+               RT_TRACE(COMP_ERR, "cam entry exceeds in setKey()\n");
+
+       RT_TRACE(COMP_SEC, "====>to setKey(), dev:%p, EntryNo:%d, KeyIndex:%d,"
+                "KeyType:%d, MacAddr"MAC_FMT"\n", dev,EntryNo, KeyIndex,
+                KeyType, MAC_ARG(MacAddr));
+
+       if (DefaultKey)
+               usConfig |= BIT15 | (KeyType<<2);
+       else
+               usConfig |= BIT15 | (KeyType<<2) | KeyIndex;
+
+
+       for (i = 0; i < CAM_CONTENT_COUNT; i++) {
+               TargetCommand  = i+CAM_CONTENT_COUNT*EntryNo;
+               TargetCommand |= BIT31|BIT16;
+
+               if (i == 0) {
+                       TargetContent = (u32)(*(MacAddr+0)) << 16|
+                               (u32)(*(MacAddr+1)) << 24|
+                               (u32)usConfig;
+
+                       write_nic_dword(dev, WCAMI, TargetContent);
+                       write_nic_dword(dev, RWCAM, TargetCommand);
+               } else if (i == 1) {
+                       TargetContent = (u32)(*(MacAddr+2))      |
+                               (u32)(*(MacAddr+3)) <<  8|
+                               (u32)(*(MacAddr+4)) << 16|
+                               (u32)(*(MacAddr+5)) << 24;
+                       write_nic_dword(dev, WCAMI, TargetContent);
+                       write_nic_dword(dev, RWCAM, TargetCommand);
+               } else {
+                       if (KeyContent != NULL) {
+                               write_nic_dword(dev, WCAMI, (u32)(*(KeyContent+i-2)) );
+                               write_nic_dword(dev, RWCAM, TargetCommand);
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,31))
+                               udelay(100);
+#endif
+                       }
+               }
+       }
+       RT_TRACE(COMP_SEC,"=========>after set key, usconfig:%x\n", usConfig);
+}
+
+void CAM_read_entry(struct net_device *dev, u32 iIndex)
+{
+       u32 target_command=0;
+       u32 target_content=0;
+       u8 entry_i=0;
+       u32 ulStatus;
+       s32 i=100;
+       for (entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
+       {
+               target_command= entry_i+CAM_CONTENT_COUNT*iIndex;
+               target_command= target_command | BIT31;
+
+               while((i--)>=0)
+               {
+                       ulStatus = read_nic_dword(dev, RWCAM);
+                       if (ulStatus & BIT31){
+                               continue;
+                       }
+                       else{
+                               break;
+                       }
+               }
+               write_nic_dword(dev, RWCAM, target_command);
+               RT_TRACE(COMP_SEC,"CAM_read_entry(): WRITE A0: %x \n",target_command);
+               target_content = read_nic_dword(dev, RCAMO);
+               RT_TRACE(COMP_SEC, "CAM_read_entry(): WRITE A8: %x \n",target_content);
+       }
+       printk("\n");
+}
+
+void CamRestoreAllEntry(       struct net_device *dev)
+{
+       u8 EntryId = 0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8*     MacAddr = priv->rtllib->current_network.bssid;
+
+       static u8       CAM_CONST_ADDR[4][6] = {
+               {0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
+               {0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
+               {0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
+               {0x00, 0x00, 0x00, 0x00, 0x00, 0x03}};
+       static u8       CAM_CONST_BROAD[] =
+       {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
+
+       RT_TRACE(COMP_SEC, "CamRestoreAllEntry: \n");
+
+
+       if ((priv->rtllib->pairwise_key_type == KEY_TYPE_WEP40)||
+                       (priv->rtllib->pairwise_key_type == KEY_TYPE_WEP104))
+       {
+
+               for (EntryId=0; EntryId<4; EntryId++)
+               {
+                       {
+                               MacAddr = CAM_CONST_ADDR[EntryId];
+                               if (priv->rtllib->swcamtable[EntryId].bused )
+                               {
+                                       setKey(dev,
+                                                       EntryId ,
+                                                       EntryId,
+                                                       priv->rtllib->pairwise_key_type,
+                                                       MacAddr,
+                                                       0,
+                                                       (u32*)(&priv->rtllib->swcamtable[EntryId].key_buf[0])
+                                             );
+                               }
+                       }
+               }
+
+       }
+       else if (priv->rtllib->pairwise_key_type == KEY_TYPE_TKIP)
+       {
+
+               {
+                       if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
+                       {
+                               setKey(dev,
+                                               4,
+                                               0,
+                                               priv->rtllib->pairwise_key_type,
+                                               (u8*)dev->dev_addr,
+                                               0,
+                                               (u32*)(&priv->rtllib->swcamtable[4].key_buf[0])
+                                     );
+                       }
+                       else
+                       {
+                               setKey(dev,
+                                               4,
+                                               0,
+                                               priv->rtllib->pairwise_key_type,
+                                               MacAddr,
+                                               0,
+                                               (u32*)(&priv->rtllib->swcamtable[4].key_buf[0])
+                                     );
+                       }
+
+               }
+       }
+       else if (priv->rtllib->pairwise_key_type == KEY_TYPE_CCMP)
+       {
+
+               {
+                       if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
+                       {
+                               setKey(dev,
+                                               4,
+                                               0,
+                                               priv->rtllib->pairwise_key_type,
+                                               (u8*)dev->dev_addr,
+                                               0,
+                                               (u32*)(&priv->rtllib->swcamtable[4].key_buf[0])
+                                     );
+                       }
+                       else
+                       {
+                               setKey(dev,
+                                               4,
+                                               0,
+                                               priv->rtllib->pairwise_key_type,
+                                               MacAddr,
+                                               0,
+                                               (u32*)(&priv->rtllib->swcamtable[4].key_buf[0])
+                                     );
+                       }
+               }
+       }
+
+
+
+       if (priv->rtllib->group_key_type == KEY_TYPE_TKIP)
+       {
+               MacAddr = CAM_CONST_BROAD;
+               for (EntryId=1 ; EntryId<4 ; EntryId++)
+               {
+                       if (priv->rtllib->swcamtable[EntryId].bused )
+                       {
+                               setKey(dev,
+                                               EntryId,
+                                               EntryId,
+                                               priv->rtllib->group_key_type,
+                                               MacAddr,
+                                               0,
+                                               (u32*)(&priv->rtllib->swcamtable[EntryId].key_buf[0])
+                                     );
+                       }
+               }
+               if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
+               {
+                       if (priv->rtllib->swcamtable[0].bused ){
+                               setKey(dev,
+                                               0,
+                                               0,
+                                               priv->rtllib->group_key_type,
+                                               CAM_CONST_ADDR[0],
+                                               0,
+                                               (u32*)(&priv->rtllib->swcamtable[0].key_buf[0])
+                                     );
+                       }
+                       else
+                       {
+                               RT_TRACE(COMP_ERR,"===>%s():ERR!! ADHOC TKIP ,but 0 entry is have no data\n",__func__);
+                               return;
+                       }
+               }
+       } else if (priv->rtllib->group_key_type == KEY_TYPE_CCMP) {
+               MacAddr = CAM_CONST_BROAD;
+               for (EntryId=1; EntryId<4 ; EntryId++)
+               {
+                       if (priv->rtllib->swcamtable[EntryId].bused )
+                       {
+                               setKey(dev,
+                                      EntryId ,
+                                      EntryId,
+                                      priv->rtllib->group_key_type,
+                                      MacAddr,
+                                      0,
+                                      (u32*)(&priv->rtllib->swcamtable[EntryId].key_buf[0]));
+                       }
+               }
+
+               if (priv->rtllib->iw_mode == IW_MODE_ADHOC) {
+                       if (priv->rtllib->swcamtable[0].bused) {
+                               setKey(dev,
+                                       0 ,
+                                       0,
+                                       priv->rtllib->group_key_type,
+                                       CAM_CONST_ADDR[0],
+                                       0,
+                                       (u32*)(&priv->rtllib->swcamtable[0].key_buf[0]));
+                       } else {
+                               RT_TRACE(COMP_ERR,"===>%s():ERR!! ADHOC CCMP ,but 0 entry is have no data\n",
+                                               __func__);
+                               return;
+                       }
+               }
+       }
+}
diff --git a/drivers/staging/rtl8192e/rtl_cam.h b/drivers/staging/rtl8192e/rtl_cam.h
new file mode 100644 (file)
index 0000000..9e4d0ed
--- /dev/null
@@ -0,0 +1,44 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _RTL_CAM_H
+#define _RTL_CAM_H
+
+#include <linux/types.h>
+struct net_device;
+
+void CamResetAllEntry(struct net_device* dev);
+void EnableHWSecurityConfig8192(struct net_device *dev);
+void setKey(struct net_device *dev, u8 EntryNo, u8 KeyIndex, u16 KeyType, u8 *MacAddr, u8 DefaultKey, u32 *KeyContent );
+void set_swcam(struct net_device *dev, u8 EntryNo, u8 KeyIndex, u16 KeyType, u8 *MacAddr, u8 DefaultKey, u32 *KeyContent, u8 is_mesh);
+void CamPrintDbgReg(struct net_device* dev);
+
+u32 read_cam(struct net_device *dev, u8 addr);
+void write_cam(struct net_device *dev, u8 addr, u32 data);
+
+void CamRestoreAllEntry(struct net_device *dev);
+
+void CAM_read_entry(struct net_device *dev, u32 iIndex);
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_core.c b/drivers/staging/rtl8192e/rtl_core.c
new file mode 100644 (file)
index 0000000..81cb13f
--- /dev/null
@@ -0,0 +1,4084 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#undef LOOP_TEST
+#undef RX_DONT_PASS_UL
+#undef DEBUG_EPROM
+#undef DEBUG_RX_VERBOSE
+#undef DUMMY_RX
+#undef DEBUG_ZERO_RX
+#undef DEBUG_RX_SKB
+#undef DEBUG_TX_FRAG
+#undef DEBUG_RX_FRAG
+#undef DEBUG_TX_FILLDESC
+#undef DEBUG_TX
+#undef DEBUG_IRQ
+#undef DEBUG_RX
+#undef DEBUG_RXALLOC
+#undef DEBUG_REGISTERS
+#undef DEBUG_RING
+#undef DEBUG_IRQ_TASKLET
+#undef DEBUG_TX_ALLOC
+#undef DEBUG_TX_DESC
+
+#include <asm/uaccess.h>
+#include <linux/pci.h>
+#include "rtl_core.h"
+#include "r8192E_phy.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h"
+#include "r8192E_cmdpkt.h"
+
+#include "rtl_wx.h"
+#ifndef RTL8192CE
+#include "rtl_dm.h"
+#endif
+
+#ifdef CONFIG_PM_RTL
+#include "rtl_pm.h"
+#endif
+
+int hwwep = 1;
+static int channels = 0x3fff;
+char* ifname = "wlan%d";
+
+
+struct rtl819x_ops rtl819xp_ops = {
+       .nic_type                                       = NIC_8192E,
+       .get_eeprom_size                        = rtl8192_get_eeprom_size,
+       .init_adapter_variable          = rtl8192_InitializeVariables,
+       .initialize_adapter                     = rtl8192_adapter_start,
+       .link_change                            = rtl8192_link_change,
+       .tx_fill_descriptor                     = rtl8192_tx_fill_desc,
+       .tx_fill_cmd_descriptor                 = rtl8192_tx_fill_cmd_desc,
+       .rx_query_status_descriptor     = rtl8192_rx_query_status_desc,
+       .rx_command_packet_handler = NULL,
+       .stop_adapter                           = rtl8192_halt_adapter,
+       .update_ratr_table                      = rtl8192_update_ratr_table,
+       .irq_enable                             = rtl8192_EnableInterrupt,
+       .irq_disable                            = rtl8192_DisableInterrupt,
+       .irq_clear                                      = rtl8192_ClearInterrupt,
+       .rx_enable                              = rtl8192_enable_rx,
+       .tx_enable                              = rtl8192_enable_tx,
+       .interrupt_recognized           = rtl8192_interrupt_recognized,
+       .TxCheckStuckHandler            = rtl8192_HalTxCheckStuck,
+       .RxCheckStuckHandler            = rtl8192_HalRxCheckStuck,
+};
+
+static struct pci_device_id rtl8192_pci_id_tbl[] __devinitdata = {
+       {RTL_PCI_DEVICE(0x10ec, 0x8192, rtl819xp_ops)},
+       {RTL_PCI_DEVICE(0x07aa, 0x0044, rtl819xp_ops)},
+       {RTL_PCI_DEVICE(0x07aa, 0x0047, rtl819xp_ops)},
+       {}
+};
+
+MODULE_DEVICE_TABLE(pci, rtl8192_pci_id_tbl);
+
+static int __devinit rtl8192_pci_probe(struct pci_dev *pdev,
+                        const struct pci_device_id *id);
+static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev);
+
+static struct pci_driver rtl8192_pci_driver = {
+       .name           = DRV_NAME,               /* Driver name   */
+       .id_table       = rtl8192_pci_id_tbl,             /* PCI_ID table  */
+       .probe          = rtl8192_pci_probe,              /* probe fn      */
+       .remove         = __devexit_p(rtl8192_pci_disconnect),    /* remove fn     */
+       .suspend        = rtl8192E_suspend,               /* PM suspend fn */
+       .resume         = rtl8192E_resume,                 /* PM resume fn  */
+};
+
+/****************************************************************************
+   -----------------------------IO STUFF-------------------------
+*****************************************************************************/
+bool
+PlatformIOCheckPageLegalAndGetRegMask(
+       u32     u4bPage,
+       u8*     pu1bPageMask
+)
+{
+       bool            bReturn = false;
+       *pu1bPageMask = 0xfe;
+
+       switch (u4bPage)
+       {
+               case 1: case 2: case 3: case 4:
+               case 8: case 9: case 10: case 12: case 13:
+                       bReturn = true;
+                       *pu1bPageMask = 0xf0;
+                       break;
+
+               default:
+                       bReturn = false;
+                       break;
+       }
+
+       return bReturn;
+}
+
+void write_nic_io_byte(struct net_device *dev, int x,u8 y)
+{
+       u32 u4bPage = (x >> 8);
+       u8 u1PageMask = 0;
+       bool    bIsLegalPage = false;
+
+       if (u4bPage == 0)
+       {
+               outb(y&0xff,dev->base_addr +x);
+       }else
+       {
+               bIsLegalPage = PlatformIOCheckPageLegalAndGetRegMask(u4bPage, &u1PageMask);
+               if (bIsLegalPage)
+               {
+                       u8 u1bPsr = read_nic_io_byte(dev, PSR);
+
+                       write_nic_io_byte(dev, PSR, ((u1bPsr & u1PageMask) | (u8)u4bPage));
+                       write_nic_io_byte(dev, (x & 0xff), y);
+                       write_nic_io_byte(dev, PSR, (u1bPsr & u1PageMask));
+
+               }else
+               {
+                       ;
+               }
+       }
+
+
+}
+
+void write_nic_io_word(struct net_device *dev, int x,u16 y)
+{
+       u32 u4bPage = (x >> 8);
+       u8 u1PageMask = 0;
+       bool    bIsLegalPage = false;
+
+       if (u4bPage == 0)
+       {
+               outw(y,dev->base_addr +x);
+       }else
+       {
+               bIsLegalPage = PlatformIOCheckPageLegalAndGetRegMask(u4bPage, &u1PageMask);
+               if (bIsLegalPage)
+               {
+                       u8 u1bPsr = read_nic_io_byte(dev, PSR);
+
+                       write_nic_io_byte(dev, PSR, ((u1bPsr & u1PageMask) | (u8)u4bPage));
+                       write_nic_io_word(dev, (x & 0xff), y);
+                       write_nic_io_byte(dev, PSR, (u1bPsr & u1PageMask));
+
+               }else
+               {
+                       ;
+               }
+       }
+
+}
+
+void write_nic_io_dword(struct net_device *dev, int x,u32 y)
+{
+       u32 u4bPage = (x >> 8);
+       u8 u1PageMask = 0;
+       bool    bIsLegalPage = false;
+
+       if (u4bPage == 0)
+       {
+               outl(y,dev->base_addr +x);
+       }else
+       {
+               bIsLegalPage = PlatformIOCheckPageLegalAndGetRegMask(u4bPage, &u1PageMask);
+               if (bIsLegalPage)
+               {
+                       u8 u1bPsr = read_nic_io_byte(dev, PSR);
+
+                       write_nic_io_byte(dev, PSR, ((u1bPsr & u1PageMask) | (u8)u4bPage));
+                       write_nic_io_dword(dev, (x & 0xff), y);
+                       write_nic_io_byte(dev, PSR, (u1bPsr & u1PageMask));
+
+               }else
+               {
+                       ;
+               }
+       }
+
+}
+u8 read_nic_io_byte(struct net_device *dev, int x)
+{
+       u32 u4bPage = (x >> 8);
+       u8 u1PageMask = 0;
+       bool    bIsLegalPage = false;
+       u8      Data = 0;
+
+       if (u4bPage == 0)
+       {
+               return 0xff&inb(dev->base_addr +x);
+       }else
+       {
+               bIsLegalPage = PlatformIOCheckPageLegalAndGetRegMask(u4bPage, &u1PageMask);
+               if (bIsLegalPage)
+               {
+                       u8 u1bPsr = read_nic_io_byte(dev, PSR);
+
+                       write_nic_io_byte(dev, PSR, ((u1bPsr & u1PageMask) | (u8)u4bPage));
+                       Data = read_nic_io_byte(dev, (x & 0xff));
+                       write_nic_io_byte(dev, PSR, (u1bPsr & u1PageMask));
+
+               }else
+               {
+                       ;
+               }
+       }
+
+       return Data;
+}
+
+u16 read_nic_io_word(struct net_device *dev, int x)
+{
+       u32 u4bPage = (x >> 8);
+       u8 u1PageMask = 0;
+       bool    bIsLegalPage = false;
+       u16     Data = 0;
+
+       if (u4bPage == 0)
+       {
+               return inw(dev->base_addr +x);
+       }else
+       {
+               bIsLegalPage = PlatformIOCheckPageLegalAndGetRegMask(u4bPage, &u1PageMask);
+               if (bIsLegalPage)
+               {
+                       u8 u1bPsr = read_nic_io_byte(dev, PSR);
+
+                       write_nic_io_byte(dev, PSR, ((u1bPsr & u1PageMask) | (u8)u4bPage));
+                       Data = read_nic_io_word(dev, (x & 0xff));
+                       write_nic_io_byte(dev, PSR, (u1bPsr & u1PageMask));
+
+               }else
+               {
+                       ;
+               }
+       }
+
+       return Data;
+}
+
+u32 read_nic_io_dword(struct net_device *dev, int x)
+{
+       u32 u4bPage = (x >> 8);
+       u8 u1PageMask = 0;
+       bool    bIsLegalPage = false;
+       u32     Data = 0;
+
+       if (u4bPage == 0)
+       {
+               return inl(dev->base_addr +x);
+       }else
+       {
+               bIsLegalPage = PlatformIOCheckPageLegalAndGetRegMask(u4bPage, &u1PageMask);
+               if (bIsLegalPage)
+               {
+                       u8 u1bPsr = read_nic_io_byte(dev, PSR);
+
+                       write_nic_io_byte(dev, PSR, ((u1bPsr & u1PageMask) | (u8)u4bPage));
+                       Data = read_nic_io_dword(dev, (x & 0xff));
+                       write_nic_io_byte(dev, PSR, (u1bPsr & u1PageMask));
+
+               }else
+               {
+                       ;
+               }
+       }
+
+       return Data;
+}
+
+u8 read_nic_byte(struct net_device *dev, int x)
+{
+#ifdef CONFIG_RTL8192_IO_MAP
+       return read_nic_io_byte(dev, x);
+#else
+        return 0xff&readb((u8*)dev->mem_start +x);
+#endif
+}
+
+u32 read_nic_dword(struct net_device *dev, int x)
+{
+#ifdef CONFIG_RTL8192_IO_MAP
+       return read_nic_io_dword(dev, x);
+#else
+        return readl((u8*)dev->mem_start +x);
+#endif
+}
+
+u16 read_nic_word(struct net_device *dev, int x)
+{
+#ifdef CONFIG_RTL8192_IO_MAP
+       return read_nic_io_word(dev, x);
+#else
+        return readw((u8*)dev->mem_start +x);
+#endif
+}
+
+void write_nic_byte(struct net_device *dev, int x,u8 y)
+{
+#ifdef CONFIG_RTL8192_IO_MAP
+       write_nic_io_byte(dev, x, y);
+#else
+        writeb(y,(u8*)dev->mem_start +x);
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+       udelay(20);
+#endif
+
+#if defined RTL8192CE
+               read_nic_byte(dev, x);
+#endif
+
+#endif
+}
+
+void write_nic_dword(struct net_device *dev, int x,u32 y)
+{
+#ifdef CONFIG_RTL8192_IO_MAP
+       write_nic_io_dword(dev, x, y);
+#else
+        writel(y,(u8*)dev->mem_start +x);
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+       udelay(20);
+#endif
+
+#if defined RTL8192CE
+               read_nic_dword(dev, x);
+#endif
+
+#endif
+}
+
+void write_nic_word(struct net_device *dev, int x,u16 y)
+{
+#ifdef CONFIG_RTL8192_IO_MAP
+       write_nic_io_word(dev, x, y);
+#else
+        writew(y,(u8*)dev->mem_start +x);
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+       udelay(20);
+#endif
+
+#if defined RTL8192CE
+               read_nic_word(dev, x);
+#endif
+
+#endif
+}
+
+/****************************************************************************
+   -----------------------------GENERAL FUNCTION-------------------------
+*****************************************************************************/
+bool
+MgntActSet_RF_State(
+       struct net_device* dev,
+       RT_RF_POWER_STATE       StateToSet,
+       RT_RF_CHANGE_SOURCE ChangeSource,
+       bool    ProtectOrNot
+       )
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device * ieee = priv->rtllib;
+       bool                    bActionAllowed = false;
+       bool                    bConnectBySSID = false;
+       RT_RF_POWER_STATE       rtState;
+       u16                     RFWaitCounter = 0;
+       unsigned long flag;
+       RT_TRACE((COMP_PS | COMP_RF), "===>MgntActSet_RF_State(): StateToSet(%d)\n",StateToSet);
+
+#ifndef RTL8192CE
+       ProtectOrNot = false;
+#endif
+
+
+       if (!ProtectOrNot)
+       {
+       while(true)
+       {
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               if (priv->RFChangeInProgress)
+               {
+                       spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+                       RT_TRACE((COMP_PS | COMP_RF), "MgntActSet_RF_State(): RF Change in progress! Wait to set..StateToSet(%d).\n", StateToSet);
+                       #if 1
+                       while(priv->RFChangeInProgress)
+                       {
+                               RFWaitCounter ++;
+                               RT_TRACE((COMP_PS | COMP_RF), "MgntActSet_RF_State(): Wait 1 ms (%d times)...\n", RFWaitCounter);
+                               mdelay(1);
+
+                               if (RFWaitCounter > 100)
+                               {
+                                       RT_TRACE(COMP_ERR, "MgntActSet_RF_State(): Wait too logn to set RF\n");
+                                       return false;
+                               }
+                       }
+                       #endif
+               }
+               else
+               {
+                       priv->RFChangeInProgress = true;
+                       spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+                       break;
+               }
+       }
+       }
+
+       rtState = priv->rtllib->eRFPowerState;
+
+       switch (StateToSet)
+       {
+       case eRfOn:
+
+               priv->rtllib->RfOffReason &= (~ChangeSource);
+
+               if ((ChangeSource == RF_CHANGE_BY_HW) && (priv->bHwRadioOff == true)){
+                       priv->bHwRadioOff = false;
+               }
+
+               if (! priv->rtllib->RfOffReason)
+               {
+                       priv->rtllib->RfOffReason = 0;
+                       bActionAllowed = true;
+
+
+                       if (rtState == eRfOff && ChangeSource >=RF_CHANGE_BY_HW )
+                       {
+                               bConnectBySSID = true;
+                       }
+               }
+               else{
+                       RT_TRACE((COMP_PS | COMP_RF), "MgntActSet_RF_State - eRfon reject pMgntInfo->RfOffReason= 0x%x, ChangeSource=0x%X\n", priv->rtllib->RfOffReason, ChangeSource);
+                }
+
+               break;
+
+       case eRfOff:
+
+               if ((priv->rtllib->iw_mode == IW_MODE_INFRA) || (priv->rtllib->iw_mode == IW_MODE_ADHOC))
+               {
+                       if ((priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS) || (ChangeSource > RF_CHANGE_BY_IPS))
+                       {
+                               if (ieee->state == RTLLIB_LINKED)
+                                       priv->blinked_ingpio = true;
+                               else
+                                       priv->blinked_ingpio = false;
+                               rtllib_MgntDisconnect(priv->rtllib,disas_lv_ss);
+
+
+
+                       }
+               }
+               if ((ChangeSource == RF_CHANGE_BY_HW) && (priv->bHwRadioOff == false)){
+                       priv->bHwRadioOff = true;
+               }
+               priv->rtllib->RfOffReason |= ChangeSource;
+               bActionAllowed = true;
+               break;
+
+       case eRfSleep:
+               priv->rtllib->RfOffReason |= ChangeSource;
+               bActionAllowed = true;
+               break;
+
+       default:
+               break;
+       }
+
+       if (bActionAllowed)
+       {
+               RT_TRACE((COMP_PS | COMP_RF), "MgntActSet_RF_State(): Action is allowed.... StateToSet(%d), RfOffReason(%#X)\n", StateToSet, priv->rtllib->RfOffReason);
+               PHY_SetRFPowerState(dev, StateToSet);
+               if (StateToSet == eRfOn)
+               {
+
+                       if (bConnectBySSID && (priv->blinked_ingpio == true))
+                       {
+                               queue_delayed_work_rsl(ieee->wq, &ieee->associate_procedure_wq, 0);
+                               priv->blinked_ingpio = false;
+
+                       }
+               }
+       } else {
+               RT_TRACE((COMP_PS | COMP_RF), "MgntActSet_RF_State(): Action is rejected.... StateToSet(%d), ChangeSource(%#X), RfOffReason(%#X)\n", StateToSet, ChangeSource, priv->rtllib->RfOffReason);
+       }
+
+       if (!ProtectOrNot)
+       {
+       spin_lock_irqsave(&priv->rf_ps_lock,flag);
+       priv->RFChangeInProgress = false;
+       spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+       }
+
+       RT_TRACE((COMP_PS && COMP_RF), "<===MgntActSet_RF_State()\n");
+       return bActionAllowed;
+}
+
+
+short rtl8192_get_nic_desc_num(struct net_device *dev, int prio)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+    /* For now, we reserved two free descriptor as a safety boundary
+     * between the tail and the head
+     */
+    if ((prio == MGNT_QUEUE) &&(skb_queue_len(&ring->queue)>10))
+       RT_TRACE(COMP_DBG, "-----[%d]---------ring->idx=%d queue_len=%d---------\n",
+                       prio,ring->idx, skb_queue_len(&ring->queue));
+    return skb_queue_len(&ring->queue);
+}
+
+short rtl8192_check_nic_enough_desc(struct net_device *dev, int prio)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+    if (ring->entries - skb_queue_len(&ring->queue) >= 2) {
+        return 1;
+    } else {
+        return 0;
+    }
+}
+
+void rtl8192_tx_timeout(struct net_device *dev)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+    schedule_work(&priv->reset_wq);
+#else
+    schedule_task(&priv->reset_wq);
+#endif
+    printk("TXTIMEOUT");
+}
+
+void rtl8192_irq_enable(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       priv->irq_enabled = 1;
+
+       priv->ops->irq_enable(dev);
+}
+
+void rtl8192_irq_disable(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       priv->ops->irq_disable(dev);
+
+       priv->irq_enabled = 0;
+}
+
+void rtl8192_irq_clear(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       priv->ops->irq_clear(dev);
+}
+
+
+void rtl8192_set_chan(struct net_device *dev,short ch)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+    RT_TRACE(COMP_CH, "=====>%s()====ch:%d\n", __func__, ch);
+    if (priv->chan_forced)
+        return;
+
+    priv->chan = ch;
+
+
+#ifndef LOOP_TEST
+
+
+    if (priv->rf_set_chan)
+        priv->rf_set_chan(dev,priv->chan);
+
+#ifdef CONFIG_FW_SETCHAN
+    priv->rtllib->SetFwCmdHandler(dev, FW_CMD_CHAN_SET);
+#endif
+
+#endif
+}
+
+void rtl8192_update_cap(struct net_device* dev, u16 cap)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_network *net = &priv->rtllib->current_network;
+
+
+       {
+               bool            ShortPreamble;
+
+               if (cap & WLAN_CAPABILITY_SHORT_PREAMBLE)
+               {
+                       if (priv->dot11CurrentPreambleMode != PREAMBLE_SHORT)
+                       {
+                               ShortPreamble = true;
+                               priv->dot11CurrentPreambleMode = PREAMBLE_SHORT;
+                               RT_TRACE(COMP_DBG, "%s(): WLAN_CAPABILITY_SHORT_PREAMBLE\n", __func__);
+                               priv->rtllib->SetHwRegHandler( dev, HW_VAR_ACK_PREAMBLE, (unsigned char *)&ShortPreamble );
+                       }
+               }
+               else
+               {
+                       if (priv->dot11CurrentPreambleMode != PREAMBLE_LONG)
+                       {
+                               ShortPreamble = false;
+                               priv->dot11CurrentPreambleMode = PREAMBLE_LONG;
+                               RT_TRACE(COMP_DBG, "%s(): WLAN_CAPABILITY_LONG_PREAMBLE\n", __func__);
+                               priv->rtllib->SetHwRegHandler( dev, HW_VAR_ACK_PREAMBLE, (unsigned char *)&ShortPreamble );
+                       }
+               }
+       }
+
+#ifdef RTL8192CE
+       if ( net->mode & IEEE_G)
+#elif defined RTL8192SE || defined RTL8192E || defined RTL8190P
+       if (net->mode & (IEEE_G|IEEE_N_24G))
+#endif
+       {
+               u8      slot_time_val;
+               u8      CurSlotTime = priv->slot_time;
+
+#ifdef RTL8192CE
+               if ( (cap & WLAN_CAPABILITY_SHORT_SLOT_TIME) && (!(priv->rtllib->pHTInfo->RT2RT_HT_Mode & RT_HT_CAP_USE_LONG_PREAMBLE)))
+#elif defined RTL8192SE || defined RTL8192E || defined RTL8190P
+               if ((cap & WLAN_CAPABILITY_SHORT_SLOT_TIME) && (!priv->rtllib->pHTInfo->bCurrentRT2RTLongSlotTime))
+#endif
+               {
+                       if (CurSlotTime != SHORT_SLOT_TIME)
+                       {
+                               slot_time_val = SHORT_SLOT_TIME;
+                               priv->rtllib->SetHwRegHandler( dev, HW_VAR_SLOT_TIME, &slot_time_val );
+                       }
+               }
+               else
+               {
+                       if (CurSlotTime != NON_SHORT_SLOT_TIME)
+                       {
+                               slot_time_val = NON_SHORT_SLOT_TIME;
+                               priv->rtllib->SetHwRegHandler( dev, HW_VAR_SLOT_TIME, &slot_time_val );
+                       }
+               }
+       }
+}
+
+static struct rtllib_qos_parameters def_qos_parameters = {
+        {3,3,3,3},
+        {7,7,7,7},
+        {2,2,2,2},
+        {0,0,0,0},
+        {0,0,0,0}
+};
+
+void rtl8192_update_beacon(void *data)
+{
+#if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,20)
+       struct r8192_priv *priv = container_of_work_rsl(data, struct r8192_priv, update_beacon_wq.work);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+        struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+       struct rtllib_device* ieee = priv->rtllib;
+       struct rtllib_network* net = &ieee->current_network;
+
+       if (ieee->pHTInfo->bCurrentHTSupport)
+               HTUpdateSelfAndPeerSetting(ieee, net);
+       ieee->pHTInfo->bCurrentRT2RTLongSlotTime = net->bssht.bdRT2RTLongSlotTime;
+       ieee->pHTInfo->RT2RT_HT_Mode = net->bssht.RT2RT_HT_Mode;
+       rtl8192_update_cap(dev, net->capability);
+}
+
+#define MOVE_INTO_HANDLER
+#ifdef RTL8192CE
+int WDCAPARA_ADD[] = {REG_EDCA_BE_PARAM,REG_EDCA_BK_PARAM,REG_EDCA_VI_PARAM,REG_EDCA_VO_PARAM};
+#else
+int WDCAPARA_ADD[] = {EDCAPARA_BE,EDCAPARA_BK,EDCAPARA_VI,EDCAPARA_VO};
+#endif
+void rtl8192_qos_activate(void *data)
+{
+#if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,20)
+       struct r8192_priv *priv = container_of_work_rsl(data, struct r8192_priv, qos_activate);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+#ifndef MOVE_INTO_HANDLER
+        struct rtllib_qos_parameters *qos_parameters = &priv->rtllib->current_network.qos_data.parameters;
+        u8 mode = priv->rtllib->current_network.mode;
+       u8  u1bAIFS;
+       u32 u4bAcParam;
+#endif
+        int i;
+
+        if (priv == NULL)
+                return;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
+       down(&priv->mutex);
+#else
+        mutex_lock(&priv->mutex);
+#endif
+        if (priv->rtllib->state != RTLLIB_LINKED)
+               goto success;
+       RT_TRACE(COMP_QOS,"qos active process with associate response received\n");
+
+       for (i = 0; i <  QOS_QUEUE_NUM; i++) {
+#ifndef MOVE_INTO_HANDLER
+               u1bAIFS = qos_parameters->aifs[i] * ((mode&(IEEE_G|IEEE_N_24G)) ?9:20) + aSifsTime;
+               u4bAcParam = ((((u32)(qos_parameters->tx_op_limit[i]))<< AC_PARAM_TXOP_LIMIT_OFFSET)|
+                               (((u32)(qos_parameters->cw_max[i]))<< AC_PARAM_ECW_MAX_OFFSET)|
+                               (((u32)(qos_parameters->cw_min[i]))<< AC_PARAM_ECW_MIN_OFFSET)|
+                               ((u32)u1bAIFS << AC_PARAM_AIFS_OFFSET));
+               RT_TRACE(COMP_DBG, "===>ACI:%d:u4bAcParam:%x\n", i, u4bAcParam);
+               write_nic_dword(dev, WDCAPARA_ADD[i], u4bAcParam);
+#else
+               priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM, (u8*)(&i));
+#endif
+       }
+
+success:
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
+       up(&priv->mutex);
+#else
+        mutex_unlock(&priv->mutex);
+#endif
+}
+
+static int rtl8192_qos_handle_probe_response(struct r8192_priv *priv,
+               int active_network,
+               struct rtllib_network *network)
+{
+       int ret = 0;
+       u32 size = sizeof(struct rtllib_qos_parameters);
+
+       if (priv->rtllib->state !=RTLLIB_LINKED)
+                return ret;
+
+       if ((priv->rtllib->iw_mode != IW_MODE_INFRA))
+               return ret;
+
+       if (network->flags & NETWORK_HAS_QOS_MASK) {
+               if (active_network &&
+                               (network->flags & NETWORK_HAS_QOS_PARAMETERS))
+                       network->qos_data.active = network->qos_data.supported;
+
+               if ((network->qos_data.active == 1) && (active_network == 1) &&
+                               (network->flags & NETWORK_HAS_QOS_PARAMETERS) &&
+                               (network->qos_data.old_param_count !=
+                                network->qos_data.param_count)) {
+                       network->qos_data.old_param_count =
+                               network->qos_data.param_count;
+                         priv->rtllib->wmm_acm = network->qos_data.wmm_acm;
+                       queue_work_rsl(priv->priv_wq, &priv->qos_activate);
+                       RT_TRACE (COMP_QOS, "QoS parameters change call "
+                                       "qos_activate\n");
+               }
+       } else {
+               memcpy(&priv->rtllib->current_network.qos_data.parameters,\
+                      &def_qos_parameters, size);
+
+               if ((network->qos_data.active == 1) && (active_network == 1)) {
+                       queue_work_rsl(priv->priv_wq, &priv->qos_activate);
+                       RT_TRACE(COMP_QOS, "QoS was disabled call qos_activate \n");
+               }
+               network->qos_data.active = 0;
+               network->qos_data.supported = 0;
+       }
+
+       return 0;
+}
+
+static int rtl8192_handle_beacon(struct net_device * dev,
+                              struct rtllib_beacon * beacon,
+                              struct rtllib_network * network)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       rtl8192_qos_handle_probe_response(priv,1,network);
+
+       queue_delayed_work_rsl(priv->priv_wq, &priv->update_beacon_wq, 0);
+       return 0;
+
+}
+
+static int rtl8192_qos_association_resp(struct r8192_priv *priv,
+                                    struct rtllib_network *network)
+{
+        int ret = 0;
+        unsigned long flags;
+        u32 size = sizeof(struct rtllib_qos_parameters);
+        int set_qos_param = 0;
+
+        if ((priv == NULL) || (network == NULL))
+                return ret;
+
+       if (priv->rtllib->state !=RTLLIB_LINKED)
+                return ret;
+
+       if ((priv->rtllib->iw_mode != IW_MODE_INFRA))
+                return ret;
+
+        spin_lock_irqsave(&priv->rtllib->lock, flags);
+       if (network->flags & NETWORK_HAS_QOS_PARAMETERS) {
+               memcpy(&priv->rtllib->current_network.qos_data.parameters,\
+                        &network->qos_data.parameters,\
+                       sizeof(struct rtllib_qos_parameters));
+               priv->rtllib->current_network.qos_data.active = 1;
+                priv->rtllib->wmm_acm = network->qos_data.wmm_acm;
+               set_qos_param = 1;
+               priv->rtllib->current_network.qos_data.old_param_count =
+                               priv->rtllib->current_network.qos_data.param_count;
+               priv->rtllib->current_network.qos_data.param_count =
+                               network->qos_data.param_count;
+        } else {
+               memcpy(&priv->rtllib->current_network.qos_data.parameters,
+                      &def_qos_parameters, size);
+               priv->rtllib->current_network.qos_data.active = 0;
+               priv->rtllib->current_network.qos_data.supported = 0;
+                set_qos_param = 1;
+        }
+
+        spin_unlock_irqrestore(&priv->rtllib->lock, flags);
+
+       RT_TRACE(COMP_QOS, "%s: network->flags = %d,%d\n", __func__,
+                       network->flags ,priv->rtllib->current_network.qos_data.active);
+       if (set_qos_param == 1) {
+               dm_init_edca_turbo(priv->rtllib->dev);
+               queue_work_rsl(priv->priv_wq, &priv->qos_activate);
+       }
+        return ret;
+}
+
+static int rtl8192_handle_assoc_response(struct net_device *dev,
+                                     struct rtllib_assoc_response_frame *resp,
+                                     struct rtllib_network *network)
+{
+        struct r8192_priv *priv = rtllib_priv(dev);
+        rtl8192_qos_association_resp(priv, network);
+        return 0;
+}
+
+void rtl8192_prepare_beacon(struct r8192_priv *priv)
+{
+       struct net_device *dev = priv->rtllib->dev;
+       struct sk_buff *pskb = NULL, *pnewskb = NULL;
+       cb_desc *tcb_desc = NULL;
+       struct rtl8192_tx_ring *ring = NULL;
+       tx_desc *pdesc = NULL;
+
+       ring = &priv->tx_ring[BEACON_QUEUE];
+       pskb = __skb_dequeue(&ring->queue);
+       if (pskb)
+               kfree_skb(pskb);
+
+       pnewskb = rtllib_get_beacon(priv->rtllib);
+       if (!pnewskb)
+               return;
+
+       tcb_desc = (cb_desc *)(pnewskb->cb + 8);
+       tcb_desc->queue_index = BEACON_QUEUE;
+       tcb_desc->data_rate = 2;
+       tcb_desc->RATRIndex = 7;
+       tcb_desc->bTxDisableRateFallBack = 1;
+       tcb_desc->bTxUseDriverAssingedRate = 1;
+       skb_push(pnewskb, priv->rtllib->tx_headroom);
+
+       pdesc = &ring->desc[0];
+       priv->ops->tx_fill_descriptor(dev, pdesc, tcb_desc, pnewskb);
+       __skb_queue_tail(&ring->queue, pnewskb);
+       pdesc->OWN = 1;
+
+       return;
+}
+
+void rtl8192_stop_beacon(struct net_device *dev)
+{
+}
+
+void rtl8192_config_rate(struct net_device* dev, u16* rate_config)
+{
+        struct r8192_priv *priv = rtllib_priv(dev);
+        struct rtllib_network *net;
+        u8 i=0, basic_rate = 0;
+       net = & priv->rtllib->current_network;
+
+        for (i = 0; i < net->rates_len; i++) {
+                basic_rate = net->rates[i] & 0x7f;
+                switch (basic_rate) {
+                case MGN_1M:
+                        *rate_config |= RRSR_1M;
+                        break;
+                case MGN_2M:
+                        *rate_config |= RRSR_2M;
+                        break;
+                case MGN_5_5M:
+                        *rate_config |= RRSR_5_5M;
+                        break;
+                case MGN_11M:
+                        *rate_config |= RRSR_11M;
+                        break;
+                case MGN_6M:
+                        *rate_config |= RRSR_6M;
+                        break;
+                case MGN_9M:
+                        *rate_config |= RRSR_9M;
+                        break;
+                case MGN_12M:
+                        *rate_config |= RRSR_12M;
+                        break;
+                case MGN_18M:
+                        *rate_config |= RRSR_18M;
+                        break;
+                case MGN_24M:
+                        *rate_config |= RRSR_24M;
+                        break;
+                case MGN_36M:
+                        *rate_config |= RRSR_36M;
+                        break;
+                case MGN_48M:
+                        *rate_config |= RRSR_48M;
+                        break;
+                case MGN_54M:
+                        *rate_config |= RRSR_54M;
+                        break;
+                }
+        }
+
+        for (i = 0; i < net->rates_ex_len; i++) {
+                basic_rate = net->rates_ex[i] & 0x7f;
+                switch (basic_rate) {
+                case MGN_1M:
+                        *rate_config |= RRSR_1M;
+                        break;
+                case MGN_2M:
+                        *rate_config |= RRSR_2M;
+                        break;
+                case MGN_5_5M:
+                        *rate_config |= RRSR_5_5M;
+                        break;
+                case MGN_11M:
+                        *rate_config |= RRSR_11M;
+                        break;
+                case MGN_6M:
+                        *rate_config |= RRSR_6M;
+                        break;
+                case MGN_9M:
+                        *rate_config |= RRSR_9M;
+                        break;
+                case MGN_12M:
+                        *rate_config |= RRSR_12M;
+                        break;
+                case MGN_18M:
+                        *rate_config |= RRSR_18M;
+                        break;
+                case MGN_24M:
+                        *rate_config |= RRSR_24M;
+                        break;
+                case MGN_36M:
+                        *rate_config |= RRSR_36M;
+                        break;
+                case MGN_48M:
+                        *rate_config |= RRSR_48M;
+                        break;
+                case MGN_54M:
+                        *rate_config |= RRSR_54M;
+                        break;
+                }
+        }
+}
+
+void rtl8192_refresh_supportrate(struct r8192_priv* priv)
+{
+       struct rtllib_device* ieee = priv->rtllib;
+       if (ieee->mode == WIRELESS_MODE_N_24G || ieee->mode == WIRELESS_MODE_N_5G) {
+               memcpy(ieee->Regdot11HTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
+               memcpy(ieee->Regdot11TxHTOperationalRateSet, ieee->RegHTSuppRateSet, 16);
+
+#ifdef RTL8192CE
+               if (priv->rf_type == RF_1T1R) {
+                       ieee->Regdot11HTOperationalRateSet[1] = 0;
+               }
+#endif
+
+#ifdef RTL8192SE
+               if (priv->rf_type == RF_1T1R) {
+                       ieee->Regdot11HTOperationalRateSet[1] = 0;
+               }
+               if (priv->rf_type == RF_1T1R || priv->rf_type == RF_1T2R)
+               {
+                       ieee->Regdot11TxHTOperationalRateSet[1] = 0;
+               }
+
+            if (priv->rtllib->b1SSSupport == true) {
+                ieee->Regdot11HTOperationalRateSet[1] = 0;
+            }
+#endif
+       } else {
+               memset(ieee->Regdot11HTOperationalRateSet, 0, 16);
+       }
+       return;
+}
+
+u8 rtl8192_getSupportedWireleeMode(struct net_device*dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 ret = 0;
+
+       switch (priv->rf_chip) {
+       case RF_8225:
+       case RF_8256:
+       case RF_6052:
+       case RF_PSEUDO_11N:
+               ret = (WIRELESS_MODE_N_24G|WIRELESS_MODE_G | WIRELESS_MODE_B);
+               break;
+       case RF_8258:
+               ret = (WIRELESS_MODE_A | WIRELESS_MODE_N_5G);
+               break;
+       default:
+               ret = WIRELESS_MODE_B;
+               break;
+       }
+       return ret;
+}
+
+void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 bSupportMode = rtl8192_getSupportedWireleeMode(dev);
+
+       if ((wireless_mode == WIRELESS_MODE_AUTO) || ((wireless_mode & bSupportMode) == 0)) {
+               if (bSupportMode & WIRELESS_MODE_N_24G) {
+                       wireless_mode = WIRELESS_MODE_N_24G;
+               } else if (bSupportMode & WIRELESS_MODE_N_5G) {
+                       wireless_mode = WIRELESS_MODE_N_5G;
+               } else if ((bSupportMode & WIRELESS_MODE_A)) {
+                       wireless_mode = WIRELESS_MODE_A;
+               } else if ((bSupportMode & WIRELESS_MODE_G)) {
+                       wireless_mode = WIRELESS_MODE_G;
+               } else if ((bSupportMode & WIRELESS_MODE_B)) {
+                       wireless_mode = WIRELESS_MODE_B;
+               } else {
+                       RT_TRACE(COMP_ERR, "%s(), No valid wireless mode supported (%x)!!!\n",
+                                       __func__, bSupportMode);
+                       wireless_mode = WIRELESS_MODE_B;
+               }
+       }
+
+       if ((wireless_mode & (WIRELESS_MODE_B | WIRELESS_MODE_G)) == (WIRELESS_MODE_G | WIRELESS_MODE_B))
+               wireless_mode = WIRELESS_MODE_G;
+
+       priv->rtllib->mode = wireless_mode;
+
+       ActUpdateChannelAccessSetting( dev, wireless_mode, &priv->ChannelAccessSetting);
+
+       if ((wireless_mode == WIRELESS_MODE_N_24G) ||  (wireless_mode == WIRELESS_MODE_N_5G)){
+               priv->rtllib->pHTInfo->bEnableHT = 1;
+                RT_TRACE(COMP_DBG, "%s(), wireless_mode:%x, bEnableHT = 1\n", __func__,wireless_mode);
+        }else{
+               priv->rtllib->pHTInfo->bEnableHT = 0;
+                RT_TRACE(COMP_DBG, "%s(), wireless_mode:%x, bEnableHT = 0\n", __func__,wireless_mode);
+        }
+
+       RT_TRACE(COMP_INIT, "Current Wireless Mode is %x\n", wireless_mode);
+       rtl8192_refresh_supportrate(priv);
+}
+
+int _rtl8192_sta_up(struct net_device *dev,bool is_silent_reset)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       bool init_status = true;
+       priv->bDriverIsGoingToUnload = false;
+       priv->bdisable_nic = false;
+
+       priv->up=1;
+       priv->rtllib->ieee_up=1;
+
+       priv->up_first_time = 0;
+       RT_TRACE(COMP_INIT, "Bringing up iface");
+       priv->bfirst_init = true;
+       init_status = priv->ops->initialize_adapter(dev);
+       if (init_status != true)
+       {
+               RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n",__func__);
+               priv->bfirst_init = false;
+               return -1;
+       }
+
+       RT_TRACE(COMP_INIT, "start adapter finished\n");
+       RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+       priv->bfirst_init = false;
+#if defined RTL8192SE || defined RTL8192CE
+       if (priv->rtllib->eRFPowerState!=eRfOn)
+               MgntActSet_RF_State(dev, eRfOn, priv->rtllib->RfOffReason,true);
+#endif
+
+#ifdef ENABLE_GPIO_RADIO_CTL
+       if (priv->polling_timer_on == 0){
+               check_rfctrl_gpio_timer((unsigned long)dev);
+       }
+#endif
+
+       if (priv->rtllib->state != RTLLIB_LINKED)
+#ifndef CONFIG_MP
+       rtllib_softmac_start_protocol(priv->rtllib, 0);
+#endif
+       rtllib_reset_queue(priv->rtllib);
+#ifndef CONFIG_MP
+       watch_dog_timer_callback((unsigned long) dev);
+#endif
+
+
+       if (!netif_queue_stopped(dev))
+               netif_start_queue(dev);
+       else
+               netif_wake_queue(dev);
+
+       return 0;
+}
+
+int rtl8192_sta_down(struct net_device *dev, bool shutdownrf)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       unsigned long flags = 0;
+       u8 RFInProgressTimeOut = 0;
+
+       if (priv->up == 0) return -1;
+
+       if (priv->rtllib->rtllib_ips_leave != NULL)
+               priv->rtllib->rtllib_ips_leave(dev);
+
+       if (priv->rtllib->state == RTLLIB_LINKED)
+               LeisurePSLeave(dev);
+
+       priv->bDriverIsGoingToUnload = true;
+       priv->up=0;
+       priv->rtllib->ieee_up = 0;
+       priv->bfirst_after_down = 1;
+       RT_TRACE(COMP_DOWN, "==========>%s()\n", __func__);
+       if (!netif_queue_stopped(dev))
+               netif_stop_queue(dev);
+
+       priv->rtllib->wpa_ie_len = 0;
+       if (priv->rtllib->wpa_ie)
+               kfree(priv->rtllib->wpa_ie);
+       priv->rtllib->wpa_ie = NULL;
+       CamResetAllEntry(dev);
+       memset(priv->rtllib->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
+       rtl8192_irq_disable(dev);
+
+       del_timer_sync(&priv->watch_dog_timer);
+       rtl8192_cancel_deferred_work(priv);
+#ifndef RTL8190P
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       cancel_delayed_work(&priv->rtllib->hw_wakeup_wq);
+#endif
+#endif
+
+       rtllib_softmac_stop_protocol(priv->rtllib, 0, true);
+       spin_lock_irqsave(&priv->rf_ps_lock,flags);
+       while(priv->RFChangeInProgress)
+       {
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+               if (RFInProgressTimeOut > 100)
+               {
+                       spin_lock_irqsave(&priv->rf_ps_lock,flags);
+                       break;
+               }
+               RT_TRACE(COMP_DBG, "===>%s():RF is in progress, need to wait until rf chang is done.\n",__func__);
+               mdelay(1);
+               RFInProgressTimeOut ++;
+               spin_lock_irqsave(&priv->rf_ps_lock,flags);
+       }
+       priv->RFChangeInProgress = true;
+       spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+       priv->ops->stop_adapter(dev, false);
+       spin_lock_irqsave(&priv->rf_ps_lock,flags);
+       priv->RFChangeInProgress = false;
+       spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+       udelay(100);
+       memset(&priv->rtllib->current_network, 0 , offsetof(struct rtllib_network, list));
+#ifdef CONFIG_ASPM_OR_D3
+       RT_ENABLE_ASPM(dev);
+#endif
+       RT_TRACE(COMP_DOWN, "<==========%s()\n", __func__);
+
+       return 0;
+}
+
+static void rtl8192_init_priv_handler(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->rtllib->softmac_hard_start_xmit   = rtl8192_hard_start_xmit;
+       priv->rtllib->set_chan                          = rtl8192_set_chan;
+       priv->rtllib->link_change                       = priv->ops->link_change;
+       priv->rtllib->softmac_data_hard_start_xmit = rtl8192_hard_data_xmit;
+       priv->rtllib->data_hard_stop            = rtl8192_data_hard_stop;
+       priv->rtllib->data_hard_resume          = rtl8192_data_hard_resume;
+       priv->rtllib->check_nic_enough_desc     = rtl8192_check_nic_enough_desc;
+       priv->rtllib->get_nic_desc_num          = rtl8192_get_nic_desc_num;
+       priv->rtllib->handle_assoc_response     = rtl8192_handle_assoc_response;
+       priv->rtllib->handle_beacon             = rtl8192_handle_beacon;
+       priv->rtllib->SetWirelessMode           = rtl8192_SetWirelessMode;
+       priv->rtllib->LeisurePSLeave            = LeisurePSLeave;
+       priv->rtllib->SetBWModeHandler          = rtl8192_SetBWMode;
+       priv->rf_set_chan                       = rtl8192_phy_SwChnl;
+
+#ifdef _ENABLE_SW_BEACON
+       priv->rtllib->start_send_beacons = NULL;
+       priv->rtllib->stop_send_beacons = NULL;
+#else
+       priv->rtllib->start_send_beacons = rtl8192e_start_beacon;
+       priv->rtllib->stop_send_beacons = rtl8192_stop_beacon;
+#endif
+
+       priv->rtllib->sta_wake_up = rtl8192_hw_wakeup;
+       priv->rtllib->enter_sleep_state = rtl8192_hw_to_sleep;
+       priv->rtllib->ps_is_queue_empty = rtl8192_is_tx_queue_empty;
+
+       priv->rtllib->GetNmodeSupportBySecCfg = rtl8192_GetNmodeSupportBySecCfg;
+       priv->rtllib->GetHalfNmodeSupportByAPsHandler = rtl8192_GetHalfNmodeSupportByAPs;
+
+       priv->rtllib->SetHwRegHandler = rtl8192e_SetHwReg;
+       priv->rtllib->AllowAllDestAddrHandler = rtl8192_AllowAllDestAddr;
+       priv->rtllib->SetFwCmdHandler = NULL;
+       priv->rtllib->InitialGainHandler = InitialGain819xPci;
+       priv->rtllib->rtllib_ips_leave_wq = rtllib_ips_leave_wq;
+       priv->rtllib->rtllib_ips_leave = rtllib_ips_leave;
+
+       priv->rtllib->LedControlHandler = NULL;
+       priv->rtllib->UpdateBeaconInterruptHandler = NULL;
+
+       priv->rtllib->ScanOperationBackupHandler = PHY_ScanOperationBackup8192;
+
+#ifdef CONFIG_RTL_RFKILL
+       priv->rtllib->rtllib_rfkill_poll = rtl8192_rfkill_poll;
+#else
+       priv->rtllib->rtllib_rfkill_poll = NULL;
+#endif
+}
+
+static void rtl8192_init_priv_constant(struct net_device* dev)
+{
+#if defined RTL8192SE || defined RTL8192CE || defined RTL8192E
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+#endif
+
+#if defined RTL8192SE || defined RTL8192CE || defined RTL8192E
+       pPSC->RegMaxLPSAwakeIntvl = 5;
+#endif
+
+#ifdef RTL8192CE
+       priv->bWEPinNmodeFromReg = 0;
+       priv->bTKIPinNmodeFromReg = 0;
+
+       priv->RegAMDPciASPM = 0;
+
+       priv->RegPciASPM = 3;
+
+       priv->RegDevicePciASPMSetting = 0x03;
+
+       priv->RegHostPciASPMSetting = 0x02;
+
+       priv->RegHwSwRfOffD3 = 0;
+
+       priv->RegSupportPciASPM = 1;
+
+#elif defined RTL8192SE
+       priv->RegPciASPM = 2;
+
+       priv->RegDevicePciASPMSetting = 0x03;
+
+       priv->RegHostPciASPMSetting = 0x02;
+
+       priv->RegHwSwRfOffD3 = 2;
+
+       priv->RegSupportPciASPM = 2;
+
+#elif defined RTL8192E
+       priv->RegPciASPM = 2;
+
+       priv->RegDevicePciASPMSetting = 0x03;
+
+       priv->RegHostPciASPMSetting = 0x02;
+
+       priv->RegHwSwRfOffD3 = 2;
+
+       priv->RegSupportPciASPM = 2;
+
+#elif defined RTL8190P
+#endif
+}
+
+
+static void rtl8192_init_priv_variable(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 i;
+
+       priv->AcmMethod = eAcmWay2_SW;
+       priv->dot11CurrentPreambleMode = PREAMBLE_AUTO;
+       priv->rtllib->hwscan_sem_up = 1;
+       priv->rtllib->status = 0;
+       priv->H2CTxCmdSeq = 0;
+       priv->bDisableFrameBursting = 0;
+       priv->bDMInitialGainEnable = 1;
+       priv->polling_timer_on = 0;
+       priv->up_first_time = 1;
+       priv->blinked_ingpio = false;
+       priv->bDriverIsGoingToUnload = false;
+       priv->being_init_adapter = false;
+       priv->initialized_at_probe = false;
+       priv->sw_radio_on = true;
+       priv->bdisable_nic = false;
+       priv->bfirst_init = false;
+       priv->txringcount = 64;
+       priv->rxbuffersize = 9100;
+       priv->rxringcount = MAX_RX_COUNT;
+       priv->irq_enabled=0;
+       priv->chan = 1;
+       priv->RegWirelessMode = WIRELESS_MODE_AUTO;
+       priv->RegChannelPlan = 0xf;
+       priv->nrxAMPDU_size = 0;
+       priv->nrxAMPDU_aggr_num = 0;
+       priv->last_rxdesc_tsf_high = 0;
+       priv->last_rxdesc_tsf_low = 0;
+       priv->rtllib->mode = WIRELESS_MODE_AUTO;
+       priv->rtllib->iw_mode = IW_MODE_INFRA;
+       priv->rtllib->bNetPromiscuousMode = false;
+       priv->rtllib->IntelPromiscuousModeInfo.bPromiscuousOn = false;
+       priv->rtllib->IntelPromiscuousModeInfo.bFilterSourceStationFrame = false;
+       priv->rtllib->ieee_up=0;
+       priv->retry_rts = DEFAULT_RETRY_RTS;
+       priv->retry_data = DEFAULT_RETRY_DATA;
+       priv->rtllib->rts = DEFAULT_RTS_THRESHOLD;
+       priv->rtllib->rate = 110;
+       priv->rtllib->short_slot = 1;
+       priv->promisc = (dev->flags & IFF_PROMISC) ? 1:0;
+       priv->bcck_in_ch14 = false;
+       priv->bfsync_processing  = false;
+       priv->CCKPresentAttentuation = 0;
+       priv->rfa_txpowertrackingindex = 0;
+       priv->rfc_txpowertrackingindex = 0;
+       priv->CckPwEnl = 6;
+       priv->ScanDelay = 50;
+       priv->ResetProgress = RESET_TYPE_NORESET;
+       priv->bForcedSilentReset = 0;
+       priv->bDisableNormalResetCheck = false;
+       priv->force_reset = false;
+       memset(priv->rtllib->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
+
+       memset(&priv->InterruptLog,0,sizeof(LOG_INTERRUPT_8190_T));
+       priv->RxCounter = 0;
+        priv->rtllib->wx_set_enc = 0;
+       priv->bHwRadioOff = false;
+       priv->RegRfOff = 0;
+       priv->isRFOff = false;
+       priv->bInPowerSaveMode = false;
+       priv->rtllib->RfOffReason = 0;
+       priv->RFChangeInProgress = false;
+       priv->bHwRfOffAction = 0;
+       priv->SetRFPowerStateInProgress = false;
+       priv->rtllib->PowerSaveControl.bInactivePs = true;
+       priv->rtllib->PowerSaveControl.bIPSModeBackup = false;
+       priv->rtllib->PowerSaveControl.bLeisurePs = true;
+       priv->rtllib->PowerSaveControl.bFwCtrlLPS = false;
+       priv->rtllib->LPSDelayCnt = 0;
+       priv->rtllib->sta_sleep = LPS_IS_WAKE;
+       priv->rtllib->eRFPowerState = eRfOn;
+
+       priv->txpower_checkcnt = 0;
+       priv->thermal_readback_index =0;
+       priv->txpower_tracking_callback_cnt = 0;
+       priv->ccktxpower_adjustcnt_ch14 = 0;
+       priv->ccktxpower_adjustcnt_not_ch14 = 0;
+
+#if defined RTL8192SE
+       for (i = 0; i<PEER_MAX_ASSOC; i++){
+               priv->rtllib->peer_assoc_list[i]=NULL;
+               priv->rtllib->AvailableAIDTable[i] = 99;
+       }
+       priv->RATRTableBitmap = 0;
+       priv->rtllib->amsdu_in_process = 0;
+#endif
+
+       priv->rtllib->current_network.beacon_interval = DEFAULT_BEACONINTERVAL;
+       priv->rtllib->iw_mode = IW_MODE_INFRA;
+       priv->rtllib->active_scan = 1;
+       priv->rtllib->be_scan_inprogress = false;
+       priv->rtllib->modulation = RTLLIB_CCK_MODULATION | RTLLIB_OFDM_MODULATION;
+       priv->rtllib->host_encrypt = 1;
+       priv->rtllib->host_decrypt = 1;
+
+       priv->rtllib->dot11PowerSaveMode = eActive;
+       priv->rtllib->fts = DEFAULT_FRAG_THRESHOLD;
+       priv->rtllib->MaxMssDensity = 0;
+       priv->rtllib->MinSpaceCfg = 0;
+
+       priv->card_type = PCI;
+
+       priv->AcmControl = 0;
+       priv->pFirmware = (rt_firmware*)vmalloc(sizeof(rt_firmware));
+       if (priv->pFirmware)
+       memset(priv->pFirmware, 0, sizeof(rt_firmware));
+
+        skb_queue_head_init(&priv->rx_queue);
+       skb_queue_head_init(&priv->skb_queue);
+
+       for (i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_head_init(&priv->rtllib->skb_waitQ [i]);
+       }
+       for (i = 0; i < MAX_QUEUE_SIZE; i++) {
+               skb_queue_head_init(&priv->rtllib->skb_aggQ [i]);
+       }
+
+}
+
+static void rtl8192_init_priv_lock(struct r8192_priv* priv)
+{
+       spin_lock_init(&priv->fw_scan_lock);
+       spin_lock_init(&priv->tx_lock);
+       spin_lock_init(&priv->irq_lock);
+       spin_lock_init(&priv->irq_th_lock);
+       spin_lock_init(&priv->rf_ps_lock);
+       spin_lock_init(&priv->ps_lock);
+       spin_lock_init(&priv->rf_lock);
+       spin_lock_init(&priv->rt_h2c_lock);
+#ifdef CONFIG_ASPM_OR_D3
+       spin_lock_init(&priv->D3_lock);
+#endif
+       sema_init(&priv->wx_sem,1);
+       sema_init(&priv->rf_sem,1);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
+       sema_init(&priv->mutex, 1);
+#else
+       mutex_init(&priv->mutex);
+#endif
+}
+
+static void rtl8192_init_priv_task(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+#ifdef PF_SYNCTHREAD
+       priv->priv_wq = create_workqueue(DRV_NAME,0);
+#else
+       priv->priv_wq = create_workqueue(DRV_NAME);
+#endif
+       INIT_WORK_RSL(&priv->reset_wq,  (void*)rtl8192_restart, dev);
+       INIT_WORK_RSL(&priv->rtllib->ips_leave_wq, (void*)IPSLeave_wq, dev);
+       INIT_DELAYED_WORK_RSL(&priv->watch_dog_wq, (void*)rtl819x_watchdog_wqcallback, dev);
+       INIT_DELAYED_WORK_RSL(&priv->txpower_tracking_wq,  (void*)dm_txpower_trackingcallback, dev);
+       INIT_DELAYED_WORK_RSL(&priv->rfpath_check_wq,  (void*)dm_rf_pathcheck_workitemcallback, dev);
+       INIT_DELAYED_WORK_RSL(&priv->update_beacon_wq, (void*)rtl8192_update_beacon, dev);
+       INIT_WORK_RSL(&priv->qos_activate, (void*)rtl8192_qos_activate, dev);
+       INIT_DELAYED_WORK_RSL(&priv->rtllib->hw_wakeup_wq,(void*) rtl8192_hw_wakeup_wq, dev);
+       INIT_DELAYED_WORK_RSL(&priv->rtllib->hw_sleep_wq,(void*) rtl8192_hw_sleep_wq, dev);
+       tasklet_init(&priv->irq_rx_tasklet,
+            (void(*)(unsigned long))rtl8192_irq_rx_tasklet,
+            (unsigned long)priv);
+       tasklet_init(&priv->irq_tx_tasklet,
+            (void(*)(unsigned long))rtl8192_irq_tx_tasklet,
+            (unsigned long)priv);
+        tasklet_init(&priv->irq_prepare_beacon_tasklet,
+                (void(*)(unsigned long))rtl8192_prepare_beacon,
+                (unsigned long)priv);
+}
+
+short rtl8192_get_channel_map(struct net_device * dev)
+{
+       int i;
+
+#ifdef ENABLE_DOT11D
+       struct r8192_priv *priv = rtllib_priv(dev);
+       if ((priv->rf_chip != RF_8225) && (priv->rf_chip != RF_8256)
+                       && (priv->rf_chip != RF_6052)) {
+               RT_TRACE(COMP_ERR, "%s: unknown rf chip, can't set channel map\n", __func__);
+               return -1;
+       }
+
+       if (priv->ChannelPlan > COUNTRY_CODE_MAX) {
+               printk("rtl819x_init:Error channel plan! Set to default.\n");
+               priv->ChannelPlan= COUNTRY_CODE_FCC;
+       }
+       RT_TRACE(COMP_INIT, "Channel plan is %d\n",priv->ChannelPlan);
+       Dot11d_Init(priv->rtllib);
+#ifndef CONFIG_CRDA
+       Dot11d_Channelmap(priv->ChannelPlan, priv->rtllib);
+#endif
+#else
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int ch;
+       if (!channels){
+               DMESG("No channels, aborting");
+               return -1;
+       }
+
+       ch = channels;
+       priv->ChannelPlan = 0;
+       for (i = 1; i <= 14; i++) {
+               (priv->rtllib->channel_map)[i] = (u8)(ch & 0x01);
+               ch >>= 1;
+       }
+       priv->rtllib->IbssStartChnl= 10;
+       priv->rtllib->ibss_maxjoin_chal = 11;
+#endif
+       for (i = 1; i <= 11; i++) {
+               (priv->rtllib->active_channel_map)[i] = 1;
+       }
+       (priv->rtllib->active_channel_map)[12] = 2;
+       (priv->rtllib->active_channel_map)[13] = 2;
+
+       return 0;
+}
+
+short rtl8192_init(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       memset(&(priv->stats),0,sizeof(struct Stats));
+#ifdef CONFIG_MP
+       rtl8192_init_mp(dev);
+#endif
+
+       rtl8192_dbgp_flag_init(dev);
+
+       rtl8192_init_priv_handler(dev);
+       rtl8192_init_priv_constant(dev);
+       rtl8192_init_priv_variable(dev);
+       rtl8192_init_priv_lock(priv);
+       rtl8192_init_priv_task(dev);
+       priv->ops->get_eeprom_size(dev);
+       priv->ops->init_adapter_variable(dev);
+       rtl8192_get_channel_map(dev);
+
+#ifdef CONFIG_CFG_80211
+       /* channel map setting for the cfg80211 style */
+       {
+               struct r8192_priv* priv = rtllib_priv(dev);
+               rtllib_set_geo(priv);
+       }
+#endif
+
+       init_hal_dm(dev);
+
+#if defined RTL8192SE || defined RTL8192CE
+       InitSwLeds(dev);
+#endif
+       init_timer(&priv->watch_dog_timer);
+       setup_timer(&priv->watch_dog_timer,
+                   watch_dog_timer_callback,
+                   (unsigned long) dev);
+
+       init_timer(&priv->gpio_polling_timer);
+       setup_timer(&priv->gpio_polling_timer,
+                   check_rfctrl_gpio_timer,
+                   (unsigned long)dev);
+
+       rtl8192_irq_disable(dev);
+#if defined(IRQF_SHARED)
+        if (request_irq(dev->irq, (void*)rtl8192_interrupt_rsl, IRQF_SHARED, dev->name, dev))
+#else
+        if (request_irq(dev->irq, (void *)rtl8192_interrupt_rsl, SA_SHIRQ, dev->name, dev))
+#endif
+       {
+               printk("Error allocating IRQ %d",dev->irq);
+               return -1;
+       } else {
+               priv->irq=dev->irq;
+               RT_TRACE(COMP_INIT, "IRQ %d\n",dev->irq);
+       }
+
+       if (rtl8192_pci_initdescring(dev) != 0) {
+               printk("Endopoints initialization failed");
+               return -1;
+       }
+
+       return 0;
+}
+
+#if defined CONFIG_ASPM_OR_D3
+static void
+rtl8192_update_default_setting(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+       pPSC->RegRfPsLevel = 0;
+       priv->bSupportASPM = 0;
+
+
+       pPSC->RegAMDPciASPM = priv->RegAMDPciASPM ;
+       switch (priv->RegPciASPM)
+       {
+       case 0:
+               break;
+
+       case 1:
+               pPSC->RegRfPsLevel |= RT_RF_LPS_LEVEL_ASPM;
+               break;
+
+       case 2:
+               pPSC->RegRfPsLevel |= (RT_RF_LPS_LEVEL_ASPM | RT_RF_OFF_LEVL_CLK_REQ);
+               break;
+
+       case 3:
+               pPSC->RegRfPsLevel &= ~(RT_RF_LPS_LEVEL_ASPM);
+               pPSC->RegRfPsLevel |= (RT_RF_PS_LEVEL_ALWAYS_ASPM | RT_RF_OFF_LEVL_CLK_REQ);
+               break;
+
+       case 4:
+               pPSC->RegRfPsLevel &= ~(RT_RF_LPS_LEVEL_ASPM | RT_RF_OFF_LEVL_CLK_REQ);
+               pPSC->RegRfPsLevel |= RT_RF_PS_LEVEL_ALWAYS_ASPM;
+               break;
+       }
+
+       pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_HALT_NIC;
+
+       switch (priv->RegHwSwRfOffD3)
+       {
+       case 1:
+               if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM)
+                       pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_ASPM;
+               break;
+
+       case 2:
+               if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM)
+                       pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_ASPM;
+               pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_HALT_NIC;
+               break;
+
+       case 3:
+               pPSC->RegRfPsLevel |= RT_RF_OFF_LEVL_PCI_D3;
+               break;
+       }
+
+
+       switch (priv->RegSupportPciASPM)
+       {
+       case 0:
+               {
+                       bool            bSupportASPM = false;
+                       priv->bSupportASPM = bSupportASPM;
+               }
+               break;
+
+       case 1:
+               {
+                       bool            bSupportASPM = true;
+                       priv->bSupportASPM = bSupportASPM;
+               }
+               break;
+
+       case 2:
+               if (priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_INTEL)
+               {
+                       bool            bSupportASPM = true;
+                       priv->bSupportASPM = bSupportASPM;
+               }
+               break;
+
+       default:
+               break;
+       }
+}
+#endif
+
+#if defined CONFIG_ASPM_OR_D3
+static void
+rtl8192_initialize_adapter_common(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+       rtl8192_update_default_setting(dev);
+
+#ifdef CONFIG_ASPM_OR_D3
+       if (pPSC->RegRfPsLevel & RT_RF_PS_LEVEL_ALWAYS_ASPM)
+       {
+               RT_ENABLE_ASPM(dev);
+               RT_SET_PS_LEVEL(pPSC, RT_RF_PS_LEVEL_ALWAYS_ASPM);
+       }
+#endif
+}
+#endif
+
+/***************************************************************************
+    -------------------------------WATCHDOG STUFF---------------------------
+***************************************************************************/
+short rtl8192_is_tx_queue_empty(struct net_device *dev)
+{
+       int i=0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       for (i=0; i<=MGNT_QUEUE; i++)
+       {
+               if ((i== TXCMD_QUEUE) || (i == HCCA_QUEUE) )
+                       continue;
+               if (skb_queue_len(&(&priv->tx_ring[i])->queue) > 0){
+                       printk("===>tx queue is not empty:%d, %d\n", i, skb_queue_len(&(&priv->tx_ring[i])->queue));
+                       return 0;
+               }
+       }
+       return 1;
+}
+
+RESET_TYPE
+rtl819x_TxCheckStuck(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8                      QueueID;
+       u8                      ResetThreshold = NIC_SEND_HANG_THRESHOLD_POWERSAVE;
+       bool                    bCheckFwTxCnt = false;
+       struct rtl8192_tx_ring  *ring = NULL;
+       struct sk_buff* skb = NULL;
+       cb_desc * tcb_desc = NULL;
+       unsigned long flags = 0;
+
+       switch (priv->rtllib->ps)
+       {
+               case RTLLIB_PS_DISABLED:
+                       ResetThreshold = NIC_SEND_HANG_THRESHOLD_NORMAL;
+                       break;
+               case (RTLLIB_PS_MBCAST|RTLLIB_PS_UNICAST):
+                       ResetThreshold = NIC_SEND_HANG_THRESHOLD_POWERSAVE;
+                       break;
+               default:
+                       ResetThreshold = NIC_SEND_HANG_THRESHOLD_POWERSAVE;
+                       break;
+       }
+       spin_lock_irqsave(&priv->irq_th_lock,flags);
+       for (QueueID = 0; QueueID < MAX_TX_QUEUE; QueueID++)
+       {
+               if (QueueID == TXCMD_QUEUE)
+                       continue;
+
+               if (QueueID == BEACON_QUEUE)
+                       continue;
+
+               ring = &priv->tx_ring[QueueID];
+
+               if (skb_queue_len(&ring->queue) == 0)
+                       continue;
+               else
+               {
+                       skb = (&ring->queue)->next;
+                       tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+                       tcb_desc->nStuckCount++;
+                       bCheckFwTxCnt = true;
+                       if (tcb_desc->nStuckCount > 1)
+                               printk("%s: QueueID=%d tcb_desc->nStuckCount=%d\n",__func__,QueueID,tcb_desc->nStuckCount);
+#if defined RTL8192SE || defined RTL8192CE
+                       if (tcb_desc->nStuckCount > ResetThreshold)
+                       {
+                               RT_TRACE( COMP_RESET, "TxCheckStuck(): Need silent reset because nStuckCount > ResetThreshold.\n" );
+                                spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+                               return RESET_TYPE_SILENT;
+                       }
+                       bCheckFwTxCnt = false;
+                       #endif
+               }
+       }
+       spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+
+       if (bCheckFwTxCnt) {
+               if (priv->ops->TxCheckStuckHandler(dev))
+               {
+                       RT_TRACE(COMP_RESET, "TxCheckStuck(): Fw indicates no Tx condition! \n");
+                       return RESET_TYPE_SILENT;
+               }
+       }
+
+       return RESET_TYPE_NORESET;
+}
+
+RESET_TYPE rtl819x_RxCheckStuck(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->ops->RxCheckStuckHandler(dev))
+       {
+               RT_TRACE(COMP_RESET, "RxStuck Condition\n");
+               return RESET_TYPE_SILENT;
+       }
+
+       return RESET_TYPE_NORESET;
+}
+
+RESET_TYPE
+rtl819x_ifcheck_resetornot(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       RESET_TYPE      TxResetType = RESET_TYPE_NORESET;
+       RESET_TYPE      RxResetType = RESET_TYPE_NORESET;
+       RT_RF_POWER_STATE       rfState;
+
+       rfState = priv->rtllib->eRFPowerState;
+
+       if (rfState == eRfOn)
+               TxResetType = rtl819x_TxCheckStuck(dev);
+
+       if ( rfState == eRfOn &&
+           (priv->rtllib->iw_mode == IW_MODE_INFRA) &&
+           (priv->rtllib->state == RTLLIB_LINKED)) {
+
+               RxResetType = rtl819x_RxCheckStuck(dev);
+       }
+
+       if (TxResetType==RESET_TYPE_NORMAL || RxResetType==RESET_TYPE_NORMAL){
+               printk("%s(): TxResetType is %d, RxResetType is %d\n",__func__,TxResetType,RxResetType);
+               return RESET_TYPE_NORMAL;
+       } else if (TxResetType==RESET_TYPE_SILENT || RxResetType==RESET_TYPE_SILENT){
+               printk("%s(): TxResetType is %d, RxResetType is %d\n",__func__,TxResetType,RxResetType);
+               return RESET_TYPE_SILENT;
+       } else {
+               return RESET_TYPE_NORESET;
+       }
+
+}
+
+void rtl819x_silentreset_mesh_bk(struct net_device *dev, u8 IsPortal)
+{
+}
+
+void rtl819x_ifsilentreset(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8      reset_times = 0;
+       int reset_status = 0;
+       struct rtllib_device *ieee = priv->rtllib;
+       unsigned long flag;
+
+       u8 IsPortal = 0;
+
+
+       if (priv->ResetProgress==RESET_TYPE_NORESET) {
+
+               RT_TRACE(COMP_RESET,"=========>Reset progress!! \n");
+
+               priv->ResetProgress = RESET_TYPE_SILENT;
+
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               if (priv->RFChangeInProgress)
+               {
+                       spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+                       goto END;
+               }
+               priv->RFChangeInProgress = true;
+               priv->bResetInProgress = true;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+
+RESET_START:
+
+               down(&priv->wx_sem);
+
+               if (priv->rtllib->state == RTLLIB_LINKED)
+                       LeisurePSLeave(dev);
+
+               if (IS_NIC_DOWN(priv)) {
+                       RT_TRACE(COMP_ERR,"%s():the driver is not up! return\n",__func__);
+                       up(&priv->wx_sem);
+                       return ;
+               }
+               priv->up = 0;
+
+               RT_TRACE(COMP_RESET,"%s():======>start to down the driver\n",__func__);
+               mdelay(1000);
+               RT_TRACE(COMP_RESET,"%s():111111111111111111111111======>start to down the driver\n",__func__);
+
+               if (!netif_queue_stopped(dev))
+                       netif_stop_queue(dev);
+
+               rtl8192_irq_disable(dev);
+               del_timer_sync(&priv->watch_dog_timer);
+               rtl8192_cancel_deferred_work(priv);
+               deinit_hal_dm(dev);
+               rtllib_stop_scan_syncro(ieee);
+
+               if (ieee->state == RTLLIB_LINKED) {
+                       SEM_DOWN_IEEE_WX(&ieee->wx_sem);
+                       printk("ieee->state is RTLLIB_LINKED\n");
+                       rtllib_stop_send_beacons(priv->rtllib);
+                       del_timer_sync(&ieee->associate_timer);
+                       cancel_delayed_work(&ieee->associate_retry_wq);
+                       rtllib_stop_scan(ieee);
+                       netif_carrier_off(dev);
+                       SEM_UP_IEEE_WX(&ieee->wx_sem);
+               } else {
+                       printk("ieee->state is NOT LINKED\n");
+                       rtllib_softmac_stop_protocol(priv->rtllib, 0 ,true);
+               }
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+               dm_backup_dynamic_mechanism_state(dev);
+#endif
+
+#ifdef RTL8190P
+               priv->ops->stop_adapter(dev, true);
+#endif
+
+               up(&priv->wx_sem);
+               RT_TRACE(COMP_RESET,"%s():<==========down process is finished\n",__func__);
+
+               RT_TRACE(COMP_RESET,"%s():<===========up process start\n",__func__);
+               reset_status = _rtl8192_up(dev,true);
+
+               RT_TRACE(COMP_RESET,"%s():<===========up process is finished\n",__func__);
+               if (reset_status == -1) {
+                       if (reset_times < 3) {
+                               reset_times++;
+                               goto RESET_START;
+                       } else {
+                               RT_TRACE(COMP_ERR," ERR!!! %s():  Reset Failed!!\n",__func__);
+                       }
+               }
+
+               ieee->is_silent_reset = 1;
+
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               priv->RFChangeInProgress = false;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+
+               EnableHWSecurityConfig8192(dev);
+
+               if (ieee->state == RTLLIB_LINKED && ieee->iw_mode == IW_MODE_INFRA) {
+                       ieee->set_chan(ieee->dev, ieee->current_network.channel);
+
+                       queue_work_rsl(ieee->wq, &ieee->associate_complete_wq);
+
+               } else if (ieee->state == RTLLIB_LINKED && ieee->iw_mode == IW_MODE_ADHOC) {
+                       ieee->set_chan(ieee->dev, ieee->current_network.channel);
+                       ieee->link_change(ieee->dev);
+
+                       notify_wx_assoc_event(ieee);
+
+                       rtllib_start_send_beacons(ieee);
+
+                       if (ieee->data_hard_resume)
+                               ieee->data_hard_resume(ieee->dev);
+                       netif_carrier_on(ieee->dev);
+               } else if (ieee->iw_mode == IW_MODE_MESH) {
+                       rtl819x_silentreset_mesh_bk(dev, IsPortal);
+               }
+
+               CamRestoreAllEntry(dev);
+#if !(defined RTL8192SE || defined RTL8192CE)
+               dm_restore_dynamic_mechanism_state(dev);
+#endif
+END:
+               priv->ResetProgress = RESET_TYPE_NORESET;
+               priv->reset_count++;
+
+               priv->bForcedSilentReset =false;
+               priv->bResetInProgress = false;
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+               write_nic_byte(dev, UFWP, 1);
+#endif
+               RT_TRACE(COMP_RESET, "Reset finished!! ====>[%d]\n", priv->reset_count);
+       }
+}
+
+void rtl819x_update_rxcounts(struct r8192_priv *priv,
+                            u32 *TotalRxBcnNum,
+                            u32 *TotalRxDataNum)
+{
+       u16                     SlotIndex;
+       u8                      i;
+
+       *TotalRxBcnNum = 0;
+       *TotalRxDataNum = 0;
+
+       SlotIndex = (priv->rtllib->LinkDetectInfo.SlotIndex++)%(priv->rtllib->LinkDetectInfo.SlotNum);
+       priv->rtllib->LinkDetectInfo.RxBcnNum[SlotIndex] = priv->rtllib->LinkDetectInfo.NumRecvBcnInPeriod;
+       priv->rtllib->LinkDetectInfo.RxDataNum[SlotIndex] = priv->rtllib->LinkDetectInfo.NumRecvDataInPeriod;
+       for (i = 0; i < priv->rtllib->LinkDetectInfo.SlotNum; i++) {
+               *TotalRxBcnNum += priv->rtllib->LinkDetectInfo.RxBcnNum[i];
+               *TotalRxDataNum += priv->rtllib->LinkDetectInfo.RxDataNum[i];
+       }
+}
+
+
+void   rtl819x_watchdog_wqcallback(void *data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       struct r8192_priv *priv = container_of_dwork_rsl(data,struct r8192_priv,watch_dog_wq);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+       struct rtllib_device* ieee = priv->rtllib;
+       RESET_TYPE      ResetType = RESET_TYPE_NORESET;
+       static u8       check_reset_cnt = 0;
+       unsigned long flags;
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       bool bBusyTraffic = false;
+       bool    bHigherBusyTraffic = false;
+       bool    bHigherBusyRxTraffic = false;
+       bool bEnterPS = false;
+
+       if (IS_NIC_DOWN(priv) || (priv->bHwRadioOff == true))
+               return;
+
+       if (priv->rtllib->state >= RTLLIB_LINKED) {
+               if (priv->rtllib->CntAfterLink<2)
+                       priv->rtllib->CntAfterLink++;
+       } else {
+               priv->rtllib->CntAfterLink = 0;
+       }
+
+       hal_dm_watchdog(dev);
+
+       if (rtllib_act_scanning(priv->rtllib,false) == false){
+               if ((ieee->iw_mode == IW_MODE_INFRA) && (ieee->state == RTLLIB_NOLINK) &&\
+                   (ieee->eRFPowerState == eRfOn)&&!ieee->is_set_key &&\
+                   (!ieee->proto_stoppping) && !ieee->wx_set_enc
+#ifdef CONFIG_RTLWIFI_DEBUGFS
+                   && (!priv->debug->hw_holding)
+#endif
+                ){
+                       if ((ieee->PowerSaveControl.ReturnPoint == IPS_CALLBACK_NONE)&&
+                           (!ieee->bNetPromiscuousMode))
+                       {
+                               RT_TRACE(COMP_PS, "====================>haha:IPSEnter()\n");
+                               IPSEnter(dev);
+                       }
+               }
+       }
+       {
+               if ((ieee->state == RTLLIB_LINKED) && (ieee->iw_mode == IW_MODE_INFRA) && (!ieee->bNetPromiscuousMode))
+               {
+                       if (    ieee->LinkDetectInfo.NumRxOkInPeriod> 100 ||
+                               ieee->LinkDetectInfo.NumTxOkInPeriod> 100 ) {
+                               bBusyTraffic = true;
+                       }
+
+
+                       if ( ieee->LinkDetectInfo.NumRxOkInPeriod > 4000 ||
+                               ieee->LinkDetectInfo.NumTxOkInPeriod > 4000 )
+                       {
+                               bHigherBusyTraffic = true;
+                               if (ieee->LinkDetectInfo.NumRxOkInPeriod > 5000)
+                                       bHigherBusyRxTraffic = true;
+                               else
+                                       bHigherBusyRxTraffic = false;
+                       }
+
+                       if (((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod + ieee->LinkDetectInfo.NumTxOkInPeriod) > 8) ||
+                               (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2))
+                               bEnterPS= false;
+                       else
+                               bEnterPS= true;
+
+                       if (ieee->current_network.beacon_interval < 95)
+                               bEnterPS= false;
+
+                       if (bEnterPS)
+                               LeisurePSEnter(dev);
+                       else
+                               LeisurePSLeave(dev);
+
+               } else {
+                       RT_TRACE(COMP_LPS,"====>no link LPS leave\n");
+                       LeisurePSLeave(dev);
+               }
+
+               ieee->LinkDetectInfo.NumRxOkInPeriod = 0;
+               ieee->LinkDetectInfo.NumTxOkInPeriod = 0;
+               ieee->LinkDetectInfo.NumRxUnicastOkInPeriod = 0;
+               ieee->LinkDetectInfo.bBusyTraffic = bBusyTraffic;
+
+               ieee->LinkDetectInfo.bHigherBusyTraffic = bHigherBusyTraffic;
+               ieee->LinkDetectInfo.bHigherBusyRxTraffic = bHigherBusyRxTraffic;
+
+       }
+
+       {
+#if defined RTL8192SE
+               if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
+                       IbssAgeFunction(ieee);
+#endif
+
+               if (ieee->state == RTLLIB_LINKED && ieee->iw_mode == IW_MODE_INFRA)
+               {
+                       u32     TotalRxBcnNum = 0;
+                       u32     TotalRxDataNum = 0;
+
+                       rtl819x_update_rxcounts(priv, &TotalRxBcnNum, &TotalRxDataNum);
+
+                       if ((TotalRxBcnNum+TotalRxDataNum) == 0)
+                               priv->check_roaming_cnt ++;
+                       else
+                               priv->check_roaming_cnt = 0;
+
+
+                       if (priv->check_roaming_cnt > 0)
+                       {
+                               if ( ieee->eRFPowerState == eRfOff)
+                                       RT_TRACE(COMP_ERR,"========>%s()\n",__func__);
+
+                               printk("===>%s(): AP is power off,chan:%d, connect another one\n",__func__, priv->chan);
+
+                               ieee->state = RTLLIB_ASSOCIATING;
+
+                               RemovePeerTS(priv->rtllib,priv->rtllib->current_network.bssid);
+                               ieee->is_roaming = true;
+                               ieee->is_set_key = false;
+                                ieee->link_change(dev);
+                               if (ieee->LedControlHandler)
+                                  ieee->LedControlHandler(ieee->dev, LED_CTL_START_TO_LINK);
+
+                               notify_wx_assoc_event(ieee);
+
+                               if (!(ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_CCMP|SEC_ALG_TKIP)))
+                                       queue_delayed_work_rsl(ieee->wq, &ieee->associate_procedure_wq, 0);
+
+                               priv->check_roaming_cnt = 0;
+                       }
+               }
+             ieee->LinkDetectInfo.NumRecvBcnInPeriod=0;
+              ieee->LinkDetectInfo.NumRecvDataInPeriod=0;
+
+       }
+
+       spin_lock_irqsave(&priv->tx_lock,flags);
+       if ((check_reset_cnt++ >= 3) && (!ieee->is_roaming) &&
+                       (!priv->RFChangeInProgress) && (!pPSC->bSwRfProcessing))
+       {
+               ResetType = rtl819x_ifcheck_resetornot(dev);
+               check_reset_cnt = 3;
+       }
+       spin_unlock_irqrestore(&priv->tx_lock,flags);
+
+       if (!priv->bDisableNormalResetCheck && ResetType == RESET_TYPE_NORMAL)
+       {
+               priv->ResetProgress = RESET_TYPE_NORMAL;
+               RT_TRACE(COMP_RESET,"%s(): NOMAL RESET\n",__func__);
+               return;
+       }
+
+       if ( ((priv->force_reset) || (!priv->bDisableNormalResetCheck && ResetType==RESET_TYPE_SILENT)))
+       {
+               rtl819x_ifsilentreset(dev);
+       }
+       priv->force_reset = false;
+       priv->bForcedSilentReset = false;
+       priv->bResetInProgress = false;
+       RT_TRACE(COMP_TRACE, " <==RtUsbCheckForHangWorkItemCallback()\n");
+}
+
+void watch_dog_timer_callback(unsigned long data)
+{
+       struct r8192_priv *priv = rtllib_priv((struct net_device *) data);
+       queue_delayed_work_rsl(priv->priv_wq,&priv->watch_dog_wq,0);
+       mod_timer(&priv->watch_dog_timer, jiffies + MSECS(RTLLIB_WATCH_DOG_TIME));
+}
+
+/****************************************************************************
+ ---------------------------- NIC TX/RX STUFF---------------------------
+*****************************************************************************/
+void rtl8192_rx_enable(struct net_device *dev)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       priv->ops->rx_enable(dev);
+}
+
+void rtl8192_tx_enable(struct net_device *dev)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       priv->ops->tx_enable(dev);
+
+    rtllib_reset_queue(priv->rtllib);
+}
+
+
+static void rtl8192_free_rx_ring(struct net_device *dev)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+       int i,rx_queue_idx;
+
+       for (rx_queue_idx = 0; rx_queue_idx < MAX_RX_QUEUE; rx_queue_idx ++){
+    for (i = 0; i < priv->rxringcount; i++) {
+                       struct sk_buff *skb = priv->rx_buf[rx_queue_idx][i];
+        if (!skb)
+            continue;
+
+        pci_unmap_single(priv->pdev,
+                *((dma_addr_t *)skb->cb),
+                priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+        kfree_skb(skb);
+    }
+
+               pci_free_consistent(priv->pdev, sizeof(*priv->rx_ring[rx_queue_idx]) * priv->rxringcount,
+                       priv->rx_ring[rx_queue_idx], priv->rx_ring_dma[rx_queue_idx]);
+               priv->rx_ring[rx_queue_idx] = NULL;
+       }
+}
+
+static void rtl8192_free_tx_ring(struct net_device *dev, unsigned int prio)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+    while (skb_queue_len(&ring->queue)) {
+        tx_desc *entry = &ring->desc[ring->idx];
+        struct sk_buff *skb = __skb_dequeue(&ring->queue);
+
+        pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+                skb->len, PCI_DMA_TODEVICE);
+        kfree_skb(skb);
+        ring->idx = (ring->idx + 1) % ring->entries;
+    }
+
+    pci_free_consistent(priv->pdev, sizeof(*ring->desc)*ring->entries,
+            ring->desc, ring->dma);
+    ring->desc = NULL;
+}
+
+void rtl8192_data_hard_stop(struct net_device *dev)
+{
+}
+
+
+void rtl8192_data_hard_resume(struct net_device *dev)
+{
+}
+
+void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       int ret;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       u8 queue_index = tcb_desc->queue_index;
+
+       if ((priv->rtllib->eRFPowerState == eRfOff) || IS_NIC_DOWN(priv) || priv->bResetInProgress){
+               kfree_skb(skb);
+               return;
+       }
+
+       assert(queue_index != TXCMD_QUEUE);
+
+
+        memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
+       skb_push(skb, priv->rtllib->tx_headroom);
+       ret = rtl8192_tx(dev, skb);
+       if (ret != 0) {
+               kfree_skb(skb);
+       };
+
+       if (queue_index!=MGNT_QUEUE) {
+               priv->rtllib->stats.tx_bytes+=(skb->len - priv->rtllib->tx_headroom);
+               priv->rtllib->stats.tx_packets++;
+       }
+
+
+       return;
+}
+
+int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       int ret;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       u8 queue_index = tcb_desc->queue_index;
+
+       if (queue_index != TXCMD_QUEUE){
+               if ((priv->rtllib->eRFPowerState == eRfOff) ||IS_NIC_DOWN(priv) || priv->bResetInProgress){
+                       kfree_skb(skb);
+                       return 0;
+               }
+       }
+
+       memcpy((unsigned char *)(skb->cb),&dev,sizeof(dev));
+       if (queue_index == TXCMD_QUEUE) {
+               rtl8192_tx_cmd(dev, skb);
+               ret = 0;
+               return ret;
+       } else {
+               tcb_desc->RATRIndex = 7;
+               tcb_desc->bTxDisableRateFallBack = 1;
+               tcb_desc->bTxUseDriverAssingedRate = 1;
+               tcb_desc->bTxEnableFwCalcDur = 1;
+               skb_push(skb, priv->rtllib->tx_headroom);
+               ret = rtl8192_tx(dev, skb);
+               if (ret != 0) {
+                       kfree_skb(skb);
+               };
+       }
+
+
+
+       return ret;
+
+}
+
+void rtl8192_tx_isr(struct net_device *dev, int prio)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+    struct rtl8192_tx_ring *ring = &priv->tx_ring[prio];
+
+    while (skb_queue_len(&ring->queue)) {
+        tx_desc *entry = &ring->desc[ring->idx];
+        struct sk_buff *skb;
+
+        if (prio != BEACON_QUEUE) {
+            if (entry->OWN)
+                return;
+            ring->idx = (ring->idx + 1) % ring->entries;
+        }
+
+        skb = __skb_dequeue(&ring->queue);
+        pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+                skb->len, PCI_DMA_TODEVICE);
+
+        kfree_skb(skb);
+    }
+    if (prio != BEACON_QUEUE) {
+        tasklet_schedule(&priv->irq_tx_tasklet);
+    }
+
+}
+
+void rtl8192_tx_cmd(struct net_device *dev, struct sk_buff *skb)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    struct rtl8192_tx_ring *ring;
+    tx_desc_cmd* entry;
+    unsigned int idx;
+    cb_desc *tcb_desc;
+    unsigned long flags;
+
+    spin_lock_irqsave(&priv->irq_th_lock,flags);
+    ring = &priv->tx_ring[TXCMD_QUEUE];
+
+    idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+    entry = (tx_desc_cmd*) &ring->desc[idx];
+
+    tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+
+    priv->ops->tx_fill_cmd_descriptor(dev, entry, tcb_desc, skb);
+
+    __skb_queue_tail(&ring->queue, skb);
+    spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+
+    return;
+}
+
+short rtl8192_tx(struct net_device *dev, struct sk_buff* skb)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtl8192_tx_ring  *ring;
+       unsigned long flags;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       tx_desc *pdesc = NULL;
+       struct rtllib_hdr_1addr * header = NULL;
+       u16 fc=0, type=0,stype=0;
+       bool  multi_addr=false,broad_addr=false,uni_addr=false;
+       u8*   pda_addr = NULL;
+       int   idx;
+       u32 fwinfo_size = 0;
+
+       if (priv->bdisable_nic){
+               RT_TRACE(COMP_ERR,"%s: ERR!! Nic is disabled! Can't tx packet len=%d qidx=%d!!!\n", __func__, skb->len, tcb_desc->queue_index);
+                       return skb->len;
+       }
+
+       priv->rtllib->bAwakePktSent = true;
+
+#if defined RTL8192SE || defined RTL8192CE
+       fwinfo_size = 0;
+#else
+       fwinfo_size = sizeof(TX_FWINFO_8190PCI);
+#endif
+
+       header = (struct rtllib_hdr_1addr *)(((u8*)skb->data) + fwinfo_size);
+       fc = header->frame_ctl;
+       type = WLAN_FC_GET_TYPE(fc);
+       stype = WLAN_FC_GET_STYPE(fc);
+       pda_addr = header->addr1;
+
+       if (is_multicast_ether_addr(pda_addr))
+               multi_addr = true;
+       else if (is_broadcast_ether_addr(pda_addr))
+               broad_addr = true;
+       else {
+               uni_addr = true;
+       }
+
+       if (uni_addr)
+               priv->stats.txbytesunicast += skb->len - fwinfo_size;
+       else if (multi_addr)
+               priv->stats.txbytesmulticast += skb->len - fwinfo_size;
+       else
+               priv->stats.txbytesbroadcast += skb->len - fwinfo_size;
+
+       spin_lock_irqsave(&priv->irq_th_lock,flags);
+       ring = &priv->tx_ring[tcb_desc->queue_index];
+       if (tcb_desc->queue_index != BEACON_QUEUE) {
+               idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+       } else {
+#ifdef _ENABLE_SW_BEACON
+               idx = (ring->idx + skb_queue_len(&ring->queue)) % ring->entries;
+#else
+               idx = 0;
+#endif
+       }
+
+       pdesc = &ring->desc[idx];
+       if ((pdesc->OWN == 1) && (tcb_desc->queue_index != BEACON_QUEUE)) {
+               RT_TRACE(COMP_ERR,"No more TX desc@%d, ring->idx = %d,idx = %d, skblen = 0x%x queuelen=%d", \
+                               tcb_desc->queue_index,ring->idx, idx,skb->len, skb_queue_len(&ring->queue));
+               spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+               return skb->len;
+       }
+
+       if (tcb_desc->queue_index == MGNT_QUEUE){
+       }
+
+       if (type == RTLLIB_FTYPE_DATA){
+               if (priv->rtllib->LedControlHandler)
+                       priv->rtllib->LedControlHandler(dev, LED_CTL_TX);
+       }
+       priv->ops->tx_fill_descriptor(dev, pdesc, tcb_desc, skb);
+       __skb_queue_tail(&ring->queue, skb);
+       pdesc->OWN = 1;
+       spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+       dev->trans_start = jiffies;
+
+#ifdef RTL8192CE
+       if (tcb_desc->queue_index == BEACON_QUEUE){
+               write_nic_word(dev, REG_PCIE_CTRL_REG, BIT4);
+       }else{
+               write_nic_word(dev, REG_PCIE_CTRL_REG, BIT0<<(tcb_desc->queue_index));
+       }
+#else
+               write_nic_word(dev,TPPoll,0x01<<tcb_desc->queue_index);
+#endif
+       return 0;
+}
+
+short rtl8192_alloc_rx_desc_ring(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       rx_desc *entry = NULL;
+       int i, rx_queue_idx;
+
+       for (rx_queue_idx = 0; rx_queue_idx < MAX_RX_QUEUE; rx_queue_idx ++){
+               priv->rx_ring[rx_queue_idx] = pci_alloc_consistent(priv->pdev,
+               sizeof(*priv->rx_ring[rx_queue_idx]) * priv->rxringcount, &priv->rx_ring_dma[rx_queue_idx]);
+
+               if (!priv->rx_ring[rx_queue_idx] || (unsigned long)priv->rx_ring[rx_queue_idx] & 0xFF) {
+                       RT_TRACE(COMP_ERR,"Cannot allocate RX ring\n");
+                       return -ENOMEM;
+               }
+
+               memset(priv->rx_ring[rx_queue_idx], 0, sizeof(*priv->rx_ring[rx_queue_idx]) * priv->rxringcount);
+               priv->rx_idx[rx_queue_idx] = 0;
+
+               for (i = 0; i < priv->rxringcount; i++) {
+                       struct sk_buff *skb = dev_alloc_skb(priv->rxbuffersize);
+                       dma_addr_t *mapping;
+                       entry = &priv->rx_ring[rx_queue_idx][i];
+                       if (!skb)
+                               return 0;
+                       skb->dev = dev;
+                       priv->rx_buf[rx_queue_idx][i] = skb;
+                       mapping = (dma_addr_t *)skb->cb;
+                       *mapping = pci_map_single(priv->pdev, skb_tail_pointer_rsl(skb),
+                       priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+
+                       entry->BufferAddress = cpu_to_le32(*mapping);
+
+                       entry->Length = priv->rxbuffersize;
+                       entry->OWN = 1;
+               }
+
+               entry->EOR = 1;
+       }
+       return 0;
+}
+
+static int rtl8192_alloc_tx_desc_ring(struct net_device *dev,
+        unsigned int prio, unsigned int entries)
+{
+    struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+    tx_desc *ring;
+    dma_addr_t dma;
+    int i;
+
+    ring = pci_alloc_consistent(priv->pdev, sizeof(*ring) * entries, &dma);
+    if (!ring || (unsigned long)ring & 0xFF) {
+        RT_TRACE(COMP_ERR, "Cannot allocate TX ring (prio = %d)\n", prio);
+        return -ENOMEM;
+    }
+
+    memset(ring, 0, sizeof(*ring)*entries);
+    priv->tx_ring[prio].desc = ring;
+    priv->tx_ring[prio].dma = dma;
+    priv->tx_ring[prio].idx = 0;
+    priv->tx_ring[prio].entries = entries;
+    skb_queue_head_init(&priv->tx_ring[prio].queue);
+
+    for (i = 0; i < entries; i++)
+        ring[i].NextDescAddress =
+            cpu_to_le32((u32)dma + ((i + 1) % entries) * sizeof(*ring));
+
+    return 0;
+}
+
+
+short rtl8192_pci_initdescring(struct net_device *dev)
+{
+    u32 ret;
+    int i;
+    struct r8192_priv *priv = rtllib_priv(dev);
+
+    ret = rtl8192_alloc_rx_desc_ring(dev);
+    if (ret) {
+        return ret;
+    }
+
+
+    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+        if ((ret = rtl8192_alloc_tx_desc_ring(dev, i, priv->txringcount)))
+            goto err_free_rings;
+    }
+
+    return 0;
+
+err_free_rings:
+    rtl8192_free_rx_ring(dev);
+    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++)
+        if (priv->tx_ring[i].desc)
+            rtl8192_free_tx_ring(dev, i);
+    return 1;
+}
+
+void rtl8192_pci_resetdescring(struct net_device *dev)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+       int i,rx_queue_idx;
+    unsigned long flags = 0;
+
+       for (rx_queue_idx = 0; rx_queue_idx < MAX_RX_QUEUE; rx_queue_idx ++){
+               if (priv->rx_ring[rx_queue_idx]) {
+                       rx_desc *entry = NULL;
+                       for (i = 0; i < priv->rxringcount; i++) {
+                               entry = &priv->rx_ring[rx_queue_idx][i];
+                               entry->OWN = 1;
+                       }
+                       priv->rx_idx[rx_queue_idx] = 0;
+               }
+       }
+
+    spin_lock_irqsave(&priv->irq_th_lock,flags);
+    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+        if (priv->tx_ring[i].desc) {
+            struct rtl8192_tx_ring *ring = &priv->tx_ring[i];
+
+            while (skb_queue_len(&ring->queue)) {
+                tx_desc *entry = &ring->desc[ring->idx];
+                struct sk_buff *skb = __skb_dequeue(&ring->queue);
+
+                pci_unmap_single(priv->pdev, le32_to_cpu(entry->TxBuffAddr),
+                        skb->len, PCI_DMA_TODEVICE);
+                kfree_skb(skb);
+                ring->idx = (ring->idx + 1) % ring->entries;
+            }
+            ring->idx = 0;
+        }
+    }
+    spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+}
+
+void rtl819x_UpdateRxPktTimeStamp (struct net_device *dev, struct rtllib_rx_stats *stats)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       if (stats->bIsAMPDU && !stats->bFirstMPDU) {
+               stats->mac_time[0] = priv->LastRxDescTSFLow;
+               stats->mac_time[1] = priv->LastRxDescTSFHigh;
+       } else {
+               priv->LastRxDescTSFLow = stats->mac_time[0];
+               priv->LastRxDescTSFHigh = stats->mac_time[1];
+       }
+}
+
+long rtl819x_translate_todbm(struct r8192_priv * priv, u8 signal_strength_index        )
+{
+       long    signal_power;
+
+       signal_power = (long)((signal_strength_index + 1) >> 1);
+       signal_power -= 95;
+
+       return signal_power;
+}
+
+
+void
+rtl819x_update_rxsignalstatistics8190pci(
+       struct r8192_priv * priv,
+       struct rtllib_rx_stats * pprevious_stats
+       )
+{
+       int weighting = 0;
+
+
+       if (priv->stats.recv_signal_power == 0)
+               priv->stats.recv_signal_power = pprevious_stats->RecvSignalPower;
+
+       if (pprevious_stats->RecvSignalPower > priv->stats.recv_signal_power)
+               weighting = 5;
+       else if (pprevious_stats->RecvSignalPower < priv->stats.recv_signal_power)
+               weighting = (-5);
+       priv->stats.recv_signal_power = (priv->stats.recv_signal_power * 5 + pprevious_stats->RecvSignalPower + weighting) / 6;
+}
+
+void
+rtl819x_process_cck_rxpathsel(
+       struct r8192_priv * priv,
+       struct rtllib_rx_stats * pprevious_stats
+       )
+{
+#ifdef RTL8190P
+       char                            last_cck_adc_pwdb[4]={0,0,0,0};
+       u8                              i;
+               if (priv->rf_type == RF_2T4R && DM_RxPathSelTable.Enable)
+               {
+                       if (pprevious_stats->bIsCCK &&
+                               (pprevious_stats->bPacketToSelf ||pprevious_stats->bPacketBeacon))
+                       {
+                               if (priv->stats.cck_adc_pwdb.TotalNum++ >= PHY_RSSI_SLID_WIN_MAX)
+                               {
+                                       priv->stats.cck_adc_pwdb.TotalNum = PHY_RSSI_SLID_WIN_MAX;
+                                       for (i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+                                       {
+                                               last_cck_adc_pwdb[i] = priv->stats.cck_adc_pwdb.elements[i][priv->stats.cck_adc_pwdb.index];
+                                               priv->stats.cck_adc_pwdb.TotalVal[i] -= last_cck_adc_pwdb[i];
+                                       }
+                               }
+                               for (i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+                               {
+                                       priv->stats.cck_adc_pwdb.TotalVal[i] += pprevious_stats->cck_adc_pwdb[i];
+                                       priv->stats.cck_adc_pwdb.elements[i][priv->stats.cck_adc_pwdb.index] = pprevious_stats->cck_adc_pwdb[i];
+                               }
+                               priv->stats.cck_adc_pwdb.index++;
+                               if (priv->stats.cck_adc_pwdb.index >= PHY_RSSI_SLID_WIN_MAX)
+                                       priv->stats.cck_adc_pwdb.index = 0;
+
+                               for (i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+                               {
+                                       DM_RxPathSelTable.cck_pwdb_sta[i] = priv->stats.cck_adc_pwdb.TotalVal[i]/priv->stats.cck_adc_pwdb.TotalNum;
+                               }
+
+                               for (i=RF90_PATH_A; i<RF90_PATH_MAX; i++)
+                               {
+                                       if (pprevious_stats->cck_adc_pwdb[i]  > (char)priv->undecorated_smoothed_cck_adc_pwdb[i])
+                                       {
+                                               priv->undecorated_smoothed_cck_adc_pwdb[i] =
+                                                       ( (priv->undecorated_smoothed_cck_adc_pwdb[i]*(Rx_Smooth_Factor-1)) +
+                                                       (pprevious_stats->cck_adc_pwdb[i])) /(Rx_Smooth_Factor);
+                                               priv->undecorated_smoothed_cck_adc_pwdb[i] = priv->undecorated_smoothed_cck_adc_pwdb[i] + 1;
+                                       }
+                                       else
+                                       {
+                                               priv->undecorated_smoothed_cck_adc_pwdb[i] =
+                                                       ( (priv->undecorated_smoothed_cck_adc_pwdb[i]*(Rx_Smooth_Factor-1)) +
+                                                       (pprevious_stats->cck_adc_pwdb[i])) /(Rx_Smooth_Factor);
+                                       }
+                               }
+                       }
+               }
+#endif
+}
+
+
+u8 rtl819x_query_rxpwrpercentage(
+       char            antpower
+       )
+{
+       if ((antpower <= -100) || (antpower >= 20))
+       {
+               return  0;
+       }
+       else if (antpower >= 0)
+       {
+               return  100;
+       }
+       else
+       {
+               return  (100+antpower);
+       }
+
+}      /* QueryRxPwrPercentage */
+
+u8
+rtl819x_evm_dbtopercentage(
+       char value
+       )
+{
+       char ret_val;
+
+       ret_val = value;
+
+       if (ret_val >= 0)
+               ret_val = 0;
+       if (ret_val <= -33)
+               ret_val = -33;
+       ret_val = 0 - ret_val;
+       ret_val*=3;
+       if (ret_val == 99)
+               ret_val = 100;
+       return(ret_val);
+}
+
+void
+rtl8192_record_rxdesc_forlateruse(
+       struct rtllib_rx_stats * psrc_stats,
+       struct rtllib_rx_stats * ptarget_stats
+)
+{
+       ptarget_stats->bIsAMPDU = psrc_stats->bIsAMPDU;
+       ptarget_stats->bFirstMPDU = psrc_stats->bFirstMPDU;
+}
+
+
+
+void rtl8192_rx_normal(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct rtllib_hdr_1addr *rtllib_hdr = NULL;
+       bool unicast_packet = false;
+       bool bLedBlinking=true;
+       u16 fc=0, type=0;
+       u32 skb_len = 0;
+       int rx_queue_idx = RX_MPDU_QUEUE;
+
+       struct rtllib_rx_stats stats = {
+               .signal = 0,
+               .noise = -98,
+               .rate = 0,
+               .freq = RTLLIB_24GHZ_BAND,
+       };
+       unsigned int count = priv->rxringcount;
+
+       stats.nic_type = NIC_8192E;
+
+       while (count--) {
+               rx_desc *pdesc = &priv->rx_ring[rx_queue_idx][priv->rx_idx[rx_queue_idx]];
+               struct sk_buff *skb = priv->rx_buf[rx_queue_idx][priv->rx_idx[rx_queue_idx]];
+
+               if (pdesc->OWN){
+                       return;
+               } else {
+
+                       struct sk_buff *new_skb = NULL;
+                       if (!priv->ops->rx_query_status_descriptor(dev, &stats, pdesc, skb))
+                               goto done;
+
+                       pci_unmap_single(priv->pdev,
+                                       *((dma_addr_t *)skb->cb),
+                                       priv->rxbuffersize,
+                                       PCI_DMA_FROMDEVICE);
+
+                       skb_put(skb, pdesc->Length);
+                       skb_reserve(skb, stats.RxDrvInfoSize + stats.RxBufShift);
+                       skb_trim(skb, skb->len - 4/*sCrcLng*/);
+                       rtllib_hdr = (struct rtllib_hdr_1addr *)skb->data;
+                       if (is_broadcast_ether_addr(rtllib_hdr->addr1)) {
+                       }else if (is_multicast_ether_addr(rtllib_hdr->addr1)){
+                       }else {
+                               /* unicast packet */
+                               unicast_packet = true;
+                       }
+                       fc = le16_to_cpu(rtllib_hdr->frame_ctl);
+                       type = WLAN_FC_GET_TYPE(fc);
+                       if (type == RTLLIB_FTYPE_MGMT)
+                       {
+                               bLedBlinking = false;
+                       }
+                       if (bLedBlinking)
+                               if (priv->rtllib->LedControlHandler)
+                               priv->rtllib->LedControlHandler(dev, LED_CTL_RX);
+
+                       if (stats.bCRC) {
+                               if (type != RTLLIB_FTYPE_MGMT)
+                                       priv->stats.rxdatacrcerr ++;
+                               else
+                                       priv->stats.rxmgmtcrcerr ++;
+                       }
+
+                       skb_len = skb->len;
+
+#ifdef RTL8192CE
+                       if (!stats.bCRC)
+#else
+                       if (1)
+#endif
+                       {
+                       if (!rtllib_rx(priv->rtllib, skb, &stats)){
+                               dev_kfree_skb_any(skb);
+                       } else {
+                               priv->stats.rxok++;
+                               if (unicast_packet) {
+                                       priv->stats.rxbytesunicast += skb_len;
+                               }
+                       }
+                       }else{
+                               dev_kfree_skb_any(skb);
+                       }
+#if 1
+                       new_skb = dev_alloc_skb(priv->rxbuffersize);
+                       if (unlikely(!new_skb))
+                       {
+                               printk("==========>can't alloc skb for rx\n");
+                               goto done;
+                       }
+                       skb=new_skb;
+                        skb->dev = dev;
+#endif
+                       priv->rx_buf[rx_queue_idx][priv->rx_idx[rx_queue_idx]] = skb;
+                       *((dma_addr_t *) skb->cb) = pci_map_single(priv->pdev, skb_tail_pointer_rsl(skb), priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+
+               }
+done:
+               pdesc->BufferAddress = cpu_to_le32(*((dma_addr_t *)skb->cb));
+               pdesc->OWN = 1;
+               pdesc->Length = priv->rxbuffersize;
+               if (priv->rx_idx[rx_queue_idx] == priv->rxringcount-1)
+                       pdesc->EOR = 1;
+               priv->rx_idx[rx_queue_idx] = (priv->rx_idx[rx_queue_idx] + 1) % priv->rxringcount;
+       }
+
+}
+
+void rtl8192_rx_cmd(struct net_device *dev)
+{
+#ifdef RTL8192SE
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       unsigned int count = priv->rxringcount;
+       int rx_queue_idx = RX_CMD_QUEUE;
+
+       struct rtllib_rx_stats stats = {
+               .signal = 0,
+               .noise = -98,
+               .rate = 0,
+               .freq = RTLLIB_24GHZ_BAND,
+       };
+       stats.nic_type = NIC_8192E;
+
+       while (count--) {
+               rx_desc *pdesc = &priv->rx_ring[rx_queue_idx][priv->rx_idx[rx_queue_idx]];
+               struct sk_buff *skb = priv->rx_buf[rx_queue_idx][priv->rx_idx[rx_queue_idx]];
+
+               if (pdesc->OWN){
+                       return;
+               } else {
+                       struct sk_buff *new_skb = NULL;
+
+                       pci_unmap_single(priv->pdev,
+                                       *((dma_addr_t *)skb->cb),
+                                       priv->rxbuffersize,
+                                       PCI_DMA_FROMDEVICE);
+
+                       skb_put(skb, pdesc->Length);
+
+                       if (pdesc->MACID == 0x1e) {
+
+                               pdesc->Length = pdesc->Length - 32;
+                               pdesc->DrvInfoSize = 4;
+                               printk(">>>>%s()CMD PKT RX, beacon_len:%d payload_len:%d\n",__func__, pdesc->Length,skb->len);
+
+
+                               priv->ops->rx_query_status_descriptor(dev, &stats, pdesc, skb);
+                               skb_reserve(skb, stats.RxDrvInfoSize + stats.RxBufShift);
+                       }
+
+                       skb_trim(skb, skb->len - 4/*sCrcLng*/);
+
+                       if (pdesc->MACID == 0x1e){
+                               if (!rtllib_rx(priv->rtllib, skb, &stats)){
+                                       dev_kfree_skb_any(skb);
+                               }
+                       }else{
+                       if (priv->ops->rx_command_packet_handler != NULL)
+                               priv->ops->rx_command_packet_handler(dev, skb, pdesc);
+                       dev_kfree_skb_any(skb);
+                       }
+
+
+                       new_skb = dev_alloc_skb(priv->rxbuffersize);
+                       if (unlikely(!new_skb))
+                       {
+                               printk("==========>can't alloc skb for rx\n");
+                               goto done;
+                       }
+                       skb=new_skb;
+                        skb->dev = dev;
+
+                       priv->rx_buf[rx_queue_idx][priv->rx_idx[rx_queue_idx]] = skb;
+                       *((dma_addr_t *) skb->cb) = pci_map_single(priv->pdev, skb_tail_pointer_rsl(skb), priv->rxbuffersize, PCI_DMA_FROMDEVICE);
+
+               }
+done:
+               pdesc->BufferAddress = cpu_to_le32(*((dma_addr_t *)skb->cb));
+               pdesc->OWN = 1;
+               pdesc->Length = priv->rxbuffersize;
+               if (priv->rx_idx[rx_queue_idx] == priv->rxringcount-1)
+                       pdesc->EOR = 1;
+               priv->rx_idx[rx_queue_idx] = (priv->rx_idx[rx_queue_idx] + 1) % priv->rxringcount;
+       }
+#endif
+}
+
+
+void rtl8192_tx_resume(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct rtllib_device *ieee = priv->rtllib;
+       struct sk_buff *skb;
+       int queue_index;
+
+       for (queue_index = BK_QUEUE; queue_index < MAX_QUEUE_SIZE;queue_index++) {
+               while ((!skb_queue_empty(&ieee->skb_waitQ[queue_index]))&&
+                      (priv->rtllib->check_nic_enough_desc(dev,queue_index) > 0)) {
+                       skb = skb_dequeue(&ieee->skb_waitQ[queue_index]);
+                       ieee->softmac_data_hard_start_xmit(skb,dev,0/* rate useless now*/);
+               }
+       }
+}
+
+void rtl8192_irq_tx_tasklet(struct r8192_priv *priv)
+{
+       rtl8192_tx_resume(priv->rtllib->dev);
+}
+
+void rtl8192_irq_rx_tasklet(struct r8192_priv *priv)
+{
+       rtl8192_rx_normal(priv->rtllib->dev);
+
+       if (MAX_RX_QUEUE > 1)
+               rtl8192_rx_cmd(priv->rtllib->dev);
+
+#ifndef RTL8192CE
+       write_nic_dword(priv->rtllib->dev, INTA_MASK,read_nic_dword(priv->rtllib->dev, INTA_MASK) | IMR_RDU);
+#endif
+}
+
+/****************************************************************************
+ ---------------------------- NIC START/CLOSE STUFF---------------------------
+*****************************************************************************/
+void rtl8192_cancel_deferred_work(struct r8192_priv* priv)
+{
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       cancel_delayed_work(&priv->watch_dog_wq);
+       cancel_delayed_work(&priv->update_beacon_wq);
+#ifndef RTL8190P
+       cancel_delayed_work(&priv->rtllib->hw_sleep_wq);
+#endif
+#if defined RTL8192SE
+       cancel_delayed_work(&priv->check_hw_scan_wq);
+       cancel_delayed_work(&priv->hw_scan_simu_wq);
+       cancel_delayed_work(&priv->start_hw_scan_wq);
+       cancel_delayed_work(&priv->rtllib->update_assoc_sta_info_wq);
+       cancel_delayed_work(&priv->rtllib->check_tsf_wq);
+#endif
+#endif
+
+#if LINUX_VERSION_CODE >=KERNEL_VERSION(2,6,22)
+       cancel_work_sync(&priv->reset_wq);
+       cancel_work_sync(&priv->qos_activate);
+#elif ((LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)))
+       cancel_delayed_work(&priv->reset_wq);
+       cancel_delayed_work(&priv->qos_activate);
+#if defined RTL8192SE
+       cancel_delayed_work(&priv->rtllib->update_assoc_sta_info_wq);
+       cancel_delayed_work(&priv->rtllib->check_tsf_wq);
+#endif
+#endif
+
+}
+
+int _rtl8192_up(struct net_device *dev,bool is_silent_reset)
+{
+       if (_rtl8192_sta_up(dev, is_silent_reset) == -1)
+               return -1;
+       return 0;
+}
+
+
+int rtl8192_open(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int ret;
+
+       down(&priv->wx_sem);
+       ret = rtl8192_up(dev);
+       up(&priv->wx_sem);
+       return ret;
+
+}
+
+
+int rtl8192_up(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->up == 1) return -1;
+       return _rtl8192_up(dev,false);
+}
+
+
+int rtl8192_close(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int ret;
+
+       if ((rtllib_act_scanning(priv->rtllib, false)) &&
+               !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
+               rtllib_stop_scan(priv->rtllib);
+       }
+
+       down(&priv->wx_sem);
+
+       ret = rtl8192_down(dev,true);
+
+       up(&priv->wx_sem);
+
+       return ret;
+
+}
+
+int rtl8192_down(struct net_device *dev, bool shutdownrf)
+{
+#ifdef CONFIG_MP
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+
+       if (rtl8192_sta_down(dev, shutdownrf) == -1)
+               return -1;
+
+#ifdef CONFIG_MP
+       if (priv->bCckContTx) {
+               RT_TRACE(COMP_DBG, "####RTL819X MP####stop single cck continious TX\n");
+               mpt_StopCckCoNtTx(dev);
+       }
+       if (priv->bOfdmContTx) {
+               RT_TRACE(COMP_DBG, "####RTL819X MP####stop single ofdm continious TX\n");
+               mpt_StopOfdmContTx(dev);
+       }
+       if (priv->bSingleCarrier) {
+               RT_TRACE(COMP_DBG, "####RTL819X MP####stop single carrier mode\n");
+               MPT_ProSetSingleCarrier(dev, false);
+       }
+#endif
+       return 0;
+}
+
+void rtl8192_commit(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->up == 0) return ;
+       rtllib_softmac_stop_protocol(priv->rtllib, 0 , true);
+       rtl8192_irq_disable(dev);
+       priv->ops->stop_adapter(dev, true);
+       _rtl8192_up(dev,false);
+}
+
+void rtl8192_restart(void *data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       struct r8192_priv *priv = container_of_work_rsl(data, struct r8192_priv, reset_wq);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+        struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+
+       down(&priv->wx_sem);
+
+       rtl8192_commit(dev);
+
+       up(&priv->wx_sem);
+}
+
+static void r8192_set_multicast(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       short promisc;
+
+
+
+       promisc = (dev->flags & IFF_PROMISC) ? 1:0;
+
+       if (promisc != priv->promisc) {
+               ;
+       }
+
+       priv->promisc = promisc;
+
+}
+
+
+int r8192_set_mac_adr(struct net_device *dev, void *mac)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct sockaddr *addr = mac;
+
+       down(&priv->wx_sem);
+
+       memcpy(dev->dev_addr, addr->sa_data, ETH_ALEN);
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+       schedule_work(&priv->reset_wq);
+#else
+       schedule_task(&priv->reset_wq);
+#endif
+       up(&priv->wx_sem);
+
+       return 0;
+}
+
+/* based on ipw2200 driver */
+int rtl8192_ioctl(struct net_device *dev, struct ifreq *rq, int cmd)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct iwreq *wrq = (struct iwreq *)rq;
+       int ret=-1;
+       struct rtllib_device *ieee = priv->rtllib;
+       u32 key[4];
+       u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
+       u8 zero_addr[6] = {0};
+       struct iw_point *p = &wrq->u.data;
+
+       down(&priv->wx_sem);
+
+       switch (cmd) {
+               case RTL_IOCTL_WPA_SUPPLICANT:
+               {
+                       struct ieee_param *ipw = NULL;
+       if (p->length < sizeof(struct ieee_param) || !p->pointer){
+               ret = -EINVAL;
+               goto out;
+       }
+
+       ipw = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL);
+       if (ipw == NULL){
+               ret = -ENOMEM;
+               goto out;
+       }
+       if (copy_from_user(ipw, p->pointer, p->length)) {
+               kfree(ipw);
+               ret = -EFAULT;
+               goto out;
+       }
+
+                       if (ipw->cmd == IEEE_CMD_SET_ENCRYPTION)
+                       {
+                               if (ipw->u.crypt.set_tx)
+                               {
+                                       if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
+                                               ieee->pairwise_key_type = KEY_TYPE_CCMP;
+                                       else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
+                                               ieee->pairwise_key_type = KEY_TYPE_TKIP;
+                                       else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
+                                       {
+                                               if (ipw->u.crypt.key_len == 13)
+                                                       ieee->pairwise_key_type = KEY_TYPE_WEP104;
+                                               else if (ipw->u.crypt.key_len == 5)
+                                                       ieee->pairwise_key_type = KEY_TYPE_WEP40;
+                                       }
+                                       else
+                                               ieee->pairwise_key_type = KEY_TYPE_NA;
+
+                                       if (ieee->pairwise_key_type)
+                                       {
+                                               if (memcmp(ieee->ap_mac_addr, zero_addr, 6) == 0)
+                                                       ieee->iw_mode = IW_MODE_ADHOC;
+
+                                               memcpy((u8*)key, ipw->u.crypt.key, 16);
+                                               EnableHWSecurityConfig8192(dev);
+                                               set_swcam(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key,0);
+                                               setKey(dev, 4, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
+                                               if (ieee->iw_mode == IW_MODE_ADHOC){
+                                                       set_swcam(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key,0);
+                                                       setKey(dev, ipw->u.crypt.idx, ipw->u.crypt.idx, ieee->pairwise_key_type, (u8*)ieee->ap_mac_addr, 0, key);
+                                               }
+                                       }
+#ifdef RTL8192E
+                                       if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) && ieee->pHTInfo->bCurrentHTSupport){
+                                               write_nic_byte(dev, 0x173, 1);
+                                       }
+#endif
+
+                               }
+                               else
+                               {
+                                       memcpy((u8*)key, ipw->u.crypt.key, 16);
+                                       if (strcmp(ipw->u.crypt.alg, "CCMP") == 0)
+                                               ieee->group_key_type= KEY_TYPE_CCMP;
+                                       else if (strcmp(ipw->u.crypt.alg, "TKIP") == 0)
+                                               ieee->group_key_type = KEY_TYPE_TKIP;
+                                       else if (strcmp(ipw->u.crypt.alg, "WEP") == 0)
+                                       {
+                                               if (ipw->u.crypt.key_len == 13)
+                                                       ieee->group_key_type = KEY_TYPE_WEP104;
+                                               else if (ipw->u.crypt.key_len == 5)
+                                                       ieee->group_key_type = KEY_TYPE_WEP40;
+                                       }
+                                       else
+                                               ieee->group_key_type = KEY_TYPE_NA;
+
+                                       if (ieee->group_key_type)
+                                       {
+                                               set_swcam(      dev,
+                                                               ipw->u.crypt.idx,
+                                                               ipw->u.crypt.idx,
+                                                               ieee->group_key_type,
+                                                               broadcast_addr,
+                                                               0,
+                                                               key,
+                                                               0);
+                                               setKey( dev,
+                                                               ipw->u.crypt.idx,
+                                                               ipw->u.crypt.idx,
+                                                               ieee->group_key_type,
+                                                               broadcast_addr,
+                                                               0,
+                                                               key);
+                                       }
+                               }
+                       }
+#ifdef JOHN_DEBUG
+                       {
+                               int i;
+                               RT_TRACE(COMP_DBG, "@@ wrq->u pointer = ");
+                               for (i=0;i<wrq->u.data.length;i++){
+                                       if (i%10==0) RT_TRACE(COMP_DBG, "\n");
+                                       RT_TRACE(COMP_DBG, "%8x|", ((u32*)wrq->u.data.pointer)[i] );
+                               }
+                               RT_TRACE(COMP_DBG, "\n");
+                       }
+#endif
+                       ret = rtllib_wpa_supplicant_ioctl(priv->rtllib, &wrq->u.data, 0);
+                       kfree(ipw);
+                       break;
+               }
+               default:
+                       ret = -EOPNOTSUPP;
+                       break;
+       }
+
+out:
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+void FairBeacon(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct rtllib_network *net = &priv->rtllib->current_network;
+       static u8 i=100;
+       static u8 forceturn =0;
+       u16             beaconint = net->beacon_interval;
+
+       if (priv->rtllib->iw_mode != IW_MODE_ADHOC)
+               return;
+
+       if (priv->bIbssCoordinator){
+               i--;
+
+               if (forceturn ==2){
+                       forceturn =0;
+                       priv->rtllib->SetHwRegHandler(dev, HW_VAR_BEACON_INTERVAL, (u8*)(&beaconint));
+                       i=100;
+               }
+
+               if (i<=94){
+                       beaconint=beaconint+2;
+                       priv->rtllib->SetHwRegHandler(dev, HW_VAR_BEACON_INTERVAL, (u8*)(&beaconint));
+                       forceturn =1;
+               }
+       } else {
+               i++;
+
+               if (forceturn ==1){
+                       forceturn =0;
+                       priv->rtllib->SetHwRegHandler(dev, HW_VAR_BEACON_INTERVAL, (u8*)(&beaconint));
+                       i=100;
+               }
+
+               if (i>=106){
+                       beaconint=beaconint-2;
+                       priv->rtllib->SetHwRegHandler(dev, HW_VAR_BEACON_INTERVAL, (u8*)(&beaconint));
+                       forceturn =2;
+               }
+       }
+}
+
+
+irqreturn_type rtl8192_interrupt(int irq, void *netdev, struct pt_regs *regs)
+{
+       struct net_device *dev = (struct net_device *) netdev;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       unsigned long flags;
+       u32 inta;
+       u32 intb;
+       intb = 0;
+
+       if (priv->irq_enabled == 0){
+               goto done;
+       }
+
+       spin_lock_irqsave(&priv->irq_th_lock,flags);
+
+       priv->ops->interrupt_recognized(dev, &inta, &intb);
+       priv->stats.shints++;
+
+       if (!inta) {
+               spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+               goto done;
+       }
+
+       if (inta == 0xffff) {
+               spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+               goto done;
+       }
+
+       priv->stats.ints++;
+
+       if (!netif_running(dev)) {
+               spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+               goto done;
+       }
+
+#if defined RTL8192SE
+       if (intb & IMR_TBDOK){
+               RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+               priv->stats.txbeaconokint++;
+               priv->bIbssCoordinator = true;
+       }
+
+       if (intb & IMR_TBDER){
+               RT_TRACE(COMP_INTR, "beacon error interrupt!\n");
+               priv->stats.txbeaconerr++;
+               priv->bIbssCoordinator = false;
+       }
+
+       if ((intb & IMR_TBDOK) ||(intb & IMR_TBDER))
+               FairBeacon(dev);
+#else
+       if (inta & IMR_TBDOK){
+               RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+               priv->stats.txbeaconokint++;
+       }
+
+       if (inta & IMR_TBDER){
+               RT_TRACE(COMP_INTR, "beacon ok interrupt!\n");
+               priv->stats.txbeaconerr++;
+       }
+#endif
+
+       if (inta & IMR_BDOK) {
+               RT_TRACE(COMP_INTR, "beacon interrupt!\n");
+#ifdef _ENABLE_SW_BEACON
+               rtl8192_tx_isr(dev, BEACON_QUEUE);
+#endif
+       }
+
+       if (inta  & IMR_MGNTDOK ) {
+               RT_TRACE(COMP_INTR, "Manage ok interrupt!\n");
+               priv->stats.txmanageokint++;
+               rtl8192_tx_isr(dev,MGNT_QUEUE);
+               spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+               if (priv->rtllib->ack_tx_to_ieee){
+                       if (rtl8192_is_tx_queue_empty(dev)){
+                               priv->rtllib->ack_tx_to_ieee = 0;
+                               rtllib_ps_tx_ack(priv->rtllib, 1);
+                       }
+               }
+               spin_lock_irqsave(&priv->irq_th_lock,flags);
+       }
+
+#ifndef RTL8192CE
+       if (inta & IMR_COMDOK) {
+               priv->stats.txcmdpktokint++;
+               rtl8192_tx_isr(dev,TXCMD_QUEUE);
+       }
+#endif
+
+       if (inta & IMR_HIGHDOK) {
+               rtl8192_tx_isr(dev,HIGH_QUEUE);
+       }
+
+#ifdef RTL8192SE
+       if ((inta & IMR_ROK) || (inta & IMR_RXCMDOK))
+#else
+       if (inta & IMR_ROK)
+#endif
+       {
+               priv->stats.rxint++;
+               priv->InterruptLog.nIMR_ROK++;
+               tasklet_schedule(&priv->irq_rx_tasklet);
+       }
+
+       if (inta & IMR_BcnInt) {
+               RT_TRACE(COMP_INTR, "prepare beacon for interrupt!\n");
+#ifndef _ENABLE_SW_BEACON
+               tasklet_schedule(&priv->irq_prepare_beacon_tasklet);
+#endif
+       }
+
+       if (inta & IMR_RDU) {
+               RT_TRACE(COMP_INTR, "rx descriptor unavailable!\n");
+               priv->stats.rxrdu++;
+#ifndef RTL8192CE
+               write_nic_dword(dev,INTA_MASK,read_nic_dword(dev, INTA_MASK) & ~IMR_RDU);
+#endif
+               tasklet_schedule(&priv->irq_rx_tasklet);
+       }
+
+       if (inta & IMR_RXFOVW) {
+               RT_TRACE(COMP_INTR, "rx overflow !\n");
+               priv->stats.rxoverflow++;
+               tasklet_schedule(&priv->irq_rx_tasklet);
+       }
+
+       if (inta & IMR_TXFOVW) priv->stats.txoverflow++;
+
+       if (inta & IMR_BKDOK) {
+               RT_TRACE(COMP_INTR, "BK Tx OK interrupt!\n");
+               priv->stats.txbkokint++;
+               priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(dev,BK_QUEUE);
+       }
+
+       if (inta & IMR_BEDOK) {
+               RT_TRACE(COMP_INTR, "BE TX OK interrupt!\n");
+               priv->stats.txbeokint++;
+               priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(dev,BE_QUEUE);
+       }
+
+       if (inta & IMR_VIDOK) {
+               RT_TRACE(COMP_INTR, "VI TX OK interrupt!\n");
+               priv->stats.txviokint++;
+               priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(dev,VI_QUEUE);
+       }
+
+       if (inta & IMR_VODOK) {
+               priv->stats.txvookint++;
+               RT_TRACE(COMP_INTR, "Vo TX OK interrupt!\n");
+               priv->rtllib->LinkDetectInfo.NumTxOkInPeriod++;
+               rtl8192_tx_isr(dev,VO_QUEUE);
+       }
+
+       spin_unlock_irqrestore(&priv->irq_th_lock,flags);
+
+done:
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0)
+       return;
+#else
+       return IRQ_HANDLED;
+#endif
+}
+
+
+
+/****************************************************************************
+     ---------------------------- PCI_STUFF---------------------------
+*****************************************************************************/
+#ifdef HAVE_NET_DEVICE_OPS
+static const struct net_device_ops rtl8192_netdev_ops = {
+       .ndo_open = rtl8192_open,
+       .ndo_stop = rtl8192_close,
+       .ndo_tx_timeout = rtl8192_tx_timeout,
+       .ndo_do_ioctl = rtl8192_ioctl,
+       .ndo_set_multicast_list = r8192_set_multicast,
+       .ndo_set_mac_address = r8192_set_mac_adr,
+       .ndo_validate_addr = eth_validate_addr,
+       .ndo_change_mtu = eth_change_mtu,
+       .ndo_start_xmit = rtllib_xmit,
+};
+#endif
+
+static int __devinit rtl8192_pci_probe(struct pci_dev *pdev,
+                        const struct pci_device_id *id)
+{
+       unsigned long ioaddr = 0;
+       struct net_device *dev = NULL;
+       struct r8192_priv *priv= NULL;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       struct rtl819x_ops *ops = (struct rtl819x_ops *)(id->driver_data);
+#endif
+
+#ifdef CONFIG_RTL8192_IO_MAP
+       unsigned long pio_start, pio_len, pio_flags;
+#else
+       unsigned long pmem_start, pmem_len, pmem_flags;
+#endif
+       int err = 0;
+       bool bdma64 = false;
+
+       RT_TRACE(COMP_INIT,"Configuring chip resources");
+
+       if ( pci_enable_device (pdev) ){
+               RT_TRACE(COMP_ERR,"Failed to enable PCI device");
+               return -EIO;
+       }
+
+       pci_set_master(pdev);
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+#define DMA_BIT_MASK(n)        (((n) == 64) ? ~0ULL : ((1ULL < (n)) -1))
+#endif
+
+#ifdef CONFIG_64BIT_DMA
+       if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(64))) {
+               printk("RTL819xCE: Using 64bit DMA\n");
+               if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(64))) {
+                       printk( "Unable to obtain 64bit DMA for consistent allocations\n");
+                       pci_disable_device(pdev);
+                       return -ENOMEM;
+               }
+               bdma64 = true;
+       } else
+#endif
+       {
+               if (!pci_set_dma_mask(pdev, DMA_BIT_MASK(32))) {
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+                       if (pci_set_consistent_dma_mask(pdev, DMA_BIT_MASK(32))) {
+                               printk( "Unable to obtain 32bit DMA for consistent allocations\n");
+                               pci_disable_device(pdev);
+                               return -ENOMEM;
+                       }
+#endif
+               }
+       }
+       dev = alloc_rtllib(sizeof(struct r8192_priv));
+       if (!dev)
+               return -ENOMEM;
+
+       if (bdma64){
+               dev->features |= NETIF_F_HIGHDMA;
+       }
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+       SET_MODULE_OWNER(dev);
+#endif
+
+       pci_set_drvdata(pdev, dev);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       SET_NETDEV_DEV(dev, &pdev->dev);
+#endif
+       priv = rtllib_priv(dev);
+       priv->rtllib = (struct rtllib_device *)netdev_priv_rsl(dev);
+       priv->pdev=pdev;
+       priv->rtllib->pdev=pdev;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       if ((pdev->subsystem_vendor == PCI_VENDOR_ID_DLINK)&&(pdev->subsystem_device == 0x3304)){
+               priv->rtllib->bSupportRemoteWakeUp = 1;
+       } else
+#endif
+       {
+               priv->rtllib->bSupportRemoteWakeUp = 0;
+       }
+
+#ifdef CONFIG_RTL8192_IO_MAP
+       pio_start = (unsigned long)pci_resource_start (pdev, 0);
+       pio_len = (unsigned long)pci_resource_len (pdev, 0);
+       pio_flags = (unsigned long)pci_resource_flags (pdev, 0);
+
+       if (!(pio_flags & IORESOURCE_IO)) {
+               RT_TRACE(COMP_ERR,"region #0 not a PIO resource, aborting");
+               goto fail;
+       }
+
+       printk("Io mapped space start: 0x%08lx \n", pio_start );
+       if ( ! request_region( pio_start, pio_len, DRV_NAME ) ){
+               RT_TRACE(COMP_ERR,"request_region failed!");
+               goto fail;
+       }
+
+       ioaddr = pio_start;
+       dev->base_addr = ioaddr;
+#else
+#ifdef RTL8192CE
+       pmem_start = pci_resource_start(pdev, 2);
+       pmem_len = pci_resource_len(pdev, 2);
+       pmem_flags = pci_resource_flags (pdev, 2);
+#else
+       pmem_start = pci_resource_start(pdev, 1);
+       pmem_len = pci_resource_len(pdev, 1);
+       pmem_flags = pci_resource_flags (pdev, 1);
+#endif
+
+       if (!(pmem_flags & IORESOURCE_MEM)) {
+               RT_TRACE(COMP_ERR,"region #1 not a MMIO resource, aborting");
+               goto fail;
+       }
+
+       printk("Memory mapped space start: 0x%08lx \n", pmem_start);
+       if (!request_mem_region(pmem_start, pmem_len, DRV_NAME)) {
+               RT_TRACE(COMP_ERR,"request_mem_region failed!");
+               goto fail;
+       }
+
+
+       ioaddr = (unsigned long)ioremap_nocache( pmem_start, pmem_len);
+       if ( ioaddr == (unsigned long)NULL ){
+               RT_TRACE(COMP_ERR,"ioremap failed!");
+               goto fail1;
+       }
+
+       dev->mem_start = ioaddr;
+       dev->mem_end = ioaddr + pci_resource_len(pdev, 0);
+
+#endif
+#if defined RTL8192SE || defined RTL8192CE
+        pci_write_config_byte(pdev, 0x81,0);
+        pci_write_config_byte(pdev,0x44,0);
+        pci_write_config_byte(pdev,0x04,0x06);
+        pci_write_config_byte(pdev,0x04,0x07);
+#endif
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       priv->ops = ops;
+#else
+#if defined RTL8190P || defined RTL8192E
+       priv->ops = &rtl819xp_ops;
+#else
+       priv->ops = &rtl8192se_ops;
+#endif
+#endif
+
+       if (rtl8192_pci_findadapter(pdev, dev) == false)
+               goto fail1;
+
+       dev->irq = pdev->irq;
+       priv->irq = 0;
+
+#ifdef HAVE_NET_DEVICE_OPS
+       dev->netdev_ops = &rtl8192_netdev_ops;
+#else
+       dev->open = rtl8192_open;
+       dev->stop = rtl8192_close;
+       dev->tx_timeout = rtl8192_tx_timeout;
+       dev->do_ioctl = rtl8192_ioctl;
+       dev->set_multicast_list = r8192_set_multicast;
+       dev->set_mac_address = r8192_set_mac_adr;
+       dev->hard_start_xmit = rtllib_xmit;
+#endif
+
+#if WIRELESS_EXT >= 12
+#if WIRELESS_EXT < 17
+        dev->get_wireless_stats = r8192_get_wireless_stats;
+#endif
+        dev->wireless_handlers = (struct iw_handler_def *) &r8192_wx_handlers_def;
+#endif
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       dev->ethtool_ops = &rtl819x_ethtool_ops;
+#endif
+
+       dev->type = ARPHRD_ETHER;
+       dev->watchdog_timeo = HZ*3;
+
+       if (dev_alloc_name(dev, ifname) < 0){
+                RT_TRACE(COMP_INIT, "Oops: devname already taken! Trying wlan%%d...\n");
+               dev_alloc_name(dev, ifname);
+        }
+
+       RT_TRACE(COMP_INIT, "Driver probe completed1\n");
+       if (rtl8192_init(dev)!=0){
+               RT_TRACE(COMP_ERR, "Initialization failed");
+               goto fail1;
+       }
+
+#ifdef CONFIG_CFG_80211
+       if (!rtl8192_register_wiphy_dev(dev))
+               goto fail1;
+#endif
+
+       netif_carrier_off(dev);
+       netif_stop_queue(dev);
+
+       register_netdev(dev);
+       RT_TRACE(COMP_INIT, "dev name: %s\n",dev->name);
+       err = rtl_debug_module_init(priv, dev->name);
+       if (err) {
+               RT_TRACE(COMP_DBG, "failed to create debugfs files. Ignoring error: %d\n", err);
+       }
+       rtl8192_proc_init_one(dev);
+
+#ifdef ENABLE_GPIO_RADIO_CTL
+       if (priv->polling_timer_on == 0){
+               check_rfctrl_gpio_timer((unsigned long)dev);
+       }
+#endif
+#ifdef CONFIG_RTL_RFKILL
+       if (priv->ops->init_before_adapter_start) {
+               priv->ops->init_before_adapter_start(dev);
+               priv->initialized_at_probe = true;
+       }
+       if (!rtl8192_rfkill_init(dev)) {
+               goto fail1;
+       }
+#endif
+
+#if defined CONFIG_ASPM_OR_D3
+       rtl8192_initialize_adapter_common(dev);
+#endif
+
+       RT_TRACE(COMP_INIT, "Driver probe completed\n");
+       return 0;
+
+fail1:
+#ifdef CONFIG_RTL8192_IO_MAP
+
+       if ( dev->base_addr != 0 ){
+
+               release_region(dev->base_addr,
+              pci_resource_len(pdev, 0) );
+       }
+#else
+       if ( dev->mem_start != (unsigned long)NULL ){
+               iounmap( (void *)dev->mem_start );
+               release_mem_region( pci_resource_start(pdev, 1),
+                                   pci_resource_len(pdev, 1) );
+       }
+#endif
+
+fail:
+       if (dev){
+
+               if (priv->irq) {
+                       free_irq(dev->irq, dev);
+                       dev->irq=0;
+               }
+               free_rtllib(dev);
+       }
+
+       pci_disable_device(pdev);
+
+       DMESG("wlan driver load failed\n");
+       pci_set_drvdata(pdev, NULL);
+       return -ENODEV;
+
+}
+
+static void __devexit rtl8192_pci_disconnect(struct pci_dev *pdev)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct r8192_priv *priv ;
+       if (dev){
+#ifdef CONFIG_RTL_RFKILL
+               rtl8192_rfkill_exit(dev);
+#endif
+               unregister_netdev(dev);
+
+               priv = rtllib_priv(dev);
+
+#ifdef ENABLE_GPIO_RADIO_CTL
+               del_timer_sync(&priv->gpio_polling_timer);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+               cancel_delayed_work(&priv->gpio_change_rf_wq);
+#endif
+               priv->polling_timer_on = 0;
+#endif
+               rtl_debug_module_remove(priv);
+               rtl8192_proc_remove_one(dev);
+               rtl8192_down(dev,true);
+               deinit_hal_dm(dev);
+#ifdef CONFIG_ASPM_OR_D3
+               ;
+#endif
+               if (priv->pFirmware)
+               {
+                       vfree(priv->pFirmware);
+                       priv->pFirmware = NULL;
+               }
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+               destroy_workqueue(priv->priv_wq);
+#endif
+                {
+                    u32 i;
+                    rtl8192_free_rx_ring(dev);
+                    for (i = 0; i < MAX_TX_QUEUE_COUNT; i++) {
+                        rtl8192_free_tx_ring(dev, i);
+                    }
+                }
+
+               if (priv->irq){
+
+                       printk("Freeing irq %d\n",dev->irq);
+                       free_irq(dev->irq, dev);
+                       priv->irq=0;
+
+               }
+#ifdef CONFIG_RTL8192_IO_MAP
+               if ( dev->base_addr != 0 ){
+
+                       release_region(dev->base_addr,
+                                      pci_resource_len(pdev, 0) );
+               }
+#else
+               if ( dev->mem_start != (unsigned long)NULL ){
+                       iounmap( (void *)dev->mem_start );
+#ifdef RTL8192CE
+                       release_mem_region( pci_resource_start(pdev, 2),
+                                   pci_resource_len(pdev, 2) );
+#else
+                       release_mem_region( pci_resource_start(pdev, 1),
+                                           pci_resource_len(pdev, 1) );
+#endif
+               }
+#endif /*end #ifdef RTL_IO_MAP*/
+               free_rtllib(dev);
+
+               if (priv->scan_cmd)
+                       kfree(priv->scan_cmd);
+
+       } else{
+               priv=rtllib_priv(dev);
+        }
+
+       pci_disable_device(pdev);
+#ifdef RTL8192SE
+        pci_write_config_byte(pdev, 0x81,1);
+        pci_write_config_byte(pdev,0x44,3);
+#endif
+       RT_TRACE(COMP_DOWN, "wlan driver removed\n");
+}
+
+bool NicIFEnableNIC(struct net_device* dev)
+{
+       bool init_status = true;
+       struct r8192_priv* priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+       if (IS_NIC_DOWN(priv)){
+               RT_TRACE(COMP_ERR, "ERR!!! %s(): Driver is already down!\n",__func__);
+               priv->bdisable_nic = false;
+               return RT_STATUS_FAILURE;
+       }
+
+       RT_TRACE(COMP_PS, "===========>%s()\n",__func__);
+       priv->bfirst_init = true;
+       init_status = priv->ops->initialize_adapter(dev);
+       if (init_status != true) {
+               RT_TRACE(COMP_ERR,"ERR!!! %s(): initialization is failed!\n",__func__);
+               priv->bdisable_nic = false;
+               return -1;
+       }
+       RT_TRACE(COMP_INIT, "start adapter finished\n");
+       RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+       priv->bfirst_init = false;
+
+       rtl8192_irq_enable(dev);
+       priv->bdisable_nic = false;
+       RT_TRACE(COMP_PS,"<===========%s()\n",__func__);
+       return init_status;
+}
+bool NicIFDisableNIC(struct net_device* dev)
+{
+       bool    status = true;
+       struct r8192_priv* priv = rtllib_priv(dev);
+       u8 tmp_state = 0;
+       RT_TRACE(COMP_PS, "=========>%s()\n",__func__);
+       priv->bdisable_nic = true;
+       tmp_state = priv->rtllib->state;
+       rtllib_softmac_stop_protocol(priv->rtllib, 0, false);
+       priv->rtllib->state = tmp_state;
+       rtl8192_cancel_deferred_work(priv);
+       rtl8192_irq_disable(dev);
+
+       priv->ops->stop_adapter(dev, false);
+       RT_TRACE(COMP_PS, "<=========%s()\n",__func__);
+
+       return status;
+}
+
+static int __init rtl8192_pci_module_init(void)
+{
+       int ret;
+       int error;
+
+#ifdef BUILT_IN_CRYPTO
+        ret = arc4_init();
+        if (ret) {
+                printk(KERN_ERR "arc4_init() failed %d\n", ret);
+                return ret;
+        }
+
+
+        ret = michael_mic_init();
+        if (ret) {
+                printk(KERN_ERR "michael_mic_init() failed %d\n", ret);
+                return ret;
+        }
+
+        ret = aes_init();
+        if (ret) {
+                printk(KERN_ERR "aes_init() failed %d\n", ret);
+                return ret;
+        }
+#endif
+       ret = rtllib_init();
+       if (ret) {
+               printk(KERN_ERR "rtllib_init() failed %d\n", ret);
+               return ret;
+       }
+       ret = rtllib_crypto_init();
+       if (ret) {
+               printk(KERN_ERR "rtllib_crypto_init() failed %d\n", ret);
+               return ret;
+       }
+       ret = rtllib_crypto_tkip_init();
+       if (ret) {
+               printk(KERN_ERR "rtllib_crypto_tkip_init() failed %d\n", ret);
+               return ret;
+       }
+       ret = rtllib_crypto_ccmp_init();
+       if (ret) {
+               printk(KERN_ERR "rtllib_crypto_ccmp_init() failed %d\n", ret);
+               return ret;
+       }
+       ret = rtllib_crypto_wep_init();
+       if (ret) {
+               printk(KERN_ERR "rtllib_crypto_wep_init() failed %d\n", ret);
+               return ret;
+       }
+#ifdef BUILT_IN_MSHCLASS
+       ret = msh_init();
+       if (ret) {
+               printk(KERN_ERR "msh_init() failed %d\n", ret);
+               return ret;
+       }
+#endif
+       printk(KERN_INFO "\nLinux kernel driver for RTL8192E WLAN cards\n");
+       printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan Driver\n");
+       RT_TRACE(COMP_INIT, "Initializing module");
+       RT_TRACE(COMP_INIT, "Wireless extensions version %d", WIRELESS_EXT);
+
+       error = rtl_create_debugfs_root();
+       if (error) {
+               RT_TRACE(COMP_DBG, "Create debugfs root fail: %d\n", error);
+               goto err_out;
+       }
+
+       rtl8192_proc_module_init();
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,22))
+      if (0!=pci_module_init(&rtl8192_pci_driver))
+#else
+      if (0!=pci_register_driver(&rtl8192_pci_driver))
+#endif
+       {
+               DMESG("No device found");
+               /*pci_unregister_driver (&rtl8192_pci_driver);*/
+               return -ENODEV;
+       }
+       return 0;
+err_out:
+        return error;
+
+}
+
+static void __exit rtl8192_pci_module_exit(void)
+{
+       pci_unregister_driver(&rtl8192_pci_driver);
+
+       RT_TRACE(COMP_DOWN, "Exiting");
+       rtl8192_proc_module_remove();
+       rtl_remove_debugfs_root();
+       rtllib_crypto_tkip_exit();
+       rtllib_crypto_ccmp_exit();
+       rtllib_crypto_wep_exit();
+       rtllib_crypto_deinit();
+       rtllib_exit();
+#ifdef BUILT_IN_CRYPTO
+        arc4_exit();
+        michael_mic_exit();
+        aes_fini();
+#endif
+#ifdef BUILT_IN_MSHCLASS
+       msh_exit();
+#endif
+
+}
+
+void check_rfctrl_gpio_timer(unsigned long data)
+{
+       struct r8192_priv* priv = rtllib_priv((struct net_device *)data);
+
+       priv->polling_timer_on = 1;
+
+       queue_delayed_work_rsl(priv->priv_wq,&priv->gpio_change_rf_wq,0);
+
+       mod_timer(&priv->gpio_polling_timer, jiffies + MSECS(RTLLIB_WATCH_DOG_TIME));
+}
+
+/***************************************************************************
+     ------------------- module init / exit stubs ----------------
+****************************************************************************/
+module_init(rtl8192_pci_module_init);
+module_exit(rtl8192_pci_module_exit);
+
+MODULE_DESCRIPTION("Linux driver for Realtek RTL819x WiFi cards");
+MODULE_AUTHOR(DRV_COPYRIGHT " " DRV_AUTHOR);
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+MODULE_VERSION(DRV_VERSION);
+#endif
+MODULE_LICENSE("GPL");
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 9)
+module_param(ifname, charp, S_IRUGO|S_IWUSR );
+module_param(hwwep,int, S_IRUGO|S_IWUSR);
+module_param(channels,int, S_IRUGO|S_IWUSR);
+#else
+MODULE_PARM(ifname, "s");
+MODULE_PARM(hwwep,"i");
+MODULE_PARM(channels,"i");
+#endif
+
+MODULE_PARM_DESC(ifname," Net interface name, wlan%d=default");
+MODULE_PARM_DESC(hwwep," Try to use hardware WEP support(default use hw. set 0 to use software security)");
+MODULE_PARM_DESC(channels," Channel bitmask for specific locales. NYI");
diff --git a/drivers/staging/rtl8192e/rtl_core.h b/drivers/staging/rtl8192e/rtl_core.h
new file mode 100644 (file)
index 0000000..d858cc9
--- /dev/null
@@ -0,0 +1,1190 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#ifndef _RTL_CORE_H
+#define _RTL_CORE_H
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/sched.h>
+#include <linux/types.h>
+#include <linux/interrupt.h>
+#include <linux/slab.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/etherdevice.h>
+#include <linux/delay.h>
+#include <linux/rtnetlink.h>
+#include <linux/wireless.h>
+#include <linux/timer.h>
+#include <linux/proc_fs.h>
+#include <linux/if_arp.h>
+#include <linux/random.h>
+#include <linux/version.h>
+#include <asm/io.h>
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27))
+#include <asm/semaphore.h>
+#endif
+#include "rtllib.h"
+
+#ifdef ENABLE_DOT11D
+#include "dot11d.h"
+#endif
+
+#include "r8192E_firmware.h"
+#include "r8192E_hw.h"
+
+#include "r8190P_def.h"
+#include "r8192E_dev.h"
+
+#ifdef CONFIG_CFG_80211
+#include "rtl_regd.h"
+#endif
+
+#ifdef CONFIG_RTL_RFKILL
+#include "rtl_rfkill.h"
+#endif
+
+#include "rtl_debug.h"
+#include "rtl_eeprom.h"
+#include "rtl_ps.h"
+#include "rtl_pci.h"
+#include "rtl_cam.h"
+
+#define DRV_COPYRIGHT  "Copyright(c) 2008 - 2010 Realsil Semiconductor Corporation"
+#define DRV_AUTHOR  "<wlanfae@realtek.com>"
+#define DRV_VERSION  "0014.0401.2010"
+
+#define DRV_NAME "rtl819xE"
+
+#define IS_HARDWARE_TYPE_819xP(_priv) ((((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8190P)||\
+                                       (((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8192E))
+#define IS_HARDWARE_TYPE_8192SE(_priv) (((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8192SE)
+#define IS_HARDWARE_TYPE_8192CE(_priv) (((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8192CE)
+#define IS_HARDWARE_TYPE_8192CU(_priv) (((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8192CU)
+#define IS_HARDWARE_TYPE_8192DE(_priv) (((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8192DE)
+#define IS_HARDWARE_TYPE_8192DU(_priv) (((struct r8192_priv*)rtllib_priv(dev))->card_8192==NIC_8192DU)
+
+#define RTL_PCI_DEVICE(vend, dev, cfg) \
+       .vendor = (vend), .device = (dev), \
+       .subvendor = PCI_ANY_ID, .subdevice =PCI_ANY_ID , \
+       .driver_data = (kernel_ulong_t)&(cfg)
+       typedef irqreturn_t irqreturn_type;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+
+#if !defined(PCI_CAP_ID_EXP)
+#define PCI_CAP_ID_EXP                     0x10
+#endif
+#if !defined(PCI_EXP_LNKCTL)
+#define PCI_EXP_LNKCTL                     0x10
+#endif
+
+typedef int __bitwise pci_power_t;
+#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)
+
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,18)
+       #define rtl8192_interrupt(x,y,z) rtl8192_interrupt_rsl(x,y,z)
+#else
+       #define rtl8192_interrupt(x,y,z) rtl8192_interrupt_rsl(x,y)
+#endif
+
+#define RTL_MAX_SCAN_SIZE 128
+
+#define RTL_RATE_MAX           30
+
+#define TOTAL_CAM_ENTRY                32
+#define CAM_CONTENT_COUNT      8
+
+#ifndef BIT
+#define BIT(_i)                                (1<<(_i))
+#endif
+
+#define IS_NIC_DOWN(priv)      (!(priv)->up)
+
+#define IS_ADAPTER_SENDS_BEACON(dev) 0
+
+#define IS_UNDER_11N_AES_MODE(_rtllib)  ((_rtllib->pHTInfo->bCurrentHTSupport == true) &&\
+                                       (_rtllib->pairwise_key_type == KEY_TYPE_CCMP))
+
+#define HAL_MEMORY_MAPPED_IO_RANGE_8190PCI     0x1000
+#define HAL_HW_PCI_REVISION_ID_8190PCI                 0x00
+#define HAL_MEMORY_MAPPED_IO_RANGE_8192PCIE    0x4000
+#define HAL_HW_PCI_REVISION_ID_8192PCIE                0x01
+#define HAL_MEMORY_MAPPED_IO_RANGE_8192SE      0x4000
+#define HAL_HW_PCI_REVISION_ID_8192SE  0x10
+#define HAL_HW_PCI_REVISION_ID_8192CE                  0x1
+#define HAL_MEMORY_MAPPED_IO_RANGE_8192CE      0x4000
+#define HAL_HW_PCI_REVISION_ID_8192DE                  0x0
+#define HAL_MEMORY_MAPPED_IO_RANGE_8192DE      0x4000
+
+#define HAL_HW_PCI_8180_DEVICE_ID                      0x8180
+#define HAL_HW_PCI_8185_DEVICE_ID                      0x8185
+#define HAL_HW_PCI_8188_DEVICE_ID                      0x8188
+#define HAL_HW_PCI_8198_DEVICE_ID                      0x8198
+#define HAL_HW_PCI_8190_DEVICE_ID                      0x8190
+#define HAL_HW_PCI_8192_DEVICE_ID                      0x8192
+#define HAL_HW_PCI_8192SE_DEVICE_ID                            0x8192
+#define HAL_HW_PCI_8174_DEVICE_ID                      0x8174
+#define HAL_HW_PCI_8173_DEVICE_ID                      0x8173
+#define HAL_HW_PCI_8172_DEVICE_ID                      0x8172
+#define HAL_HW_PCI_8171_DEVICE_ID                      0x8171
+#define HAL_HW_PCI_0045_DEVICE_ID                              0x0045
+#define HAL_HW_PCI_0046_DEVICE_ID                              0x0046
+#define HAL_HW_PCI_0044_DEVICE_ID                              0x0044
+#define HAL_HW_PCI_0047_DEVICE_ID                              0x0047
+#define HAL_HW_PCI_700F_DEVICE_ID                              0x700F
+#define HAL_HW_PCI_701F_DEVICE_ID                              0x701F
+#define HAL_HW_PCI_DLINK_DEVICE_ID                             0x3304
+#define HAL_HW_PCI_8192CET_DEVICE_ID                   0x8191
+#define HAL_HW_PCI_8192CE_DEVICE_ID                            0x8178
+#define HAL_HW_PCI_8191CE_DEVICE_ID                            0x8177
+#define HAL_HW_PCI_8188CE_DEVICE_ID                            0x8176
+#define HAL_HW_PCI_8192CU_DEVICE_ID                            0x8191
+#define HAL_HW_PCI_8192DE_DEVICE_ID                            0x092D
+#define HAL_HW_PCI_8192DU_DEVICE_ID                            0x092D
+
+#define RTL819X_DEFAULT_RF_TYPE                RF_1T2R
+
+#define RTLLIB_WATCH_DOG_TIME          2000
+
+#define MAX_DEV_ADDR_SIZE              8  /* support till 64 bit bus width OS */
+#define MAX_FIRMWARE_INFORMATION_SIZE   32
+#define MAX_802_11_HEADER_LENGTH       (40 + MAX_FIRMWARE_INFORMATION_SIZE)
+#define ENCRYPTION_MAX_OVERHEAD                128
+#define MAX_FRAGMENT_COUNT             8
+#define MAX_TRANSMIT_BUFFER_SIZE       (1600+(MAX_802_11_HEADER_LENGTH+ENCRYPTION_MAX_OVERHEAD)*MAX_FRAGMENT_COUNT)
+
+#define scrclng                                4
+
+#define DEFAULT_FRAG_THRESHOLD 2342U
+#define MIN_FRAG_THRESHOLD     256U
+#define DEFAULT_BEACONINTERVAL 0x64U
+
+#define DEFAULT_SSID           ""
+#define DEFAULT_RETRY_RTS      7
+#define DEFAULT_RETRY_DATA     7
+#define PRISM_HDR_SIZE         64
+
+#define        PHY_RSSI_SLID_WIN_MAX                   100
+
+#define RTL_IOCTL_WPA_SUPPLICANT               SIOCIWFIRSTPRIV+30
+
+#define TxBBGainTableLength                    37
+#define CCKTxBBGainTableLength                 23
+
+#define CHANNEL_PLAN_LEN                       10
+#define sCrcLng                                        4
+
+#define NIC_SEND_HANG_THRESHOLD_NORMAL         4
+#define NIC_SEND_HANG_THRESHOLD_POWERSAVE      8
+
+#define MAX_TX_QUEUE                           9
+
+#define MAX_RX_QUEUE                           1
+
+#define MAX_RX_COUNT                            64
+#define MAX_TX_QUEUE_COUNT                      9
+
+enum RTL819x_PHY_PARAM {
+       RTL819X_PHY_MACPHY_REG          = 0,
+       RTL819X_PHY_MACPHY_REG_PG       = 1,
+       RTL8188C_PHY_MACREG                     =2,
+       RTL8192C_PHY_MACREG                     =3,
+       RTL819X_PHY_REG                         = 4,
+       RTL819X_PHY_REG_1T2R                    = 5,
+       RTL819X_PHY_REG_to1T1R          = 6,
+       RTL819X_PHY_REG_to1T2R          = 7,
+       RTL819X_PHY_REG_to2T2R          = 8,
+       RTL819X_PHY_REG_PG                      = 9,
+       RTL819X_AGC_TAB                         = 10,
+       RTL819X_PHY_RADIO_A                     =11,
+       RTL819X_PHY_RADIO_A_1T          =12,
+       RTL819X_PHY_RADIO_A_2T          =13,
+       RTL819X_PHY_RADIO_B                     =14,
+       RTL819X_PHY_RADIO_B_GM          =15,
+       RTL819X_PHY_RADIO_C                     =16,
+       RTL819X_PHY_RADIO_D                     =17,
+       RTL819X_EEPROM_MAP                      =18,
+       RTL819X_EFUSE_MAP                               =19,
+};
+
+enum RTL_DEBUG {
+       COMP_TRACE              = BIT0,
+       COMP_DBG                = BIT1,
+       COMP_INIT               = BIT2,
+       COMP_RECV               = BIT3,
+       COMP_SEND               = BIT4,
+       COMP_CMD                = BIT5,
+       COMP_POWER              = BIT6,
+       COMP_EPROM              = BIT7,
+       COMP_SWBW               = BIT8,
+       COMP_SEC                = BIT9,
+       COMP_LPS                = BIT10,
+       COMP_QOS                = BIT11,
+       COMP_RATE               = BIT12,
+       COMP_RXDESC             = BIT13,
+       COMP_PHY                = BIT14,
+       COMP_DIG                = BIT15,
+       COMP_TXAGC              = BIT16,
+       COMP_HALDM              = BIT17,
+       COMP_POWER_TRACKING     = BIT18,
+       COMP_CH                 = BIT19,
+       COMP_RF                 = BIT20,
+       COMP_FIRMWARE           = BIT21,
+       COMP_HT                 = BIT22,
+       COMP_RESET              = BIT23,
+       COMP_CMDPKT             = BIT24,
+       COMP_SCAN               = BIT25,
+       COMP_PS                 = BIT26,
+       COMP_DOWN               = BIT27,
+       COMP_INTR               = BIT28,
+       COMP_LED                = BIT29,
+       COMP_MLME               = BIT30,
+       COMP_ERR                = BIT31
+};
+
+typedef enum{
+       NIC_UNKNOWN     = 0,
+       NIC_8192E       = 1,
+       NIC_8190P       = 2,
+       NIC_8192SE      = 4,
+       NIC_8192CE              = 5,
+       NIC_8192CU              = 6,
+       NIC_8192DE              = 7,
+       NIC_8192DU              = 8,
+       } nic_t;
+
+typedef        enum _RT_EEPROM_TYPE{
+       EEPROM_93C46,
+       EEPROM_93C56,
+       EEPROM_BOOT_EFUSE,
+}RT_EEPROM_TYPE,*PRT_EEPROM_TYPE;
+
+typedef enum _tag_TxCmd_Config_Index{
+       TXCMD_TXRA_HISTORY_CTRL         = 0xFF900000,
+       TXCMD_RESET_TX_PKT_BUFF         = 0xFF900001,
+       TXCMD_RESET_RX_PKT_BUFF         = 0xFF900002,
+       TXCMD_SET_TX_DURATION           = 0xFF900003,
+       TXCMD_SET_RX_RSSI               = 0xFF900004,
+       TXCMD_SET_TX_PWR_TRACKING       = 0xFF900005,
+       TXCMD_XXXX_CTRL,
+}DCMD_TXCMD_OP;
+
+typedef enum _RT_RF_TYPE_819xU{
+        RF_TYPE_MIN = 0,
+        RF_8225,
+        RF_8256,
+        RF_8258,
+        RF_6052=4,
+        RF_PSEUDO_11N = 5,
+}RT_RF_TYPE_819xU, *PRT_RF_TYPE_819xU;
+
+typedef enum tag_Rf_Operatetion_State
+{
+    RF_STEP_INIT = 0,
+    RF_STEP_NORMAL,
+    RF_STEP_MAX
+}RF_STEP_E;
+
+typedef enum _RT_STATUS{
+       RT_STATUS_SUCCESS,
+       RT_STATUS_FAILURE,
+       RT_STATUS_PENDING,
+       RT_STATUS_RESOURCE
+}RT_STATUS,*PRT_STATUS;
+
+typedef enum _RT_CUSTOMER_ID
+{
+       RT_CID_DEFAULT          = 0,
+       RT_CID_8187_ALPHA0      = 1,
+       RT_CID_8187_SERCOMM_PS  = 2,
+       RT_CID_8187_HW_LED      = 3,
+       RT_CID_8187_NETGEAR     = 4,
+       RT_CID_WHQL             = 5,
+       RT_CID_819x_CAMEO       = 6,
+       RT_CID_819x_RUNTOP      = 7,
+       RT_CID_819x_Senao       = 8,
+       RT_CID_TOSHIBA          = 9,
+       RT_CID_819x_Netcore     = 10,
+       RT_CID_Nettronix        = 11,
+       RT_CID_DLINK            = 12,
+       RT_CID_PRONET           = 13,
+       RT_CID_COREGA           = 14,
+       RT_CID_819x_ALPHA       = 15,
+       RT_CID_819x_Sitecom     = 16,
+       RT_CID_CCX              = 17,
+       RT_CID_819x_Lenovo      = 18,
+       RT_CID_819x_QMI         = 19,
+       RT_CID_819x_Edimax_Belkin = 20,
+       RT_CID_819x_Sercomm_Belkin = 21,
+       RT_CID_819x_CAMEO1 = 22,
+       RT_CID_819x_MSI = 23,
+       RT_CID_819x_Acer = 24,
+       RT_CID_819x_HP  =27,
+       RT_CID_819x_CLEVO = 28,
+       RT_CID_819x_Arcadyan_Belkin = 29,
+       RT_CID_819x_SAMSUNG = 30,
+       RT_CID_819x_WNC_COREGA = 31,
+}RT_CUSTOMER_ID, *PRT_CUSTOMER_ID;
+
+typedef enum _RESET_TYPE {
+       RESET_TYPE_NORESET = 0x00,
+       RESET_TYPE_NORMAL = 0x01,
+       RESET_TYPE_SILENT = 0x02
+} RESET_TYPE;
+
+typedef enum _IC_INFERIORITY_8192S{
+       IC_INFERIORITY_A            = 0,
+       IC_INFERIORITY_B            = 1,
+}IC_INFERIORITY_8192S, *PIC_INFERIORITY_8192S;
+
+typedef enum _PCI_BRIDGE_VENDOR {
+       PCI_BRIDGE_VENDOR_INTEL = 0x0,
+       PCI_BRIDGE_VENDOR_ATI,
+       PCI_BRIDGE_VENDOR_AMD,
+       PCI_BRIDGE_VENDOR_SIS ,
+       PCI_BRIDGE_VENDOR_UNKNOWN,
+       PCI_BRIDGE_VENDOR_MAX ,
+} PCI_BRIDGE_VENDOR;
+
+typedef struct buffer
+{
+       struct buffer *next;
+       u32 *buf;
+       dma_addr_t dma;
+
+} buffer;
+
+typedef struct rtl_reg_debug{
+        unsigned int  cmd;
+        struct {
+                unsigned char type;
+                unsigned char addr;
+                unsigned char page;
+                unsigned char length;
+        } head;
+        unsigned char buf[0xff];
+}rtl_reg_debug;
+
+typedef struct _rt_9x_tx_rate_history {
+       u32             cck[4];
+       u32             ofdm[8];
+       u32             ht_mcs[4][16];
+}rt_tx_rahis_t, *prt_tx_rahis_t;
+
+typedef        struct _RT_SMOOTH_DATA_4RF {
+       char    elements[4][100];
+       u32     index;
+       u32     TotalNum;
+       u32     TotalVal[4];
+}RT_SMOOTH_DATA_4RF, *PRT_SMOOTH_DATA_4RF;
+
+typedef struct Stats
+{
+       unsigned long txrdu;
+       unsigned long rxrdu;
+       unsigned long rxok;
+       unsigned long rxframgment;
+       unsigned long rxcmdpkt[4];
+       unsigned long rxurberr;
+       unsigned long rxstaterr;
+       unsigned long rxdatacrcerr;
+       unsigned long rxmgmtcrcerr;
+       unsigned long rxcrcerrmin;
+       unsigned long rxcrcerrmid;
+       unsigned long rxcrcerrmax;
+       unsigned long received_rate_histogram[4][32];
+       unsigned long received_preamble_GI[2][32];
+       unsigned long   rx_AMPDUsize_histogram[5];
+       unsigned long rx_AMPDUnum_histogram[5];
+       unsigned long numpacket_matchbssid;
+       unsigned long numpacket_toself;
+       unsigned long num_process_phyinfo;
+       unsigned long numqry_phystatus;
+       unsigned long numqry_phystatusCCK;
+       unsigned long numqry_phystatusHT;
+       unsigned long received_bwtype[5];
+       unsigned long txnperr;
+       unsigned long txnpdrop;
+       unsigned long txresumed;
+       unsigned long rxoverflow;
+       unsigned long rxint;
+       unsigned long txnpokint;
+       unsigned long ints;
+       unsigned long shints;
+       unsigned long txoverflow;
+       unsigned long txlpokint;
+       unsigned long txlpdrop;
+       unsigned long txlperr;
+       unsigned long txbeokint;
+       unsigned long txbedrop;
+       unsigned long txbeerr;
+       unsigned long txbkokint;
+       unsigned long txbkdrop;
+       unsigned long txbkerr;
+       unsigned long txviokint;
+       unsigned long txvidrop;
+       unsigned long txvierr;
+       unsigned long txvookint;
+       unsigned long txvodrop;
+       unsigned long txvoerr;
+       unsigned long txbeaconokint;
+       unsigned long txbeacondrop;
+       unsigned long txbeaconerr;
+       unsigned long txmanageokint;
+       unsigned long txmanagedrop;
+       unsigned long txmanageerr;
+       unsigned long txcmdpktokint;
+       unsigned long txdatapkt;
+       unsigned long txfeedback;
+       unsigned long txfeedbackok;
+       unsigned long txoktotal;
+       unsigned long txokbytestotal;
+       unsigned long txokinperiod;
+       unsigned long txmulticast;
+       unsigned long txbytesmulticast;
+       unsigned long txbroadcast;
+       unsigned long txbytesbroadcast;
+       unsigned long txunicast;
+       unsigned long txbytesunicast;
+       unsigned long rxbytesunicast;
+       unsigned long txfeedbackfail;
+       unsigned long txerrtotal;
+       unsigned long txerrbytestotal;
+       unsigned long txerrmulticast;
+       unsigned long txerrbroadcast;
+       unsigned long txerrunicast;
+       unsigned long txretrycount;
+       unsigned long txfeedbackretry;
+       u8                      last_packet_rate;
+       unsigned long slide_signal_strength[100];
+       unsigned long slide_evm[100];
+       unsigned long   slide_rssi_total;
+       unsigned long slide_evm_total;
+       long signal_strength;
+       long signal_quality;
+       long last_signal_strength_inpercent;
+       long    recv_signal_power;
+       u8 rx_rssi_percentage[4];
+       u8 rx_evm_percentage[2];
+       long rxSNRdB[4];
+       rt_tx_rahis_t txrate;
+       u32 Slide_Beacon_pwdb[100];
+       u32 Slide_Beacon_Total;
+       RT_SMOOTH_DATA_4RF              cck_adc_pwdb;
+       u32     CurrentShowTxate;
+} Stats;
+
+typedef struct ChnlAccessSetting {
+       u16 SIFS_Timer;
+       u16 DIFS_Timer;
+       u16 SlotTimeTimer;
+       u16 EIFS_Timer;
+       u16 CWminIndex;
+       u16 CWmaxIndex;
+}*PCHANNEL_ACCESS_SETTING,CHANNEL_ACCESS_SETTING;
+
+typedef enum _TWO_PORT_STATUS
+{
+       TWO_PORT_STATUS__DEFAULT_ONLY,
+       TWO_PORT_STATUS__EXTENSION_ONLY,
+       TWO_PORT_STATUS__EXTENSION_FOLLOW_DEFAULT,
+       TWO_PORT_STATUS__DEFAULT_G_EXTENSION_N20,
+       TWO_PORT_STATUS__ADHOC,
+       TWO_PORT_STATUS__WITHOUT_ANY_ASSOCIATE
+}TWO_PORT_STATUS;
+
+typedef struct _txbbgain_struct
+{
+       long    txbb_iq_amplifygain;
+       u32     txbbgain_value;
+} txbbgain_struct, *ptxbbgain_struct;
+
+typedef struct _ccktxbbgain_struct
+{
+       u8      ccktxbb_valuearray[8];
+} ccktxbbgain_struct,*pccktxbbgain_struct;
+
+typedef struct _init_gain
+{
+       u8                              xaagccore1;
+       u8                              xbagccore1;
+       u8                              xcagccore1;
+       u8                              xdagccore1;
+       u8                              cca;
+
+} init_gain, *pinit_gain;
+
+typedef struct _tx_ring{
+       u32 * desc;
+       u8 nStuckCount;
+       struct _tx_ring * next;
+}__attribute__ ((packed)) tx_ring, * ptx_ring;
+
+struct rtl8192_tx_ring {
+    tx_desc *desc;
+    dma_addr_t dma;
+    unsigned int idx;
+    unsigned int entries;
+    struct sk_buff_head queue;
+};
+
+
+
+struct rtl819x_ops{
+       nic_t nic_type;
+       void (* get_eeprom_size)(struct net_device* dev);
+       void (* init_adapter_variable)(struct net_device* dev);
+       void (* init_before_adapter_start)(struct net_device* dev);
+       bool (* initialize_adapter)(struct net_device* dev);
+       void (*link_change)(struct net_device* dev);
+       void (* tx_fill_descriptor)(struct net_device* dev, tx_desc * tx_desc, cb_desc * cb_desc, struct sk_buff *skb);
+       void (* tx_fill_cmd_descriptor)(struct net_device* dev, tx_desc_cmd * entry, cb_desc * cb_desc, struct sk_buff *skb);
+       bool (* rx_query_status_descriptor)(struct net_device* dev, struct rtllib_rx_stats*  stats, rx_desc *pdesc, struct sk_buff* skb);
+       bool (* rx_command_packet_handler)(struct net_device *dev, struct sk_buff* skb, rx_desc *pdesc);
+       void (* stop_adapter)(struct net_device *dev, bool reset);
+       void (* update_ratr_table)(struct net_device* dev);
+       void (* irq_enable)(struct net_device* dev);
+       void (* irq_disable)(struct net_device* dev);
+       void (* irq_clear)(struct net_device* dev);
+       void (* rx_enable)(struct net_device* dev);
+       void (* tx_enable)(struct net_device* dev);
+       void (* interrupt_recognized)(struct net_device *dev, u32 *p_inta, u32 *p_intb);
+       bool (* TxCheckStuckHandler)(struct net_device* dev);
+       bool (* RxCheckStuckHandler)(struct net_device* dev);
+};
+
+typedef struct r8192_priv
+{
+       struct pci_dev *pdev;
+       struct pci_dev *bridge_pdev;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+       u32             pci_state;
+#endif
+
+       bool            bfirst_init;
+       bool            bfirst_after_down;
+       bool            initialized_at_probe;
+       bool            being_init_adapter;
+       bool            bDriverIsGoingToUnload;
+
+       int             irq;
+       short   irq_enabled;
+
+       short   up;
+       short   up_first_time;
+       delayed_work_struct_rsl         update_beacon_wq;
+       delayed_work_struct_rsl         watch_dog_wq;
+       delayed_work_struct_rsl         txpower_tracking_wq;
+       delayed_work_struct_rsl         rfpath_check_wq;
+       delayed_work_struct_rsl         gpio_change_rf_wq;
+       delayed_work_struct_rsl         initialgain_operate_wq;
+       delayed_work_struct_rsl         check_hw_scan_wq;
+       delayed_work_struct_rsl         hw_scan_simu_wq;
+       delayed_work_struct_rsl         start_hw_scan_wq;
+
+       struct workqueue_struct         *priv_wq;
+
+       CHANNEL_ACCESS_SETTING  ChannelAccessSetting;
+
+       mp_adapter                              NdisAdapter;
+
+       struct rtl819x_ops                      *ops;
+       struct rtllib_device                    *rtllib;
+
+#ifdef CONFIG_BT_30
+       struct BT30Info                 BtInfo;
+#endif
+
+#ifdef CONFIG_RTLWIFI_DEBUGFS
+       rtl_fs_debug                            *debug;
+#endif /* CONFIG_IWLWIFI_DEBUGFS */
+
+       work_struct_rsl                         reset_wq;
+
+       LOG_INTERRUPT_8190_T    InterruptLog;
+
+       RT_CUSTOMER_ID                  CustomerID;
+
+
+       RT_RF_TYPE_819xU                rf_chip;
+       IC_INFERIORITY_8192S            IC_Class;
+       HT_CHANNEL_WIDTH                CurrentChannelBW;
+       BB_REGISTER_DEFINITION_T        PHYRegDef[4];
+       rate_adaptive                           rate_adaptive;
+
+       ccktxbbgain_struct                      cck_txbbgain_table[CCKTxBBGainTableLength];
+       ccktxbbgain_struct                      cck_txbbgain_ch14_table[CCKTxBBGainTableLength];
+
+       txbbgain_struct                         txbbgain_table[TxBBGainTableLength];
+
+       ACM_METHOD                              AcmMethod;
+
+       prt_firmware                            pFirmware;
+       rtl819x_loopback_e                      LoopbackMode;
+       firmware_source_e                       firmware_source;
+
+       struct timer_list                       watch_dog_timer;
+       struct timer_list                       fsync_timer;
+       struct timer_list                       gpio_polling_timer;
+
+       spinlock_t                              fw_scan_lock;
+       spinlock_t                              irq_lock;
+       spinlock_t                              irq_th_lock;
+       spinlock_t                              tx_lock;
+       spinlock_t                              rf_ps_lock;
+       spinlock_t                              rw_lock;
+       spinlock_t                              rt_h2c_lock;
+#ifdef CONFIG_ASPM_OR_D3
+       spinlock_t                              D3_lock;
+#endif
+       spinlock_t                              rf_lock;
+       spinlock_t                              ps_lock;
+
+       struct sk_buff_head             rx_queue;
+       struct sk_buff_head             skb_queue;
+
+       struct tasklet_struct           irq_rx_tasklet;
+       struct tasklet_struct           irq_tx_tasklet;
+       struct tasklet_struct           irq_prepare_beacon_tasklet;
+
+       struct semaphore                        wx_sem;
+       struct semaphore                        rf_sem;
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,16))
+       struct semaphore                        mutex;
+#else
+       struct mutex                            mutex;
+#endif
+
+       struct Stats                            stats;
+       struct iw_statistics                    wstats;
+       struct proc_dir_entry           *dir_dev;
+
+       short (*rf_set_sens)(struct net_device *dev,short sens);
+       u8 (*rf_set_chan)(struct net_device *dev,u8 ch);
+       void (*rf_close)(struct net_device *dev);
+       void (*rf_init)(struct net_device *dev);
+
+#ifdef CONFIG_CFG_80211
+       struct ieee80211_rate rates[IEEE80211_NUM_BANDS][RTL_RATE_MAX];
+       struct ieee80211_supported_band bands[IEEE80211_NUM_BANDS];
+#endif
+
+       rx_desc                 *rx_ring[MAX_RX_QUEUE];
+       struct sk_buff  *rx_buf[MAX_RX_QUEUE][MAX_RX_COUNT];
+       dma_addr_t      rx_ring_dma[MAX_RX_QUEUE];
+       unsigned int    rx_idx[MAX_RX_QUEUE];
+       int             rxringcount;
+       u16             rxbuffersize;
+
+       u32             LastRxDescTSFHigh;
+       u32             LastRxDescTSFLow;
+
+       u16             EarlyRxThreshold;
+       u32             ReceiveConfig;
+       u8              AcmControl;
+       u8              RFProgType;
+       u8              retry_data;
+       u8              retry_rts;
+       u16             rts;
+
+       struct rtl8192_tx_ring tx_ring[MAX_TX_QUEUE_COUNT];
+       int              txringcount;
+       int             txbuffsize;
+       int             txfwbuffersize;
+       atomic_t        tx_pending[0x10];
+
+       u16             ShortRetryLimit;
+       u16             LongRetryLimit;
+       u32             TransmitConfig;
+       u8              RegCWinMin;
+       u8              keepAliveLevel;
+
+#ifdef CONFIG_RTL_RFKILL
+       bool            rfkill_off;
+#endif
+       bool            sw_radio_on;
+       bool            bHwRadioOff;
+       bool            pwrdown;
+       bool            blinked_ingpio;
+       u8              polling_timer_on;
+
+       /**********************************************************/
+
+       enum card_type {PCI,MINIPCI,CARDBUS,USB}card_type;
+
+       work_struct_rsl qos_activate;
+
+       u8              bIbssCoordinator;
+
+       short   promisc;
+       short   crcmon;
+
+       int             txbeaconcount;
+
+       short   chan;
+       short   sens;
+       short   max_sens;
+       u32             rx_prevlen;
+
+       u8              ScanDelay;
+       bool            ps_force;
+
+       u32             irq_mask[2];
+
+       u8              Rf_Mode;
+       nic_t   card_8192;
+       u8              card_8192_version;
+
+       short   enable_gpio0;
+
+       u8              rf_type;
+       u8              IC_Cut;
+       char            nick[IW_ESSID_MAX_SIZE + 1];
+
+       u8              RegBcnCtrlVal;
+       bool            bHwAntDiv;
+
+       bool            bTKIPinNmodeFromReg;
+       bool            bWEPinNmodeFromReg;
+
+       bool            bLedOpenDrain;
+
+       u8              check_roaming_cnt;
+
+       bool            bIgnoreSilentReset;
+       u32             SilentResetRxSoltNum;
+       u32             SilentResetRxSlotIndex;
+       u32             SilentResetRxStuckEvent[MAX_SILENT_RESET_RX_SLOT_NUM];
+
+       void            *scan_cmd;
+       u8      hwscan_bw_40;
+
+       u16             nrxAMPDU_size;
+       u8              nrxAMPDU_aggr_num;
+
+       u32             last_rxdesc_tsf_high;
+       u32             last_rxdesc_tsf_low;
+
+
+       u16             basic_rate;
+       u8              short_preamble;
+       u8              dot11CurrentPreambleMode;
+       u8              slot_time;
+       u16             SifsTime;
+
+       u8              RegWirelessMode;
+
+       u8              firmware_version;
+       u16             FirmwareSubVersion;
+       u16             rf_pathmap;
+       bool            AutoloadFailFlag;
+
+       u8              RegPciASPM;
+       u8              RegAMDPciASPM;
+       u8              RegHwSwRfOffD3;
+       u8              RegSupportPciASPM;
+       bool            bSupportASPM;
+
+       u32             RfRegChnlVal[2];
+
+       u8              ShowRateMode;
+       u8              RATRTableBitmap;
+
+       u8              EfuseMap[2][HWSET_MAX_SIZE_92S];
+       u16             EfuseUsedBytes;
+       u8              EfuseUsedPercentage;
+
+#ifdef EFUSE_REPG_WORKAROUND
+       bool            efuse_RePGSec1Flag;
+       u8              efuse_RePGData[8];
+#endif
+
+       short   epromtype;
+       u16             eeprom_vid;
+       u16             eeprom_did;
+       u16             eeprom_svid;
+       u16             eeprom_smid;
+       u8              eeprom_CustomerID;
+       u16     eeprom_ChannelPlan;
+       u8              eeprom_version;
+
+       u8              EEPROMRegulatory;
+       u8              EEPROMPwrGroup[2][3];
+       u8              EEPROMOptional;
+
+#if (EEPROM_OLD_FORMAT_SUPPORT == 1)
+       u8              EEPROMTxPowerLevelCCK[14];
+       u8              EEPROMTxPowerLevelOFDM24G[14];
+       u8              EEPROMTxPowerLevelOFDM5G[24];
+#else
+       u8              RfCckChnlAreaTxPwr[2][3];
+       u8              RfOfdmChnlAreaTxPwr1T[2][3];
+       u8              RfOfdmChnlAreaTxPwr2T[2][3];
+#endif
+       u8              EEPROMRfACCKChnl1TxPwLevel[3];
+       u8              EEPROMRfAOfdmChnlTxPwLevel[3];
+       u8              EEPROMRfCCCKChnl1TxPwLevel[3];
+       u8              EEPROMRfCOfdmChnlTxPwLevel[3];
+       u16             EEPROMTxPowerDiff;
+       u16             EEPROMAntPwDiff;
+       u8              EEPROMThermalMeter;
+       u8              EEPROMPwDiff;
+       u8              EEPROMCrystalCap;
+
+       u8              EEPROMBluetoothCoexist;
+       u8              EEPROMBluetoothType;
+       u8              EEPROMBluetoothAntNum;
+       u8              EEPROMBluetoothAntIsolation;
+       u8              EEPROMBluetoothRadioShared;
+
+
+       u8              EEPROMSupportWoWLAN;
+       u8              EEPROMBoardType;
+       u8              EEPROM_Def_Ver;
+       u8              EEPROMHT2T_TxPwr[6];
+       u8              EEPROMTSSI_A;
+       u8              EEPROMTSSI_B;
+       u8              EEPROMTxPowerLevelCCK_V1[3];
+       u8              EEPROMLegacyHTTxPowerDiff;
+
+       u8              BluetoothCoexist;
+
+       u8              CrystalCap;
+       u8              ThermalMeter[2];
+
+       u16             FwCmdIOMap;
+       u32             FwCmdIOParam;
+
+       u8              SwChnlInProgress;
+       u8              SwChnlStage;
+       u8              SwChnlStep;
+       u8              SetBWModeInProgress;
+
+       u8              nCur40MhzPrimeSC;
+
+       u32             RfReg0Value[4];
+       u8              NumTotalRFPath;
+       bool            brfpath_rxenable[4];
+
+       bool            bTXPowerDataReadFromEEPORM;
+
+       u16             RegChannelPlan;
+       u16             ChannelPlan;
+       bool            bChnlPlanFromHW;
+
+       bool            RegRfOff;
+       bool            isRFOff;
+       bool            bInPowerSaveMode;
+       u8              bHwRfOffAction;
+
+       bool            aspm_clkreq_enable;
+       u32             pci_bridge_vendor;
+       u8              RegHostPciASPMSetting;
+       u8              RegDevicePciASPMSetting;
+
+       bool            RFChangeInProgress;
+       bool            SetRFPowerStateInProgress;
+       bool            bdisable_nic;
+
+       u8              pwrGroupCnt;
+
+       u8              ThermalValue_LCK;
+       u8              ThermalValue_IQK;
+       bool            bRfPiEnable;
+
+       u32             APKoutput[2][2];
+       bool            bAPKdone;
+
+       long            RegE94;
+       long            RegE9C;
+       long            RegEB4;
+       long            RegEBC;
+
+       u32             RegC04;
+       u32             Reg874;
+       u32             RegC08;
+       u32             ADDA_backup[16];
+       u32             IQK_MAC_backup[3];
+
+       bool            SetFwCmdInProgress;
+       u8              CurrentFwCmdIO;
+
+       u8              rssi_level;
+
+       bool            bInformFWDriverControlDM;
+       u8              PwrGroupHT20[2][14];
+       u8              PwrGroupHT40[2][14];
+
+       u8              ThermalValue;
+       long            EntryMinUndecoratedSmoothedPWDB;
+       long            EntryMaxUndecoratedSmoothedPWDB;
+       u8              DynamicTxHighPowerLvl;
+       u8              LastDTPLvl;
+       u32             CurrentRATR0;
+       FALSE_ALARM_STATISTICS FalseAlmCnt;
+
+       u8              DMFlag;
+       u8              DM_Type;
+
+       u8              CckPwEnl;
+       u16             TSSI_13dBm;
+       u32             Pwr_Track;
+       u8              CCKPresentAttentuation_20Mdefault;
+       u8              CCKPresentAttentuation_40Mdefault;
+       char            CCKPresentAttentuation_difference;
+       char            CCKPresentAttentuation;
+       u8              bCckHighPower;
+       long            undecorated_smoothed_pwdb;
+       long            undecorated_smoothed_cck_adc_pwdb[4];
+
+       u32             MCSTxPowerLevelOriginalOffset[6];
+       u32             CCKTxPowerLevelOriginalOffset;
+       u8              TxPowerLevelCCK[14];
+       u8              TxPowerLevelCCK_A[14];
+       u8              TxPowerLevelCCK_C[14];
+       u8              TxPowerLevelOFDM24G[14];
+       u8              TxPowerLevelOFDM5G[14];
+       u8              TxPowerLevelOFDM24G_A[14];
+       u8              TxPowerLevelOFDM24G_C[14];
+       u8              LegacyHTTxPowerDiff;
+       u8              TxPowerDiff;
+       s8              RF_C_TxPwDiff;
+       s8              RF_B_TxPwDiff;
+       u8              RfTxPwrLevelCck[2][14];
+       u8              RfTxPwrLevelOfdm1T[2][14];
+       u8              RfTxPwrLevelOfdm2T[2][14];
+       u8              AntennaTxPwDiff[3];
+       u8              TxPwrHt20Diff[2][14];
+       u8              TxPwrLegacyHtDiff[2][14];
+       u8              TxPwrSafetyFlag;
+       u8              HT2T_TxPwr_A[14];
+       u8              HT2T_TxPwr_B[14];
+       u8              CurrentCckTxPwrIdx;
+       u8              CurrentOfdm24GTxPwrIdx;
+
+       bool            bdynamic_txpower;
+       bool            bDynamicTxHighPower;
+       bool            bDynamicTxLowPower;
+       bool            bLastDTPFlag_High;
+       bool            bLastDTPFlag_Low;
+
+       bool            bstore_last_dtpflag;
+       bool            bstart_txctrl_bydtp;
+
+       u8              rfa_txpowertrackingindex;
+       u8              rfa_txpowertrackingindex_real;
+       u8              rfa_txpowertracking_default;
+       u8              rfc_txpowertrackingindex;
+       u8              rfc_txpowertrackingindex_real;
+       u8              rfc_txpowertracking_default;
+       bool            btxpower_tracking;
+       bool            bcck_in_ch14;
+
+       u8              TxPowerTrackControl;
+       u8              txpower_count;
+       bool            btxpower_trackingInit;
+
+       u8              OFDM_index[2];
+       u8              CCK_index;
+
+       u8              Record_CCK_20Mindex;
+       u8              Record_CCK_40Mindex;
+
+       init_gain       initgain_backup;
+       u8              DefaultInitialGain[4];
+       bool            bis_any_nonbepkts;
+       bool            bcurrent_turbo_EDCA;
+       bool            bis_cur_rdlstate;
+
+       bool            bCCKinCH14;
+
+       u8              MidHighPwrTHR_L1;
+       u8              MidHighPwrTHR_L2;
+
+       bool            bfsync_processing;
+       u32             rate_record;
+       u32             rateCountDiffRecord;
+       u32             ContiuneDiffCount;
+       bool            bswitch_fsync;
+       u8              framesync;
+       u32             framesyncC34;
+       u8              framesyncMonitor;
+
+       bool            bDMInitialGainEnable;
+        bool           MutualAuthenticationFail;
+
+       bool            bDisableFrameBursting;
+
+       u32             reset_count;
+       bool            bpbc_pressed;
+
+       u32             txpower_checkcnt;
+       u32             txpower_tracking_callback_cnt;
+       u8              thermal_read_val[40];
+       u8              thermal_readback_index;
+       u32             ccktxpower_adjustcnt_not_ch14;
+       u32             ccktxpower_adjustcnt_ch14;
+
+       RESET_TYPE      ResetProgress;
+       bool            bForcedSilentReset;
+       bool            bDisableNormalResetCheck;
+       u16             TxCounter;
+       u16             RxCounter;
+       int             IrpPendingCount;
+       bool            bResetInProgress;
+       bool            force_reset;
+       bool            force_lps;
+       u8              InitialGainOperateType;
+
+       bool            chan_forced;
+       bool            bSingleCarrier;
+       bool            RegBoard;
+       bool            bCckContTx;
+       bool            bOfdmContTx;
+       bool            bStartContTx;
+       u8              RegPaModel;
+       u8              btMpCckTxPower;
+       u8              btMpOfdmTxPower;
+
+       u32             MptActType;
+       u32             MptIoOffset;
+       u32             MptIoValue;
+       u32             MptRfPath;
+
+       u32             MptBandWidth;
+       u32             MptRateIndex;
+       u8              MptChannelToSw;
+       u32     MptRCR;
+
+       u8              PwrDomainProtect;
+       u8              H2CTxCmdSeq;
+
+
+}r8192_priv;
+
+extern const struct ethtool_ops rtl819x_ethtool_ops;
+
+void rtl8192_tx_cmd(struct net_device *dev, struct sk_buff *skb);
+short rtl8192_tx(struct net_device *dev, struct sk_buff* skb);
+
+u8 read_nic_io_byte(struct net_device *dev, int x);
+u32 read_nic_io_dword(struct net_device *dev, int x);
+u16 read_nic_io_word(struct net_device *dev, int x) ;
+void write_nic_io_byte(struct net_device *dev, int x,u8 y);
+void write_nic_io_word(struct net_device *dev, int x,u16 y);
+void write_nic_io_dword(struct net_device *dev, int x,u32 y);
+
+u8 read_nic_byte(struct net_device *dev, int x);
+u32 read_nic_dword(struct net_device *dev, int x);
+u16 read_nic_word(struct net_device *dev, int x) ;
+void write_nic_byte(struct net_device *dev, int x,u8 y);
+void write_nic_word(struct net_device *dev, int x,u16 y);
+void write_nic_dword(struct net_device *dev, int x,u32 y);
+
+void force_pci_posting(struct net_device *dev);
+
+void rtl8192_rx_enable(struct net_device *);
+void rtl8192_tx_enable(struct net_device *);
+
+int rtl8192_hard_start_xmit(struct sk_buff *skb,struct net_device *dev);
+void rtl8192_hard_data_xmit(struct sk_buff *skb, struct net_device *dev, int rate);
+void rtl8192_data_hard_stop(struct net_device *dev);
+void rtl8192_data_hard_resume(struct net_device *dev);
+void rtl8192_restart(void *data);
+void rtl819x_watchdog_wqcallback(void *data);
+void rtl8192_hw_sleep_wq (void *data);
+void watch_dog_timer_callback(unsigned long data);
+void rtl8192_irq_rx_tasklet(struct r8192_priv *priv);
+void rtl8192_irq_tx_tasklet(struct r8192_priv *priv);
+int rtl8192_down(struct net_device *dev,bool shutdownrf);
+int rtl8192_up(struct net_device *dev);
+void rtl8192_commit(struct net_device *dev);
+void rtl8192_set_chan(struct net_device *dev,short ch);
+
+void check_rfctrl_gpio_timer(unsigned long data);
+
+void rtl8192_hw_wakeup_wq(void *data);
+irqreturn_type rtl8192_interrupt(int irq, void *netdev, struct pt_regs *regs);
+
+short rtl8192_pci_initdescring(struct net_device *dev);
+
+void rtl8192_cancel_deferred_work(struct r8192_priv* priv);
+
+int _rtl8192_up(struct net_device *dev,bool is_silent_reset);
+
+short rtl8192_is_tx_queue_empty(struct net_device *dev);
+void rtl8192_irq_disable(struct net_device *dev);
+
+void rtl8192_tx_timeout(struct net_device *dev);
+void rtl8192_pci_resetdescring(struct net_device *dev);
+void rtl8192_SetWirelessMode(struct net_device* dev, u8 wireless_mode);
+void rtl8192_irq_enable(struct net_device *dev);
+void rtl8192_config_rate(struct net_device* dev, u16* rate_config);
+void rtl8192_update_cap(struct net_device* dev, u16 cap);
+void rtl8192_irq_disable(struct net_device *dev);
+
+void rtl819x_UpdateRxPktTimeStamp (struct net_device *dev, struct rtllib_rx_stats *stats);
+long rtl819x_translate_todbm(struct r8192_priv * priv, u8 signal_strength_index        );
+void rtl819x_update_rxsignalstatistics8190pci(struct r8192_priv * priv,struct rtllib_rx_stats * pprevious_stats);
+u8 rtl819x_evm_dbtopercentage(char value);
+void rtl819x_process_cck_rxpathsel(struct r8192_priv * priv,struct rtllib_rx_stats * pprevious_stats);
+u8 rtl819x_query_rxpwrpercentage(      char            antpower        );
+void rtl8192_record_rxdesc_forlateruse(struct rtllib_rx_stats * psrc_stats,struct rtllib_rx_stats * ptarget_stats);
+
+bool NicIFEnableNIC(struct net_device* dev);
+bool NicIFDisableNIC(struct net_device* dev);
+
+bool
+MgntActSet_RF_State(
+       struct net_device* dev,
+       RT_RF_POWER_STATE       StateToSet,
+       RT_RF_CHANGE_SOURCE ChangeSource,
+       bool    ProtectOrNot
+       );
+void
+ActUpdateChannelAccessSetting(
+       struct net_device*                      dev,
+       WIRELESS_MODE                   WirelessMode,
+       PCHANNEL_ACCESS_SETTING ChnlAccessSetting
+       );
+
+#ifdef CONFIG_CFG_80211
+struct net_device *wiphy_to_net_device(struct wiphy *wiphy);
+#endif
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_crypto.h b/drivers/staging/rtl8192e/rtl_crypto.h
new file mode 100644 (file)
index 0000000..6f445c5
--- /dev/null
@@ -0,0 +1,408 @@
+/*
+ * Scatterlist Cryptographic API.
+ *
+ * Copyright (c) 2002 James Morris <jmorris@intercode.com.au>
+ * Copyright (c) 2002 David S. Miller (davem@redhat.com)
+ *
+ * Portions derived from Cryptoapi, by Alexander Kjeldaas <astor@fast.no>
+ * and Nettle, by Niels Mé°ˆler.
+ *
+ * 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.
+ *
+ */
+#ifndef _LINUX_CRYPTO_H
+#define _LINUX_CRYPTO_H
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <linux/types.h>
+#include <linux/list.h>
+#include <linux/string.h>
+#include <asm/page.h>
+#include <asm/errno.h>
+
+#ifdef BUILT_IN_CRYPTO
+#ifdef CONFIG_CRYPTO_HMAC
+#undef CONFIG_CRYPTO_HMAC
+#endif
+
+#ifdef CONFIG_KMOD
+#undef CONFIG_KMOD
+#endif
+#endif /* BUILT_IN_CRYPTO */
+
+#define crypto_register_alg crypto_register_alg_rsl
+#define crypto_unregister_alg crypto_unregister_alg_rsl
+#define crypto_alloc_tfm crypto_alloc_tfm_rsl
+#define crypto_free_tfm crypto_free_tfm_rsl
+#define crypto_alg_available crypto_alg_available_rsl
+
+/*
+ * Algorithm masks and types.
+ */
+#define CRYPTO_ALG_TYPE_MASK           0x000000ff
+#define CRYPTO_ALG_TYPE_CIPHER         0x00000001
+#define CRYPTO_ALG_TYPE_DIGEST         0x00000002
+#define CRYPTO_ALG_TYPE_COMPRESS       0x00000004
+
+/*
+ * Transform masks and values (for crt_flags).
+ */
+#define CRYPTO_TFM_MODE_MASK           0x000000ff
+#define CRYPTO_TFM_REQ_MASK            0x000fff00
+#define CRYPTO_TFM_RES_MASK            0xfff00000
+
+#define CRYPTO_TFM_MODE_ECB            0x00000001
+#define CRYPTO_TFM_MODE_CBC            0x00000002
+#define CRYPTO_TFM_MODE_CFB            0x00000004
+#define CRYPTO_TFM_MODE_CTR            0x00000008
+
+#define CRYPTO_TFM_REQ_WEAK_KEY                0x00000100
+#define CRYPTO_TFM_RES_WEAK_KEY                0x00100000
+#define CRYPTO_TFM_RES_BAD_KEY_LEN     0x00200000
+#define CRYPTO_TFM_RES_BAD_KEY_SCHED   0x00400000
+#define CRYPTO_TFM_RES_BAD_BLOCK_LEN   0x00800000
+#define CRYPTO_TFM_RES_BAD_FLAGS       0x01000000
+
+/*
+ * Miscellaneous stuff.
+ */
+#define CRYPTO_UNSPEC                  0
+#define CRYPTO_MAX_ALG_NAME            64
+
+struct scatterlist;
+
+/*
+ * Algorithms: modular crypto algorithm implementations, managed
+ * via crypto_register_alg() and crypto_unregister_alg().
+ */
+struct cipher_alg {
+       unsigned int cia_min_keysize;
+       unsigned int cia_max_keysize;
+       int (*cia_setkey)(void *ctx, const u8 *key,
+                         unsigned int keylen, u32 *flags);
+       void (*cia_encrypt)(void *ctx, u8 *dst, const u8 *src);
+       void (*cia_decrypt)(void *ctx, u8 *dst, const u8 *src);
+};
+
+struct digest_alg {
+       unsigned int dia_digestsize;
+       void (*dia_init)(void *ctx);
+       void (*dia_update)(void *ctx, const u8 *data, unsigned int len);
+       void (*dia_final)(void *ctx, u8 *out);
+       int (*dia_setkey)(void *ctx, const u8 *key,
+                         unsigned int keylen, u32 *flags);
+};
+
+struct compress_alg {
+       int (*coa_init)(void *ctx);
+       void (*coa_exit)(void *ctx);
+       int (*coa_compress)(void *ctx, const u8 *src, unsigned int slen,
+                           u8 *dst, unsigned int *dlen);
+       int (*coa_decompress)(void *ctx, const u8 *src, unsigned int slen,
+                             u8 *dst, unsigned int *dlen);
+};
+
+#define cra_cipher     cra_u.cipher
+#define cra_digest     cra_u.digest
+#define cra_compress   cra_u.compress
+
+struct crypto_alg {
+       struct list_head cra_list;
+       u32 cra_flags;
+       unsigned int cra_blocksize;
+       unsigned int cra_ctxsize;
+       const char cra_name[CRYPTO_MAX_ALG_NAME];
+
+       union {
+               struct cipher_alg cipher;
+               struct digest_alg digest;
+               struct compress_alg compress;
+       } cra_u;
+
+       struct module *cra_module;
+};
+
+/*
+ * Algorithm registration interface.
+ */
+int crypto_register_alg(struct crypto_alg *alg);
+int crypto_unregister_alg(struct crypto_alg *alg);
+
+/*
+ * Algorithm query interface.
+ */
+int crypto_alg_available(const char *name, u32 flags);
+
+/*
+ * Transforms: user-instantiated objects which encapsulate algorithms
+ * and core processing logic.  Managed via crypto_alloc_tfm() and
+ * crypto_free_tfm(), as well as the various helpers below.
+ */
+struct crypto_tfm;
+
+struct cipher_tfm {
+       void *cit_iv;
+       unsigned int cit_ivsize;
+       u32 cit_mode;
+       int (*cit_setkey)(struct crypto_tfm *tfm,
+                         const u8 *key, unsigned int keylen);
+       int (*cit_encrypt)(struct crypto_tfm *tfm,
+                          struct scatterlist *dst,
+                          struct scatterlist *src,
+                          unsigned int nbytes);
+       int (*cit_encrypt_iv)(struct crypto_tfm *tfm,
+                             struct scatterlist *dst,
+                             struct scatterlist *src,
+                             unsigned int nbytes, u8 *iv);
+       int (*cit_decrypt)(struct crypto_tfm *tfm,
+                          struct scatterlist *dst,
+                          struct scatterlist *src,
+                          unsigned int nbytes);
+       int (*cit_decrypt_iv)(struct crypto_tfm *tfm,
+                          struct scatterlist *dst,
+                          struct scatterlist *src,
+                          unsigned int nbytes, u8 *iv);
+       void (*cit_xor_block)(u8 *dst, const u8 *src);
+};
+
+struct digest_tfm {
+       void (*dit_init)(struct crypto_tfm *tfm);
+       void (*dit_update)(struct crypto_tfm *tfm,
+                          struct scatterlist *sg, unsigned int nsg);
+       void (*dit_final)(struct crypto_tfm *tfm, u8 *out);
+       void (*dit_digest)(struct crypto_tfm *tfm, struct scatterlist *sg,
+                          unsigned int nsg, u8 *out);
+       int (*dit_setkey)(struct crypto_tfm *tfm,
+                         const u8 *key, unsigned int keylen);
+#ifdef CONFIG_CRYPTO_HMAC
+       void *dit_hmac_block;
+#endif
+};
+
+struct compress_tfm {
+       int (*cot_compress)(struct crypto_tfm *tfm,
+                           const u8 *src, unsigned int slen,
+                           u8 *dst, unsigned int *dlen);
+       int (*cot_decompress)(struct crypto_tfm *tfm,
+                             const u8 *src, unsigned int slen,
+                             u8 *dst, unsigned int *dlen);
+};
+
+#define crt_cipher     crt_u.cipher
+#define crt_digest     crt_u.digest
+#define crt_compress   crt_u.compress
+
+struct crypto_tfm {
+
+       u32 crt_flags;
+
+       union {
+               struct cipher_tfm cipher;
+               struct digest_tfm digest;
+               struct compress_tfm compress;
+       } crt_u;
+
+       struct crypto_alg *__crt_alg;
+};
+
+/*
+ * Transform user interface.
+ */
+
+/*
+ * crypto_alloc_tfm() will first attempt to locate an already loaded algorithm.
+ * If that fails and the kernel supports dynamically loadable modules, it
+ * will then attempt to load a module of the same name or alias.  A refcount
+ * is grabbed on the algorithm which is then associated with the new transform.
+ *
+ * crypto_free_tfm() frees up the transform and any associated resources,
+ * then drops the refcount on the associated algorithm.
+ */
+struct crypto_tfm *crypto_alloc_tfm(const char *alg_name, u32 tfm_flags);
+void crypto_free_tfm(struct crypto_tfm *tfm);
+
+/*
+ * Transform helpers which query the underlying algorithm.
+ */
+static inline const char *crypto_tfm_alg_name(struct crypto_tfm *tfm)
+{
+       return tfm->__crt_alg->cra_name;
+}
+
+static inline const char *crypto_tfm_alg_modname(struct crypto_tfm *tfm)
+{
+       struct crypto_alg *alg = tfm->__crt_alg;
+
+       if (alg->cra_module)
+               return alg->cra_module->name;
+       else
+               return NULL;
+}
+
+static inline u32 crypto_tfm_alg_type(struct crypto_tfm *tfm)
+{
+       return tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK;
+}
+
+static inline unsigned int crypto_tfm_alg_min_keysize(struct crypto_tfm *tfm)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       return tfm->__crt_alg->cra_cipher.cia_min_keysize;
+}
+
+static inline unsigned int crypto_tfm_alg_max_keysize(struct crypto_tfm *tfm)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       return tfm->__crt_alg->cra_cipher.cia_max_keysize;
+}
+
+static inline unsigned int crypto_tfm_alg_ivsize(struct crypto_tfm *tfm)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       return tfm->crt_cipher.cit_ivsize;
+}
+
+static inline unsigned int crypto_tfm_alg_blocksize(struct crypto_tfm *tfm)
+{
+       return tfm->__crt_alg->cra_blocksize;
+}
+
+static inline unsigned int crypto_tfm_alg_digestsize(struct crypto_tfm *tfm)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
+       return tfm->__crt_alg->cra_digest.dia_digestsize;
+}
+
+/*
+ * API wrappers.
+ */
+static inline void crypto_digest_init(struct crypto_tfm *tfm)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
+       tfm->crt_digest.dit_init(tfm);
+}
+
+static inline void crypto_digest_update(struct crypto_tfm *tfm,
+                                        struct scatterlist *sg,
+                                        unsigned int nsg)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
+       tfm->crt_digest.dit_update(tfm, sg, nsg);
+}
+
+static inline void crypto_digest_final(struct crypto_tfm *tfm, u8 *out)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
+       tfm->crt_digest.dit_final(tfm, out);
+}
+
+static inline void crypto_digest_digest(struct crypto_tfm *tfm,
+                                        struct scatterlist *sg,
+                                        unsigned int nsg, u8 *out)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
+       tfm->crt_digest.dit_digest(tfm, sg, nsg, out);
+}
+
+static inline int crypto_digest_setkey(struct crypto_tfm *tfm,
+                                       const u8 *key, unsigned int keylen)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_DIGEST);
+       if (tfm->crt_digest.dit_setkey == NULL)
+               return -ENOSYS;
+       return tfm->crt_digest.dit_setkey(tfm, key, keylen);
+}
+
+static inline int crypto_cipher_setkey(struct crypto_tfm *tfm,
+                                       const u8 *key, unsigned int keylen)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       return tfm->crt_cipher.cit_setkey(tfm, key, keylen);
+}
+
+static inline int crypto_cipher_encrypt(struct crypto_tfm *tfm,
+                                        struct scatterlist *dst,
+                                        struct scatterlist *src,
+                                        unsigned int nbytes)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       return tfm->crt_cipher.cit_encrypt(tfm, dst, src, nbytes);
+}
+
+static inline int crypto_cipher_encrypt_iv(struct crypto_tfm *tfm,
+                                           struct scatterlist *dst,
+                                           struct scatterlist *src,
+                                           unsigned int nbytes, u8 *iv)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
+       return tfm->crt_cipher.cit_encrypt_iv(tfm, dst, src, nbytes, iv);
+}
+
+static inline int crypto_cipher_decrypt(struct crypto_tfm *tfm,
+                                        struct scatterlist *dst,
+                                        struct scatterlist *src,
+                                        unsigned int nbytes)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       return tfm->crt_cipher.cit_decrypt(tfm, dst, src, nbytes);
+}
+
+static inline int crypto_cipher_decrypt_iv(struct crypto_tfm *tfm,
+                                           struct scatterlist *dst,
+                                           struct scatterlist *src,
+                                           unsigned int nbytes, u8 *iv)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       BUG_ON(tfm->crt_cipher.cit_mode == CRYPTO_TFM_MODE_ECB);
+       return tfm->crt_cipher.cit_decrypt_iv(tfm, dst, src, nbytes, iv);
+}
+
+static inline void crypto_cipher_set_iv(struct crypto_tfm *tfm,
+                                        const u8 *src, unsigned int len)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       memcpy(tfm->crt_cipher.cit_iv, src, len);
+}
+
+static inline void crypto_cipher_get_iv(struct crypto_tfm *tfm,
+                                        u8 *dst, unsigned int len)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_CIPHER);
+       memcpy(dst, tfm->crt_cipher.cit_iv, len);
+}
+
+static inline int crypto_comp_compress(struct crypto_tfm *tfm,
+                                       const u8 *src, unsigned int slen,
+                                       u8 *dst, unsigned int *dlen)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
+       return tfm->crt_compress.cot_compress(tfm, src, slen, dst, dlen);
+}
+
+static inline int crypto_comp_decompress(struct crypto_tfm *tfm,
+                                         const u8 *src, unsigned int slen,
+                                         u8 *dst, unsigned int *dlen)
+{
+       BUG_ON(crypto_tfm_alg_type(tfm) != CRYPTO_ALG_TYPE_COMPRESS);
+       return tfm->crt_compress.cot_decompress(tfm, src, slen, dst, dlen);
+}
+
+/*
+ * HMAC support.
+ */
+#ifdef CONFIG_CRYPTO_HMAC
+void crypto_hmac_init(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen);
+void crypto_hmac_update(struct crypto_tfm *tfm,
+                        struct scatterlist *sg, unsigned int nsg);
+void crypto_hmac_final(struct crypto_tfm *tfm, u8 *key,
+                       unsigned int *keylen, u8 *out);
+void crypto_hmac(struct crypto_tfm *tfm, u8 *key, unsigned int *keylen,
+                 struct scatterlist *sg, unsigned int nsg, u8 *out);
+#endif /* CONFIG_CRYPTO_HMAC */
+
+#endif /* _LINUX_CRYPTO_H */
diff --git a/drivers/staging/rtl8192e/rtl_debug.c b/drivers/staging/rtl8192e/rtl_debug.c
new file mode 100644 (file)
index 0000000..6883994
--- /dev/null
@@ -0,0 +1,1339 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtl_debug.h"
+#include "rtl_core.h"
+#include "r8192E_phy.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h" /* RTL8225 Radio frontend */
+#include "r8192E_cmdpkt.h"
+
+u32 rt_global_debug_component = \
+                               COMP_ERR ;
+
+/*------------------Declare variable-----------------------*/
+u32    DBGP_Type[DBGP_TYPE_MAX];
+
+/*-----------------------------------------------------------------------------
+ * Function:    DBGP_Flag_Init
+ *
+ * Overview:    Refresh all debug print control flag content to zero.
+ *
+ * Input:       NONE
+ *
+ * Output:      NONE
+ *
+ * Return:      NONE
+ *
+ * Revised History:
+ *  When               Who             Remark
+ *  10/20/2006 MHC             Create Version 0.
+ *
+ *---------------------------------------------------------------------------*/
+void   rtl8192_dbgp_flag_init(struct net_device *dev)
+{
+    u8 i;
+
+       for (i = 0; i < DBGP_TYPE_MAX; i++)
+       {
+               DBGP_Type[i] = 0;
+       }
+
+
+}      /* DBGP_Flag_Init */
+
+/* this is only for debugging */
+void print_buffer(u32 *buffer, int len)
+{
+       int i;
+       u8 *buf =(u8*)buffer;
+
+       printk("ASCII BUFFER DUMP (len: %x):\n",len);
+
+       for (i=0;i<len;i++)
+               printk("%c",buf[i]);
+
+       printk("\nBINARY BUFFER DUMP (len: %x):\n",len);
+
+       for (i=0;i<len;i++)
+               printk("%x",buf[i]);
+
+       printk("\n");
+}
+
+/* this is only for debug */
+void dump_eprom(struct net_device *dev)
+{
+       int i;
+
+       for (i = 0; i < 0xff; i++) {
+               RT_TRACE(COMP_INIT, "EEPROM addr %x : %x", i, eprom_read(dev,i));
+       }
+}
+
+/* this is only for debug */
+void rtl8192_dump_reg(struct net_device *dev)
+{
+       int i;
+       int n;
+       int max = 0x5ff;
+
+       RT_TRACE(COMP_INIT, "Dumping NIC register map");
+
+       for (n = 0; n <= max; ) {
+               printk( "\nD: %2x> ", n);
+               for (i = 0; i < 16 && n <= max; i++, n++)
+                       printk("%2x ", read_nic_byte(dev, n));
+       }
+       printk("\n");
+}
+
+#ifdef CONFIG_RTLWIFI_DEBUGFS
+/* debugfs related stuff */
+static struct dentry *rtl_debugfs_root;
+static int rtl_dbgfs_open(struct inode *inode, struct file *file)
+{
+       file->private_data = inode->i_private;
+       return 0;
+}
+
+static ssize_t rtl_dbgfs_register_write(struct file *file,
+               const char __user *user_buf,
+               size_t count,
+               loff_t *ppos)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)file->private_data;
+       char buf[32];
+       int buf_size;
+       u32 type, offset;
+
+       memset(buf, 0, sizeof(buf));
+       buf_size = min(count, sizeof(buf) -  1);
+       if (copy_from_user(buf, user_buf, buf_size))
+               return -EFAULT;
+
+       if (sscanf(buf, "%x,%x", &type, &offset ) == 2) {
+               priv->debug->hw_type = type;
+               priv->debug->hw_offset = offset;
+       } else {
+               priv->debug->hw_type = 0;
+               priv->debug->hw_offset = 0;
+       }
+
+       return count;
+}
+
+void  rtl_hardware_grab(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int t = 0;
+       int timeout = 20;
+       u32 mask = RF_CHANGE_BY_HW|RF_CHANGE_BY_PS|RF_CHANGE_BY_IPS;
+
+       priv->debug->hw_holding = true;
+       rtllib_ips_leave_wq(dev);
+       do {
+               if ((priv->rtllib->RfOffReason & mask)) {
+                       msleep(100);
+                       t++;
+               } else {
+                       return;
+               }
+       } while (t < timeout);
+
+       return;
+}
+
+static ssize_t rtl_dbgfs_register_read(struct file *file,
+               char __user *user_buf,
+               size_t count,
+               loff_t *ppos)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)file->private_data;
+       struct net_device *dev = priv->rtllib->dev;
+       ssize_t ret = 0;
+       char buf[2048];
+       int n,i;
+       u32 len = 0;
+       u32 max = 0xff;
+       u32 page_no, path;
+
+       rtl_hardware_grab(dev);
+
+       if (!priv->debug->hw_type) {
+               page_no = (priv->debug->hw_offset > 0x0f)? 0x0f: priv->debug->hw_offset;
+#ifdef RTL8192SE
+               if (page_no >= 0x08 ) {
+                       len += snprintf(buf + len, count - len,
+                                       "\n#################### BB page- %x##################\n ", page_no);
+                       for (n=0;n<=max;)
+                       {
+                               len += snprintf(buf + len, count - len, "\nD:  %2x > ",n);
+                               for (i=0;i<4 && n<=max;n+=4,i++)
+                                       len += snprintf(buf + len, count - len,
+                                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page_no << 8|n),
+                                                               bMaskDWord));
+                       }
+
+               } else
+#endif
+               {
+                       len += snprintf(buf + len,count - len,
+                                       "\n#################### MAC page- %x##################\n ", page_no);
+                       for (n=0;n<=max;) {
+                               len += snprintf(buf + len, count - len, "\nD:  %2x > ",n);
+                               for (i=0;i<16 && n<=max;i++,n++)
+                                       len += snprintf(buf + len, count - len,
+                                                       "%2.2x ",read_nic_byte(dev,((page_no<<8)|n)));
+                       }
+               }
+       } else {
+               path = (priv->debug->hw_offset < RF90_PATH_MAX)? priv->debug->hw_offset:(RF90_PATH_MAX - 1);
+               len += snprintf(buf + len, count - len,
+                               "\n#################### RF-PATH-%x ##################\n ", 0x0a+path);
+               for (n=0;n<=max;) {
+                       len += snprintf(buf+ len, count - len, "\nD:  %2x > ",n);
+                       for (i=0;i<4 && n<=max;n+=4,i++)
+                               len += snprintf(buf + len, count - len,
+                                       "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)path,\
+                                               n, bMaskDWord));
+               }
+       }
+
+       priv->debug->hw_holding = false;
+
+       len += snprintf(buf + len, count - len, "\n");
+       ret = simple_read_from_buffer(user_buf, count, ppos, buf, len);
+       return ret;
+}
+
+static const struct file_operations rtl_register_debug = {
+       .read   = rtl_dbgfs_register_read,
+       .write  = rtl_dbgfs_register_write,
+       .open   = rtl_dbgfs_open,
+       .owner  = THIS_MODULE
+};
+
+int rtl_debug_module_init(struct r8192_priv *priv, const char *name)
+{
+       rtl_fs_debug *debug;
+       int ret = 0;
+
+       if (!rtl_debugfs_root)
+               return -ENOENT;
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
+       debug = kzalloc(sizeof(rtl_fs_debug), GFP_KERNEL);
+#else
+       rtl_fs_debug = kmalloc(sizeof(*rtl_fs_debug), GFP_KERNEL);
+       memset(rtl_fs_debug,0,sizeof(*rtl_fs_debug));
+#endif
+       if (!debug) {
+               ret = -ENOMEM;
+               goto err;
+       }
+       priv->debug = debug;
+
+       debug->name = name;
+       debug->dir_drv = debugfs_create_dir(name, rtl_debugfs_root);
+       if (!debug->dir_drv ) {
+               ret = -ENOENT;
+               goto err;
+       }
+
+       debug->debug_register = debugfs_create_file("debug_register", S_IRUGO,
+                        debug->dir_drv, priv, &rtl_register_debug);
+       if (!debug->debug_register) {
+               ret = -ENOENT;
+               goto err;
+       }
+
+       return 0;
+err:
+        RT_TRACE(COMP_DBG, "Can't open the debugfs directory\n");
+        rtl_debug_module_remove(priv);
+        return ret;
+
+}
+
+void rtl_debug_module_remove(struct r8192_priv *priv)
+{
+       if (!priv->debug)
+               return;
+       debugfs_remove(priv->debug->debug_register);
+       debugfs_remove(priv->debug->dir_drv);
+       kfree(priv->debug);
+       priv->debug = NULL;
+}
+
+int rtl_create_debugfs_root(void)
+{
+       rtl_debugfs_root = debugfs_create_dir(DRV_NAME, NULL);
+       if (!rtl_debugfs_root)
+               return -ENOENT;
+
+       return 0;
+}
+
+void rtl_remove_debugfs_root(void)
+{
+       debugfs_remove(rtl_debugfs_root);
+       rtl_debugfs_root = NULL;
+}
+#endif
+
+/****************************************************************************
+   -----------------------------PROCFS STUFF-------------------------
+*****************************************************************************/
+/*This part is related to PROC, which will record some statistics. */
+static struct proc_dir_entry *rtl8192_proc = NULL;
+
+static int proc_get_stats_ap(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       struct rtllib_device *ieee = priv->rtllib;
+       struct rtllib_network *target;
+
+       int len = 0;
+
+        list_for_each_entry(target, &ieee->network_list, list) {
+
+               len += snprintf(page + len, count - len,
+                "%s ", target->ssid);
+
+               if (target->wpa_ie_len>0 || target->rsn_ie_len>0){
+                       len += snprintf(page + len, count - len,
+                       "WPA\n");
+               }
+               else{
+                        len += snprintf(page + len, count - len,
+                        "non_WPA\n");
+                }
+
+        }
+
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_registers_0(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x000;
+
+#ifdef RTL8192SE
+       /* This dump the current register page */
+       if (!IS_BB_REG_OFFSET_92S(page0)){
+               len += snprintf(page + len, count - len,
+                               "\n####################page %x##################\n ", (page0>>8));
+               for (n=0;n<=max;)
+               {
+                       len += snprintf(page + len, count - len,
+                                       "\nD:  %2x > ",n);
+                       for (i=0;i<16 && n<=max;i++,n++)
+                               len += snprintf(page + len, count - len,
+                                               "%2.2x ",read_nic_byte(dev,(page0|n)));
+               }
+       }else
+#endif
+       {
+               len += snprintf(page + len, count - len,
+                               "\n####################page %x##################\n ", (page0>>8));
+               len += snprintf(page + len, count - len,
+                               "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+               for (n=0;n<=max;)
+               {
+                       len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+                       for (i=0;i<16 && n<=max;n++,i++)
+                               len += snprintf(page + len, count - len,
+                                               "%2.2x ",read_nic_byte(dev,(page0|n)));
+               }
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+
+}
+static int proc_get_registers_1(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x100;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len,
+                               "\nD:  %2x > ",n);
+               for (i=0;i<16 && n<=max;i++,n++)
+                       len += snprintf(page + len, count - len,
+                                       "%2.2x ",read_nic_byte(dev,(page0|n)));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+
+}
+static int proc_get_registers_2(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x200;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len,
+                               "\nD:  %2x > ",n);
+               for (i=0;i<16 && n<=max;i++,n++)
+                       len += snprintf(page + len, count - len,
+                                       "%2.2x ",read_nic_byte(dev,(page0|n)));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+
+}
+static int proc_get_registers_3(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x300;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len,
+                               "\nD:  %2x > ",n);
+               for (i=0;i<16 && n<=max;i++,n++)
+                       len += snprintf(page + len, count - len,
+                                       "%2.2x ",read_nic_byte(dev,(page0|n)));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+
+}
+static int proc_get_registers_4(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x400;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len,
+                               "\nD:  %2x > ",n);
+               for (i=0;i<16 && n<=max;i++,n++)
+                       len += snprintf(page + len, count - len,
+                                       "%2.2x ",read_nic_byte(dev,(page0|n)));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+
+}
+static int proc_get_registers_5(char *page, char **start,
+                          off_t offset, int count,
+                          int *eof, void *data)
+{
+        struct net_device *dev = data;
+
+        int len = 0;
+        int i,n,page0;
+
+        int max=0xff;
+        page0 = 0x500;
+
+        /* This dump the current register page */
+        len += snprintf(page + len, count - len,
+                        "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+        for (n=0;n<=max;)
+        {
+                len += snprintf(page + len, count - len,
+                                "\nD:  %2x > ",n);
+                for (i=0;i<16 && n<=max;i++,n++)
+                        len += snprintf(page + len, count - len,
+                                        "%2.2x ",read_nic_byte(dev,(page0|n)));
+        }
+        len += snprintf(page + len, count - len,"\n");
+        *eof = 1;
+        return len;
+
+}
+static int proc_get_registers_6(char *page, char **start,
+                          off_t offset, int count,
+                          int *eof, void *data)
+{
+        struct net_device *dev = data;
+
+        int len = 0;
+        int i,n,page0;
+
+        int max=0xff;
+        page0 = 0x600;
+
+        /* This dump the current register page */
+        len += snprintf(page + len, count - len,
+                        "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+        for (n=0;n<=max;)
+        {
+                len += snprintf(page + len, count - len,
+                                "\nD:  %2x > ",n);
+                for (i=0;i<16 && n<=max;i++,n++)
+                        len += snprintf(page + len, count - len,
+                                        "%2.2x ",read_nic_byte(dev,(page0|n)));
+        }
+        len += snprintf(page + len, count - len,"\n");
+        *eof = 1;
+        return len;
+
+}
+static int proc_get_registers_7(char *page, char **start,
+                          off_t offset, int count,
+                          int *eof, void *data)
+{
+        struct net_device *dev = data;
+
+        int len = 0;
+        int i,n,page0;
+
+        int max=0xff;
+        page0 = 0x700;
+
+        /* This dump the current register page */
+        len += snprintf(page + len, count - len,
+                        "\n####################page %x##################\n ", (page0>>8));
+       len += snprintf(page + len, count - len,
+                       "\nD:  OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F");
+        for (n=0;n<=max;)
+        {
+                len += snprintf(page + len, count - len,
+                                "\nD:  %2x > ",n);
+                for (i=0;i<16 && n<=max;i++,n++)
+                        len += snprintf(page + len, count - len,
+                                        "%2.2x ",read_nic_byte(dev,(page0|n)));
+        }
+        len += snprintf(page + len, count - len,"\n");
+        *eof = 1;
+        return len;
+
+}
+static int proc_get_registers_8(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x800;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+
+}
+static int proc_get_registers_9(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0x900;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+static int proc_get_registers_a(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0xa00;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+static int proc_get_registers_b(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0xb00;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+static int proc_get_registers_c(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0xc00;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+static int proc_get_registers_d(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0xd00;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+static int proc_get_registers_e(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n,page0;
+
+       int max=0xff;
+       page0 = 0xe00;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n####################page %x##################\n ", (page0>>8));
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_QueryBBReg(dev,(page0|n), bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_reg_rf_a(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n;
+
+       int max=0xff;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n#################### RF-A ##################\n ");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_A,n, bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_reg_rf_b(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n;
+
+       int max=0xff;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n#################### RF-B ##################\n ");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_B, n, bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_reg_rf_c(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n;
+
+       int max=0xff;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n#################### RF-C ##################\n ");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_C, n, bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_reg_rf_d(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+
+       int len = 0;
+       int i,n;
+
+       int max=0xff;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                       "\n#################### RF-D ##################\n ");
+       for (n=0;n<=max;)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",n);
+               for (i=0;i<4 && n<=max;n+=4,i++)
+                       len += snprintf(page + len, count - len,
+                                       "%8.8x ",rtl8192_phy_QueryRFReg(dev, (RF90_RADIO_PATH_E)RF90_PATH_D, n, bMaskDWord));
+       }
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_cam_register_1(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+       u32 target_command=0;
+       u32 target_content=0;
+       u8 entry_i=0;
+       u32 ulStatus;
+       int len = 0;
+       int i=100, j = 0;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                               "\n#################### SECURITY CAM (0-10) ##################\n ");
+       for (j=0; j<11; j++)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",j);
+               for (entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
+               {
+                       target_command= entry_i+CAM_CONTENT_COUNT*j;
+                       target_command= target_command | BIT31;
+
+                       while((i--)>=0)
+                       {
+                               ulStatus = read_nic_dword(dev, RWCAM);
+                               if (ulStatus & BIT31){
+                                       continue;
+                               }
+                               else{
+                                       break;
+                               }
+                       }
+                       write_nic_dword(dev, RWCAM, target_command);
+                       target_content = read_nic_dword(dev, RCAMO);
+                       len += snprintf(page + len, count - len,"%8.8x ",target_content);
+               }
+       }
+
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_cam_register_2(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+       u32 target_command=0;
+       u32 target_content=0;
+       u8 entry_i=0;
+       u32 ulStatus;
+       int len = 0;
+       int i=100, j = 0;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                               "\n#################### SECURITY CAM (11-21) ##################\n ");
+       for (j=11; j<22; j++)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",j);
+               for (entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
+               {
+                       target_command= entry_i+CAM_CONTENT_COUNT*j;
+                       target_command= target_command | BIT31;
+
+                       while((i--)>=0)
+                       {
+                               ulStatus = read_nic_dword(dev, RWCAM);
+                               if (ulStatus & BIT31){
+                                       continue;
+                               }
+                               else{
+                                       break;
+                               }
+                       }
+                       write_nic_dword(dev, RWCAM, target_command);
+                       target_content = read_nic_dword(dev, RCAMO);
+                       len += snprintf(page + len, count - len,"%8.8x ",target_content);
+               }
+       }
+
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+
+static int proc_get_cam_register_3(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+       u32 target_command=0;
+       u32 target_content=0;
+       u8 entry_i=0;
+       u32 ulStatus;
+       int len = 0;
+       int i=100, j = 0;
+
+       /* This dump the current register page */
+       len += snprintf(page + len, count - len,
+                               "\n#################### SECURITY CAM (22-31) ##################\n ");
+       for (j=22; j<TOTAL_CAM_ENTRY; j++)
+       {
+               len += snprintf(page + len, count - len, "\nD:  %2x > ",j);
+               for (entry_i=0;entry_i<CAM_CONTENT_COUNT;entry_i++)
+               {
+                       target_command= entry_i+CAM_CONTENT_COUNT*j;
+                       target_command= target_command | BIT31;
+
+                       while((i--)>=0)
+                       {
+                               ulStatus = read_nic_dword(dev, RWCAM);
+                               if (ulStatus & BIT31){
+                                       continue;
+                               }
+                               else{
+                                       break;
+                               }
+                       }
+                       write_nic_dword(dev, RWCAM, target_command);
+                       target_content = read_nic_dword(dev, RCAMO);
+                       len += snprintf(page + len, count - len,"%8.8x ",target_content);
+               }
+       }
+
+       len += snprintf(page + len, count - len,"\n");
+       *eof = 1;
+       return len;
+}
+static int proc_get_stats_tx(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       int len = 0;
+
+       len += snprintf(page + len, count - len,
+               "TX VI priority ok int: %lu\n"
+               "TX VO priority ok int: %lu\n"
+               "TX BE priority ok int: %lu\n"
+               "TX BK priority ok int: %lu\n"
+               "TX MANAGE priority ok int: %lu\n"
+               "TX BEACON priority ok int: %lu\n"
+               "TX BEACON priority error int: %lu\n"
+               "TX CMDPKT priority ok int: %lu\n"
+               "TX queue stopped?: %d\n"
+               "TX fifo overflow: %lu\n"
+               "TX total data packets %lu\n"
+               "TX total data bytes :%lu\n",
+               priv->stats.txviokint,
+               priv->stats.txvookint,
+               priv->stats.txbeokint,
+               priv->stats.txbkokint,
+               priv->stats.txmanageokint,
+               priv->stats.txbeaconokint,
+               priv->stats.txbeaconerr,
+               priv->stats.txcmdpktokint,
+               netif_queue_stopped(dev),
+               priv->stats.txoverflow,
+               priv->rtllib->stats.tx_packets,
+               priv->rtllib->stats.tx_bytes
+
+
+               );
+
+       *eof = 1;
+       return len;
+}
+
+
+
+static int proc_get_stats_rx(char *page, char **start,
+                         off_t offset, int count,
+                         int *eof, void *data)
+{
+       struct net_device *dev = data;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       int len = 0;
+
+       len += snprintf(page + len, count - len,
+               "RX packets: %lu\n"
+               "RX data crc err: %lu\n"
+               "RX mgmt crc err: %lu\n"
+               "RX desc err: %lu\n"
+               "RX rx overflow error: %lu\n",
+               priv->stats.rxint,
+               priv->stats.rxdatacrcerr,
+               priv->stats.rxmgmtcrcerr,
+               priv->stats.rxrdu,
+               priv->stats.rxoverflow);
+
+       *eof = 1;
+       return len;
+}
+
+void rtl8192_proc_module_init(void)
+{
+       RT_TRACE(COMP_INIT, "Initializing proc filesystem");
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+       rtl8192_proc=create_proc_entry(DRV_NAME, S_IFDIR, proc_net);
+#else
+       rtl8192_proc=create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net);
+#endif
+}
+
+
+void rtl8192_proc_module_remove(void)
+{
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+       remove_proc_entry(DRV_NAME, proc_net);
+#else
+       remove_proc_entry(DRV_NAME, init_net.proc_net);
+#endif
+}
+
+
+void rtl8192_proc_remove_one(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       printk("dev name %s\n",dev->name);
+
+       if (priv->dir_dev) {
+               remove_proc_entry("stats-tx", priv->dir_dev);
+               remove_proc_entry("stats-rx", priv->dir_dev);
+               remove_proc_entry("stats-ap", priv->dir_dev);
+               remove_proc_entry("registers-0", priv->dir_dev);
+               remove_proc_entry("registers-1", priv->dir_dev);
+               remove_proc_entry("registers-2", priv->dir_dev);
+               remove_proc_entry("registers-3", priv->dir_dev);
+               remove_proc_entry("registers-4", priv->dir_dev);
+               remove_proc_entry("registers-5", priv->dir_dev);
+               remove_proc_entry("registers-6", priv->dir_dev);
+               remove_proc_entry("registers-7", priv->dir_dev);
+               remove_proc_entry("registers-8", priv->dir_dev);
+               remove_proc_entry("registers-9", priv->dir_dev);
+               remove_proc_entry("registers-a", priv->dir_dev);
+               remove_proc_entry("registers-b", priv->dir_dev);
+               remove_proc_entry("registers-c", priv->dir_dev);
+               remove_proc_entry("registers-d", priv->dir_dev);
+               remove_proc_entry("registers-e", priv->dir_dev);
+               remove_proc_entry("RF-A", priv->dir_dev);
+               remove_proc_entry("RF-B", priv->dir_dev);
+               remove_proc_entry("RF-C", priv->dir_dev);
+               remove_proc_entry("RF-D", priv->dir_dev);
+               remove_proc_entry("SEC-CAM-1", priv->dir_dev);
+               remove_proc_entry("SEC-CAM-2", priv->dir_dev);
+               remove_proc_entry("SEC-CAM-3", priv->dir_dev);
+               remove_proc_entry("wlan0", rtl8192_proc);
+               priv->dir_dev = NULL;
+       }
+}
+
+
+void rtl8192_proc_init_one(struct net_device *dev)
+{
+       struct proc_dir_entry *e;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       priv->dir_dev = create_proc_entry(dev->name,
+                                         S_IFDIR | S_IRUGO | S_IXUGO,
+                                         rtl8192_proc);
+       if (!priv->dir_dev) {
+               RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
+                     dev->name);
+               return;
+       }
+       e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_stats_rx, dev);
+
+       if (!e) {
+               RT_TRACE(COMP_ERR,"Unable to initialize "
+                     "/proc/net/rtl8192/%s/stats-rx\n",
+                     dev->name);
+       }
+
+
+       e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_stats_tx, dev);
+
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/stats-tx\n",
+                     dev->name);
+       }
+
+       e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_stats_ap, dev);
+
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/stats-ap\n",
+                     dev->name);
+       }
+
+       e = create_proc_read_entry("registers-0", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_0, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-0\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_1, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-1\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_2, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-2\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-3", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_3, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-3\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-4", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_4, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-4\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-5", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_5, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-5\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-6", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_6, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-6\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-7", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_7, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-7\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_8, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-8\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_9, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-9\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_a, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-a\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_b, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-b\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_c, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-c\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_d, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-d\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_registers_e, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/registers-e\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("RF-A", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_reg_rf_a, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/RF-A\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("RF-B", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_reg_rf_b, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/RF-B\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("RF-C", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_reg_rf_c, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/RF-C\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("RF-D", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_reg_rf_d, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/RF-D\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("SEC-CAM-1", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_cam_register_1, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/SEC-CAM-1\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("SEC-CAM-2", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_cam_register_2, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/SEC-CAM-2\n",
+                     dev->name);
+       }
+       e = create_proc_read_entry("SEC-CAM-3", S_IFREG | S_IRUGO,
+                                  priv->dir_dev, proc_get_cam_register_3, dev);
+       if (!e) {
+               RT_TRACE(COMP_ERR, "Unable to initialize "
+                     "/proc/net/rtl8192/%s/SEC-CAM-3\n",
+                     dev->name);
+       }
+}
diff --git a/drivers/staging/rtl8192e/rtl_debug.h b/drivers/staging/rtl8192e/rtl_debug.h
new file mode 100644 (file)
index 0000000..5ae7c7d
--- /dev/null
@@ -0,0 +1,319 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef _RTL_DEBUG_H
+#define _RTL_DEBUG_H
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/version.h>
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,9))
+#include <linux/debugfs.h>
+#endif
+
+struct r8192_priv;
+struct _tx_desc_8192se;
+struct _TX_DESC_8192CE;
+struct net_device;
+
+#define        DBG_LOUD        4
+
+#define RT_ASSERT(_Exp,Fmt)                            \
+               if (!(_Exp))                                            \
+               {                                                               \
+                       printk("Rtl819x: ");                            \
+                       printk Fmt;                                     \
+               }
+
+typedef enum tag_DBGP_Flag_Type_Definition
+{
+       FQoS                            = 0,
+       FTX                                     = 1,
+       FRX                                     = 2,
+       FSEC                            = 3,
+       FMGNT                           = 4,
+       FMLME                           = 5,
+       FRESOURCE                       = 6,
+       FBEACON                 = 7,
+       FISR                            = 8,
+       FPHY                            = 9,
+       FMP                                     = 10,
+       FEEPROM                 = 11,
+       FPWR                            = 12,
+       FDM                                     = 13,
+       FDBGCtrl                                = 14,
+       FC2H                            = 15,
+       FBT                                     = 16,
+       FINIT                           = 17,
+       FIOCTL                          = 18,
+       DBGP_TYPE_MAX
+}DBGP_FLAG_E;
+
+#define                QoS_INIT                                BIT0
+#define                QoS_VISTA                               BIT1
+
+#define                TX_DESC                                 BIT0
+#define                TX_DESC_TID                             BIT1
+
+#define                RX_DATA                                 BIT0
+#define                RX_PHY_STS                              BIT1
+#define                RX_PHY_SS                               BIT2
+#define                RX_PHY_SQ                               BIT3
+#define                RX_PHY_ASTS                     BIT4
+#define                RX_ERR_LEN                              BIT5
+#define                RX_DEFRAG                               BIT6
+#define                RX_ERR_RATE                     BIT7
+
+
+
+#define                MEDIA_STS                               BIT0
+#define                LINK_STS                                BIT1
+
+#define                OS_CHK                                  BIT0
+
+#define                BCN_SHOW                                BIT0
+#define                BCN_PEER                                BIT1
+
+#define                ISR_CHK                                 BIT0
+
+#define                PHY_BBR                         BIT0
+#define                PHY_BBW                         BIT1
+#define                PHY_RFR                         BIT2
+#define                PHY_RFW                         BIT3
+#define                PHY_MACR                                BIT4
+#define                PHY_MACW                                BIT5
+#define                PHY_ALLR                                BIT6
+#define                PHY_ALLW                                BIT7
+#define                PHY_TXPWR                               BIT8
+#define                PHY_PWRDIFF                     BIT9
+
+#define                MP_RX                                   BIT0
+#define                MP_SWICH_CH                     BIT1
+
+#define                EEPROM_W                                BIT0
+#define                EFUSE_PG                                BIT1
+#define                EFUSE_READ_ALL                  BIT2
+
+#define                LPS                                             BIT0
+#define                IPS                                             BIT1
+#define                PWRSW                                   BIT2
+#define                PWRHW                                   BIT3
+#define                PWRHAL                                  BIT4
+
+#define                WA_IOT                                  BIT0
+#define                DM_PWDB                         BIT1
+#define                DM_Monitor                              BIT2
+#define                DM_DIG                                  BIT3
+#define                DM_EDCA_Turbo                   BIT4
+
+#define                DbgCtrl_Trace                   BIT0
+#define                DbgCtrl_InbandNoise             BIT1
+
+#define                BT_TRACE                                BIT0
+#define                BT_RFPoll                               BIT1
+
+#define                C2H_Summary                     BIT0
+#define                C2H_PacketData                  BIT1
+#define                C2H_ContentData                 BIT2
+#define                BT_TRACE                                BIT0
+#define                BT_RFPoll                               BIT1
+
+#define                INIT_EEPROM                             BIT0
+#define                INIT_TxPower                    BIT1
+#define                INIT_IQK                                BIT2
+#define                INIT_RF                                 BIT3
+
+#define                IOCTL_TRACE                                             BIT0
+#define                IOCTL_BT_EVENT                                  BIT1
+#define                IOCTL_BT_EVENT_DETAIL                   BIT2
+#define                IOCTL_BT_TX_ACLDATA                     BIT3
+#define                IOCTL_BT_TX_ACLDATA_DETAIL              BIT4
+#define                IOCTL_BT_RX_ACLDATA                     BIT5
+#define                IOCTL_BT_RX_ACLDATA_DETAIL      BIT6
+#define                IOCTL_BT_HCICMD                         BIT7
+#define                IOCTL_BT_HCICMD_DETAIL                  BIT8
+#define                IOCTL_IRP                                               BIT9
+#define                IOCTL_IRP_DETAIL                                BIT10
+#define                IOCTL_CALLBACK_FUN                              BIT11
+#define                        IOCTL_STATE                                             BIT12
+#define                IOCTL_BT_TP                                             BIT13
+#define                IOCTL_BT_LOGO                                   BIT14
+
+/* 2007/07/13 MH  ------For DeBuG Print modeue------*/
+/*------------------------------Define structure----------------------------*/
+
+
+/*------------------------Export Marco Definition---------------------------*/
+#define                DEBUG_PRINT             1
+
+#if (DEBUG_PRINT == 1)
+#define RTPRINT(dbgtype, dbgflag, printstr)    \
+{                                                                      \
+       if (DBGP_Type[dbgtype] & dbgflag)\
+       {                                                               \
+               printk printstr;                                \
+       }                                                               \
+}
+
+#define        RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)\
+{\
+       if (DBGP_Type[dbgtype] & dbgflag)\
+       {\
+                               int __i;                                                \
+                               u8*     ptr = (u8*)_Ptr;        \
+                               printk printstr;                                \
+                               printk(" ");                                    \
+                               for ( __i=0; __i<6; __i++ )             \
+                                       printk("%02X%s", ptr[__i], (__i==5)?"":"-");            \
+                               printk("\n");                                                   \
+       }\
+}
+
+#define RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)\
+{\
+       if (DBGP_Type[dbgtype] & dbgflag)\
+       {\
+               int __i;                                                                        \
+               u8*     ptr = (u8*)_HexData;                    \
+               printk(_TitleString);                                   \
+               for ( __i=0; __i<(int)_HexDataLen; __i++ )      \
+               {                                                                               \
+                       printk("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?"  ":" ");\
+                       if (((__i + 1) % 16) == 0)      printk("\n");\
+               }                                                                               \
+               printk("\n");                                                   \
+       }\
+}
+#else
+#define        RTPRINT(dbgtype, dbgflag, printstr)
+#define        RTPRINT_ADDR(dbgtype, dbgflag, printstr, _Ptr)
+#define                RTPRINT_DATA(dbgtype, dbgflag, _TitleString, _HexData, _HexDataLen)
+#endif
+
+extern u32     DBGP_Type[DBGP_TYPE_MAX];
+
+#define RT_PRINT_DATA(_Comp, _Level, _TitleString, _HexData, _HexDataLen)                      \
+do {\
+       if (((_Comp) & rt_global_debug_component ) && (_Level <= rt_global_debug_component ))   \
+       {                                                                       \
+               int __i;                                                                \
+               u8*     ptr = (u8*)_HexData;                            \
+               printk("Rtl819x: ");                                            \
+               printk(_TitleString);                                           \
+               for ( __i=0; __i<(int)_HexDataLen; __i++ )                              \
+               {                                                               \
+                       printk("%02X%s", ptr[__i], (((__i + 1) % 4) == 0)?"  ":" ");    \
+                       if (((__i + 1) % 16) == 0)      printk("\n");                   \
+               }                                                               \
+               printk("\n");                                                   \
+       } \
+}while(0);
+
+#define DMESG(x,a...)
+#define DMESGW(x,a...)
+#define DMESGE(x,a...)
+extern u32 rt_global_debug_component;
+#define RT_TRACE(component, x, args...) \
+do { if (rt_global_debug_component & component) \
+       printk(KERN_DEBUG DRV_NAME ":" x "\n" , \
+              ##args);\
+}while(0);
+
+#define RTL819x_DEBUG
+#ifdef RTL819x_DEBUG
+#define assert(expr) \
+        if (!(expr)) {                                  \
+                printk( "Assertion failed! %s,%s,%s,line=%d\n", \
+                #expr,__FILE__,__func__,__LINE__);          \
+        }
+#define RT_DEBUG_DATA(level, data, datalen)      \
+        do{ if ((rt_global_debug_component & (level)) == (level))   \
+                {       \
+                        int _i;                                  \
+                        u8* _pdata = (u8*) data;                 \
+                        printk(KERN_DEBUG DRV_NAME ": %s()\n", __func__);   \
+                        for (_i=0; _i<(int)(datalen); _i++)                 \
+                        {                                               \
+                                printk("%2x ", _pdata[_i]);               \
+                                if ((_i+1)%16 == 0) printk("\n");        \
+                        }                               \
+                        printk("\n");                   \
+                }                                       \
+        } while (0)
+#else
+#define assert(expr) do {} while (0)
+#define RT_DEBUG_DATA(level, data, datalen) do {} while(0)
+#endif
+
+typedef struct _rtl_fs_debug
+{
+       const char *name;
+       struct dentry *dir_drv;
+       struct dentry *debug_register;
+       u32 hw_type;
+       u32 hw_offset;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20))
+       bool hw_holding;
+#else
+       u8 hw_holding;
+#endif
+} rtl_fs_debug;
+
+void print_buffer(u32 *buffer, int len);
+void dump_eprom(struct net_device *dev);
+void rtl8192_dump_reg(struct net_device *dev);
+
+#ifdef RTL8192SE
+void rtl8192se_dump_tx_desc(struct _tx_desc_8192se *pDesc);
+#endif
+#ifdef RTL8192CE
+void rtl8192ce_dump_tx_desc(struct _TX_DESC_8192CE *pDesc);
+#endif
+
+/* debugfs stuff */
+#ifdef CONFIG_RTLWIFI_DEBUGFS
+int rtl_debug_module_init(struct r8192_priv *priv, const char *name);
+void rtl_debug_module_remove(struct r8192_priv *priv);
+int rtl_create_debugfs_root(void);
+void rtl_remove_debugfs_root(void);
+#else
+static inline int rtl_debug_module_init(struct r8192_priv *priv, const char *name) {
+       return 0;
+}
+static inline void rtl_debug_module_remove(struct r8192_priv *priv) {
+
+}
+static inline int rtl_create_debugfs_root(void) {
+       return 0;
+}
+static inline void rtl_remove_debugfs_root(void) {
+}
+#endif
+
+/* proc stuff */
+void rtl8192_proc_init_one(struct net_device *dev);
+void rtl8192_proc_remove_one(struct net_device *dev);
+void rtl8192_proc_module_init(void);
+void rtl8192_proc_module_remove(void);
+void rtl8192_dbgp_flag_init(struct net_device *dev);
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_dm.c b/drivers/staging/rtl8192e/rtl_dm.c
new file mode 100644 (file)
index 0000000..5ea11c5
--- /dev/null
@@ -0,0 +1,4854 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtl_core.h"
+#include "rtl_dm.h"
+#include "r8192E_hw.h"
+#include "r8192E_phy.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h"
+#include "r8192E_cmdpkt.h"
+
+/*---------------------------Define Local Constant---------------------------*/
+#ifdef  RTL8190P
+static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0x5e4322,
+   0x5ea44f,
+   0x5e4322,
+   0x604322,
+   0xa44f,
+   0x5e4322,
+   0x5e4322
+ };
+
+static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0x5e4322,
+   0x5e4322,
+   0x5e4322,
+   0x604322,
+   0xa44f,
+   0x5e4322,
+   0x5e4322
+};
+
+static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0xa44f,
+   0x5ea44f,
+   0x5e4322,
+   0x604322,
+   0x5e4322,
+   0x5e4322,
+   0x5e4322
+};
+
+#elif defined RTL8192E
+static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0x5e4322,
+   0x5ea44f,
+   0x5e4322,
+   0x604322,
+   0xa44f,
+   0x5e4322,
+   0x5e4332
+ };
+
+static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0x5e4322,
+   0x5e4322,
+   0x5e4322,
+   0x604322,
+   0xa44f,
+   0x5e4322,
+   0x5e4322
+};
+
+static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0xa44f,
+   0x5ea44f,
+   0x5e4322,
+   0x604322,
+   0x5e4322,
+   0x5e4322,
+   0x5e4332
+};
+
+#elif defined(RTL8192SE)
+static u32 edca_setting_DL[HT_IOT_PEER_MAX] =
+{ 0xa44f,
+   0x5ea44f,
+   0x5ea44f,
+   0xa630,
+   0xa44f,
+   0xa630,
+   0xa630,
+   0xa42b,
+   0x5e4322,
+   0x5e4322
+ };
+
+static u32 edca_setting_DL_GMode[HT_IOT_PEER_MAX] =
+
+{ 0x4322,
+   0xa44f,
+   0x5ea44f,
+   0xa42b,
+   0x5e4322,
+   0x4322,
+   0xa430,
+   0x5ea44f,
+   0x5e4322,
+   0x5e4322
+};
+
+static u32 edca_setting_UL[HT_IOT_PEER_MAX] =
+{ 0x5e4322,
+   0xa44f,
+   0x5ea44f,
+   0x5ea322,
+   0x5ea422,
+   0x5ea322,
+   0x3ea44f,
+   0x5ea44f,
+   0x5e4322,
+   0x5e4322
+ };
+#endif
+
+#define RTK_UL_EDCA 0xa44f
+#define RTK_DL_EDCA 0x5e4322
+/*---------------------------Define Local Constant---------------------------*/
+
+
+/*------------------------Define global variable-----------------------------*/
+dig_t  dm_digtable;
+u8             dm_shadow[16][256] = {{0}};
+DRxPathSel     DM_RxPathSelTable;
+/*------------------------Define global variable-----------------------------*/
+
+
+/*------------------------Define local variable------------------------------*/
+/*------------------------Define local variable------------------------------*/
+
+
+/*--------------------Define export function prototype-----------------------*/
+extern void    init_hal_dm(struct net_device *dev);
+extern void deinit_hal_dm(struct net_device *dev);
+
+extern void hal_dm_watchdog(struct net_device *dev);
+
+
+extern void    init_rate_adaptive(struct net_device *dev);
+extern void    dm_txpower_trackingcallback(void *data);
+
+extern void    dm_restore_dynamic_mechanism_state(struct net_device *dev);
+extern void    dm_backup_dynamic_mechanism_state(struct net_device *dev);
+extern void    dm_change_dynamic_initgain_thresh(struct net_device *dev,
+                                                               u32             dm_type,
+                                                               u32             dm_value);
+extern void    DM_ChangeFsyncSetting(struct net_device *dev,
+                                                                                               s32             DM_Type,
+                                                                                               s32             DM_Value);
+extern void dm_force_tx_fw_info(struct net_device *dev,
+                                                                               u32             force_type,
+                                                                               u32             force_value);
+extern void    dm_init_edca_turbo(struct net_device *dev);
+extern void    dm_rf_operation_test_callback(unsigned long data);
+extern void    dm_rf_pathcheck_workitemcallback(void *data);
+extern void dm_fsync_timer_callback(unsigned long data);
+extern void dm_check_fsync(struct net_device *dev);
+extern void    dm_shadow_init(struct net_device *dev);
+extern void dm_initialize_txpower_tracking(struct net_device *dev);
+
+#if (defined RTL8192E || defined RTL8192SE)
+extern  void    dm_CheckRfCtrlGPIO(void *data);
+#endif
+
+#ifdef RTL8192SE
+extern void DM_TXPowerTracking92SDirectCall(struct net_device *dev);
+static void dm_CtrlInitGainByTwoPort(struct net_device *dev);
+static void dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm(struct net_device *dev);
+static void    dm_initial_gain_STABeforeConnect(struct net_device *dev);
+
+void   dm_InitRateAdaptiveMask(struct net_device *dev);
+void           Adhoc_InitRateAdaptive(struct net_device *dev,struct sta_info  *pEntry);
+#endif
+
+/*--------------------Define export function prototype-----------------------*/
+
+
+/*---------------------Define local function prototype-----------------------*/
+static void    dm_check_rate_adaptive(struct net_device *dev);
+
+static void    dm_init_bandwidth_autoswitch (struct net_device *dev);
+static void    dm_bandwidth_autoswitch (       struct net_device *dev);
+
+
+static void    dm_check_txpower_tracking(struct net_device *dev);
+
+
+
+
+
+#if defined(RTL8192E)||defined(RTL8190P)
+static void    dm_bb_initialgain_restore(struct net_device *dev);
+
+
+static void    dm_bb_initialgain_backup(struct net_device *dev);
+#endif
+
+static void dm_dig_init(struct net_device *dev);
+static void dm_ctrl_initgain_byrssi(struct net_device *dev);
+static void dm_ctrl_initgain_byrssi_highpwr(struct net_device *dev);
+static void dm_ctrl_initgain_byrssi_by_driverrssi(     struct net_device *dev);
+static void dm_ctrl_initgain_byrssi_by_fwfalse_alarm(struct net_device *dev);
+static void dm_initial_gain(struct net_device *dev);
+static void dm_pd_th(struct net_device *dev);
+static void dm_cs_ratio(struct net_device *dev);
+
+static void dm_init_ctstoself(struct net_device *dev);
+static void dm_Init_WA_Broadcom_IOT(struct net_device *dev);
+#ifdef RTL8192SE
+static void dm_WA_Broadcom_IOT(struct net_device *dev);
+#endif
+
+static void    dm_check_edca_turbo(struct net_device *dev);
+
+#ifndef RTL8190P
+#endif
+static void dm_check_pbc_gpio(struct net_device *dev);
+
+
+static void dm_check_rx_path_selection(struct net_device *dev);
+static void dm_init_rxpath_selection(struct net_device *dev);
+static void dm_rxpath_sel_byrssi(struct net_device *dev);
+
+
+static void dm_init_fsync(struct net_device *dev);
+static void dm_deInit_fsync(struct net_device *dev);
+
+static void dm_check_txrateandretrycount(struct net_device *dev);
+static  void dm_check_ac_dc_power(struct net_device *dev);
+
+/*---------------------Define local function prototype-----------------------*/
+
+static void    dm_init_dynamic_txpower(struct net_device *dev);
+static void    dm_dynamic_txpower(struct net_device *dev);
+
+
+static void dm_send_rssi_tofw(struct net_device *dev);
+static void    dm_ctstoself(struct net_device *dev);
+#if defined RTL8192SE
+static void dm_RefreshRateAdaptiveMask(struct net_device *dev);
+#endif
+/*---------------------------Define function prototype------------------------*/
+
+extern void
+init_hal_dm(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       priv->DM_Type = DM_Type_ByDriver;
+
+       priv->undecorated_smoothed_pwdb = -1;
+
+       dm_init_dynamic_txpower(dev);
+
+#ifdef RTL8192SE
+       if (IS_HARDWARE_TYPE_8192SE(dev))
+               dm_InitRateAdaptiveMask(dev);
+       else
+#endif
+               init_rate_adaptive(dev);
+
+       dm_dig_init(dev);
+       dm_init_edca_turbo(dev);
+       dm_init_bandwidth_autoswitch (dev);
+       dm_init_fsync(dev);
+       dm_init_rxpath_selection(dev);
+       dm_init_ctstoself(dev);
+        if (IS_HARDWARE_TYPE_8192SE(dev))
+       dm_Init_WA_Broadcom_IOT(dev);
+
+#if (defined RTL8192E || defined RTL8192SE)
+       INIT_DELAYED_WORK_RSL(&priv->gpio_change_rf_wq, (void *)dm_CheckRfCtrlGPIO,dev);
+#endif
+
+}
+
+extern void deinit_hal_dm(struct net_device *dev)
+{
+
+       dm_deInit_fsync(dev);
+
+}
+
+
+#ifdef USB_RX_AGGREGATION_SUPPORT
+void dm_CheckRxAggregation(struct net_device *dev) {
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
+       PRT_HIGH_THROUGHPUT     pHTInfo = priv->rtllib->pHTInfo;
+       static unsigned long    lastTxOkCnt = 0;
+       static unsigned long    lastRxOkCnt = 0;
+       unsigned long           curTxOkCnt = 0;
+       unsigned long           curRxOkCnt = 0;
+
+       curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
+       curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
+
+       if ((curTxOkCnt + curRxOkCnt) < 15000000) {
+               return;
+       }
+
+       if (curTxOkCnt > 4*curRxOkCnt) {
+               if (priv->bCurrentRxAggrEnable) {
+                       write_nic_dword(dev, 0x1a8, 0);
+                       priv->bCurrentRxAggrEnable = false;
+               }
+       }else{
+               if (!priv->bCurrentRxAggrEnable && !pHTInfo->bCurrentRT2RTAggregation) {
+                       u32 ulValue;
+                       ulValue = (pHTInfo->UsbRxFwAggrEn<<24) | (pHTInfo->UsbRxFwAggrPageNum<<16) |
+                               (pHTInfo->UsbRxFwAggrPacketNum<<8) | (pHTInfo->UsbRxFwAggrTimeout);
+                       write_nic_dword(dev, 0x1a8, ulValue);
+                       priv->bCurrentRxAggrEnable = true;
+               }
+       }
+
+       lastTxOkCnt = priv->stats.txbytesunicast;
+       lastRxOkCnt = priv->stats.rxbytesunicast;
+}
+#endif
+
+
+
+extern  void    hal_dm_watchdog(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       if (priv->being_init_adapter)
+               return;
+
+       dm_check_ac_dc_power(dev);
+
+       dm_check_pbc_gpio(dev);
+       dm_check_txrateandretrycount(dev);
+       dm_check_edca_turbo(dev);
+
+       if (IS_HARDWARE_TYPE_8192SE(dev)){
+#ifdef RTL8192SE
+               dm_RefreshRateAdaptiveMask(dev);
+               dm_WA_Broadcom_IOT(dev);
+               return;
+#endif
+       }
+       dm_check_rate_adaptive(dev);
+       dm_dynamic_txpower(dev);
+       dm_check_txpower_tracking(dev);
+
+       dm_ctrl_initgain_byrssi(dev);
+       dm_bandwidth_autoswitch (dev);
+
+       dm_check_rx_path_selection(dev);
+       dm_check_fsync(dev);
+
+       dm_send_rssi_tofw(dev);
+       dm_ctstoself(dev);
+
+#ifdef USB_RX_AGGREGATION_SUPPORT
+       dm_CheckRxAggregation(dev);
+#endif
+}
+
+void dm_check_ac_dc_power(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static char *ac_dc_check_script_path = "/etc/acpi/wireless-rtl-ac-dc-power.sh";
+       char *argv[] = {ac_dc_check_script_path,DRV_NAME,NULL};
+       static char *envp[] = {"HOME=/",
+                       "TERM=linux",
+                       "PATH=/usr/bin:/bin",
+                        NULL};
+
+       if (priv->ResetProgress == RESET_TYPE_SILENT)
+       {
+               RT_TRACE((COMP_INIT | COMP_POWER | COMP_RF), "GPIOChangeRFWorkItemCallBack(): Silent Reseting!!!!!!!\n");
+               return;
+       }
+
+       if (priv->rtllib->state != RTLLIB_LINKED) {
+               return;
+       }
+       call_usermodehelper(ac_dc_check_script_path,argv,envp,1);
+
+       return;
+};
+
+
+extern void init_rate_adaptive(struct net_device * dev)
+{
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+       prate_adaptive                  pra = (prate_adaptive)&priv->rate_adaptive;
+
+       pra->ratr_state = DM_RATR_STA_MAX;
+       pra->high2low_rssi_thresh_for_ra = RateAdaptiveTH_High;
+       pra->low2high_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M+5;
+       pra->low2high_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M+5;
+
+       pra->high_rssi_thresh_for_ra = RateAdaptiveTH_High+5;
+       pra->low_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M;
+       pra->low_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M;
+
+       if (priv->CustomerID == RT_CID_819x_Netcore)
+               pra->ping_rssi_enable = 1;
+       else
+               pra->ping_rssi_enable = 0;
+       pra->ping_rssi_thresh_for_ra = 15;
+
+
+       if (priv->rf_type == RF_2T4R)
+       {
+               pra->upper_rssi_threshold_ratr          =       0x8f0f0000;
+               pra->middle_rssi_threshold_ratr         =       0x8f0ff000;
+               pra->low_rssi_threshold_ratr            =       0x8f0ff001;
+               pra->low_rssi_threshold_ratr_40M        =       0x8f0ff005;
+               pra->low_rssi_threshold_ratr_20M        =       0x8f0ff001;
+               pra->ping_rssi_ratr     =       0x0000000d;
+       }
+       else if (priv->rf_type == RF_1T2R)
+       {
+               pra->upper_rssi_threshold_ratr          =       0x000fc000;
+               pra->middle_rssi_threshold_ratr         =       0x000ff000;
+               pra->low_rssi_threshold_ratr            =       0x000ff001;
+               pra->low_rssi_threshold_ratr_40M        =       0x000ff005;
+               pra->low_rssi_threshold_ratr_20M        =       0x000ff001;
+               pra->ping_rssi_ratr     =       0x0000000d;
+       }
+
+}
+
+
+static void dm_check_rate_adaptive(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_HIGH_THROUGHPUT     pHTInfo = priv->rtllib->pHTInfo;
+       prate_adaptive                  pra = (prate_adaptive)&priv->rate_adaptive;
+       u32                                             currentRATR, targetRATR = 0;
+       u32                                             LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
+       bool                                            bshort_gi_enabled = false;
+       static u8                                       ping_rssi_state=0;
+
+       if (IS_NIC_DOWN(priv)){
+               RT_TRACE(COMP_RATE, "<---- dm_check_rate_adaptive(): driver is going to unload\n");
+               return;
+       }
+
+       if (pra->rate_adaptive_disabled)
+               return;
+
+       if ( !(priv->rtllib->mode == WIRELESS_MODE_N_24G ||
+                priv->rtllib->mode == WIRELESS_MODE_N_5G))
+                return;
+
+       if ( priv->rtllib->state == RTLLIB_LINKED )
+       {
+
+               bshort_gi_enabled = (pHTInfo->bCurTxBW40MHz && pHTInfo->bCurShortGI40MHz) ||
+                       (!pHTInfo->bCurTxBW40MHz && pHTInfo->bCurShortGI20MHz);
+
+
+               pra->upper_rssi_threshold_ratr =
+                               (pra->upper_rssi_threshold_ratr & (~BIT31)) | ((bshort_gi_enabled)? BIT31:0) ;
+
+               pra->middle_rssi_threshold_ratr =
+                               (pra->middle_rssi_threshold_ratr & (~BIT31)) | ((bshort_gi_enabled)? BIT31:0) ;
+
+               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+               {
+                       pra->low_rssi_threshold_ratr =
+                               (pra->low_rssi_threshold_ratr_40M & (~BIT31)) | ((bshort_gi_enabled)? BIT31:0) ;
+               }
+               else
+               {
+                       pra->low_rssi_threshold_ratr =
+                       (pra->low_rssi_threshold_ratr_20M & (~BIT31)) | ((bshort_gi_enabled)? BIT31:0) ;
+               }
+               pra->ping_rssi_ratr =
+                               (pra->ping_rssi_ratr & (~BIT31)) | ((bshort_gi_enabled)? BIT31:0) ;
+
+               if (pra->ratr_state == DM_RATR_STA_HIGH)
+               {
+                       HighRSSIThreshForRA     = pra->high2low_rssi_thresh_for_ra;
+                       LowRSSIThreshForRA      = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)?
+                                       (pra->low_rssi_thresh_for_ra40M):(pra->low_rssi_thresh_for_ra20M);
+               }
+               else if (pra->ratr_state == DM_RATR_STA_LOW)
+               {
+                       HighRSSIThreshForRA     = pra->high_rssi_thresh_for_ra;
+                       LowRSSIThreshForRA      = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)?
+                                       (pra->low2high_rssi_thresh_for_ra40M):(pra->low2high_rssi_thresh_for_ra20M);
+               }
+               else
+               {
+                       HighRSSIThreshForRA     = pra->high_rssi_thresh_for_ra;
+                       LowRSSIThreshForRA      = (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)?
+                                       (pra->low_rssi_thresh_for_ra40M):(pra->low_rssi_thresh_for_ra20M);
+               }
+
+               if (priv->undecorated_smoothed_pwdb >= (long)HighRSSIThreshForRA)
+               {
+                       pra->ratr_state = DM_RATR_STA_HIGH;
+                       targetRATR = pra->upper_rssi_threshold_ratr;
+               }else if (priv->undecorated_smoothed_pwdb >= (long)LowRSSIThreshForRA)
+               {
+                       pra->ratr_state = DM_RATR_STA_MIDDLE;
+                       targetRATR = pra->middle_rssi_threshold_ratr;
+               }else
+               {
+                       pra->ratr_state = DM_RATR_STA_LOW;
+                       targetRATR = pra->low_rssi_threshold_ratr;
+               }
+
+               if (pra->ping_rssi_enable)
+               {
+                       if (priv->undecorated_smoothed_pwdb < (long)(pra->ping_rssi_thresh_for_ra+5))
+                       {
+                               if ( (priv->undecorated_smoothed_pwdb < (long)pra->ping_rssi_thresh_for_ra) ||
+                                       ping_rssi_state )
+                               {
+                                       pra->ratr_state = DM_RATR_STA_LOW;
+                                       targetRATR = pra->ping_rssi_ratr;
+                                       ping_rssi_state = 1;
+                               }
+                       }
+                       else
+                       {
+                               ping_rssi_state = 0;
+                       }
+               }
+
+#if 1
+               if (priv->rtllib->GetHalfNmodeSupportByAPsHandler(dev))
+                       targetRATR &=  0xf00fffff;
+#endif
+
+               currentRATR = read_nic_dword(dev, RATR0);
+               if ( targetRATR !=  currentRATR )
+               {
+                       u32 ratr_value;
+                       ratr_value = targetRATR;
+                       RT_TRACE(COMP_RATE,"currentRATR = %x, targetRATR = %x\n", currentRATR, targetRATR);
+                       if (priv->rf_type == RF_1T2R)
+                       {
+                               ratr_value &= ~(RATE_ALL_OFDM_2SS);
+                       }
+                       write_nic_dword(dev, RATR0, ratr_value);
+                       write_nic_byte(dev, UFWP, 1);
+
+                       pra->last_ratr = targetRATR;
+               }
+
+       }
+       else
+       {
+               pra->ratr_state = DM_RATR_STA_MAX;
+       }
+
+}
+
+static void dm_init_bandwidth_autoswitch (struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz = BW_AUTO_SWITCH_LOW_HIGH;
+       priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz = BW_AUTO_SWITCH_HIGH_LOW;
+       priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
+       priv->rtllib->bandwidth_auto_switch.bautoswitch_enable = false;
+
+}
+
+
+static void dm_bandwidth_autoswitch (struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20 ||!priv->rtllib->bandwidth_auto_switch.bautoswitch_enable){
+               return;
+       }else{
+               if (priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz == false){
+                       if (priv->undecorated_smoothed_pwdb <= priv->rtllib->bandwidth_auto_switch.threshold_40Mhzto20Mhz)
+                               priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = true;
+               }else{
+                       if (priv->undecorated_smoothed_pwdb >= priv->rtllib->bandwidth_auto_switch.threshold_20Mhzto40Mhz)
+                               priv->rtllib->bandwidth_auto_switch.bforced_tx20Mhz = false;
+
+               }
+       }
+}
+
+#ifdef Rtl8192SE
+u32    OFDMSwingTable[OFDM_Table_Length] = {
+       0x7f8001fe,
+       0x788001e2,
+       0x71c001c7,
+       0x6b8001ae,
+       0x65400195,
+       0x5fc0017f,
+       0x5a400169,
+       0x55400155,
+       0x50800142,
+       0x4c000130,
+       0x47c0011f,
+       0x43c0010f,
+       0x40000100,
+       0x3c8000f2,
+       0x390000e4,
+       0x35c000d7,
+       0x32c000cb,
+       0x300000c0,
+       0x2d4000b5,
+       0x2ac000ab,
+       0x288000a2,
+       0x26000098,
+       0x24000090,
+       0x22000088,
+       0x20000080,
+       0x1e400079,
+       0x1c800072,
+       0x1b00006c,
+       0x19800066,
+       0x18000060,
+       0x16c0005b,
+       0x15800056,
+       0x14400051,
+       0x1300004c,
+       0x12000048,
+       0x11000044,
+       0x10000040,
+};
+
+u8     CCKSwingTable_Ch1_Ch13[CCK_Table_length][8] = {
+       {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
+       {0x33, 0x32, 0x2b, 0x23, 0x1a, 0x11, 0x08, 0x04},
+       {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
+       {0x2d, 0x2d, 0x27, 0x1f, 0x18, 0x0f, 0x08, 0x03},
+       {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
+       {0x28, 0x28, 0x22, 0x1c, 0x15, 0x0d, 0x07, 0x03},
+       {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
+       {0x24, 0x23, 0x1f, 0x19, 0x13, 0x0c, 0x06, 0x03},
+       {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
+       {0x20, 0x20, 0x1b, 0x16, 0x11, 0x08, 0x05, 0x02},
+       {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
+       {0x1d, 0x1c, 0x18, 0x14, 0x0f, 0x0a, 0x05, 0x02},
+       {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
+       {0x1a, 0x19, 0x16, 0x12, 0x0d, 0x09, 0x04, 0x02},
+       {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
+       {0x17, 0x16, 0x13, 0x10, 0x0c, 0x08, 0x04, 0x02},
+       {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
+       {0x14, 0x14, 0x11, 0x0e, 0x0b, 0x07, 0x03, 0x02},
+       {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
+       {0x12, 0x12, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
+       {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
+       {0x10, 0x10, 0x0e, 0x0b, 0x08, 0x05, 0x03, 0x01},
+       {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01},
+       {0x0e, 0x0e, 0x0c, 0x0a, 0x08, 0x05, 0x02, 0x01},
+       {0x0d, 0x0d, 0x0c, 0x0a, 0x07, 0x05, 0x02, 0x01},
+       {0x0d, 0x0c, 0x0b, 0x09, 0x07, 0x04, 0x02, 0x01},
+       {0x0c, 0x0c, 0x0a, 0x09, 0x06, 0x04, 0x02, 0x01},
+       {0x0b, 0x0b, 0x0a, 0x08, 0x06, 0x04, 0x02, 0x01},
+       {0x0b, 0x0a, 0x09, 0x08, 0x06, 0x04, 0x02, 0x01},
+       {0x0a, 0x0a, 0x09, 0x07, 0x05, 0x03, 0x02, 0x01},
+       {0x0a, 0x09, 0x08, 0x07, 0x05, 0x03, 0x02, 0x01},
+       {0x09, 0x09, 0x08, 0x06, 0x05, 0x03, 0x01, 0x01},
+       {0x09, 0x08, 0x07, 0x06, 0x04, 0x03, 0x01, 0x01}
+};
+
+
+u8     CCKSwingTable_Ch14[CCK_Table_length][8] = {
+       {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
+       {0x33, 0x32, 0x2b, 0x19, 0x00, 0x00, 0x00, 0x00},
+       {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
+       {0x2d, 0x2d, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00},
+       {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
+       {0x28, 0x28, 0x24, 0x14, 0x00, 0x00, 0x00, 0x00},
+       {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
+       {0x24, 0x23, 0x1f, 0x12, 0x00, 0x00, 0x00, 0x00},
+       {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
+       {0x20, 0x20, 0x1b, 0x10, 0x00, 0x00, 0x00, 0x00},
+       {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
+       {0x1d, 0x1c, 0x18, 0x0e, 0x00, 0x00, 0x00, 0x00},
+       {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
+       {0x1a, 0x19, 0x16, 0x0d, 0x00, 0x00, 0x00, 0x00},
+       {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
+       {0x17, 0x16, 0x13, 0x0b, 0x00, 0x00, 0x00, 0x00},
+       {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
+       {0x14, 0x14, 0x11, 0x0a, 0x00, 0x00, 0x00, 0x00},
+       {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
+       {0x12, 0x12, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
+       {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
+       {0x10, 0x10, 0x0e, 0x08, 0x00, 0x00, 0x00, 0x00},
+       {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00},
+       {0x0e, 0x0e, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
+       {0x0d, 0x0d, 0x0c, 0x07, 0x00, 0x00, 0x00, 0x00},
+       {0x0d, 0x0c, 0x0b, 0x06, 0x00, 0x00, 0x00, 0x00},
+       {0x0c, 0x0c, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
+       {0x0b, 0x0b, 0x0a, 0x06, 0x00, 0x00, 0x00, 0x00},
+       {0x0b, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
+       {0x0a, 0x0a, 0x09, 0x05, 0x00, 0x00, 0x00, 0x00},
+       {0x0a, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
+       {0x09, 0x09, 0x08, 0x05, 0x00, 0x00, 0x00, 0x00},
+       {0x09, 0x08, 0x07, 0x04, 0x00, 0x00, 0x00, 0x00}
+};
+#elif defined RTL8192E
+static u32 OFDMSwingTable[OFDM_Table_Length] = {
+       0x7f8001fe,
+       0x71c001c7,
+       0x65400195,
+       0x5a400169,
+       0x50800142,
+       0x47c0011f,
+       0x40000100,
+       0x390000e4,
+       0x32c000cb,
+       0x2d4000b5,
+       0x288000a2,
+       0x24000090,
+       0x20000080,
+       0x1c800072,
+       0x19800066,
+       0x26c0005b,
+       0x24400051,
+       0x12000048,
+       0x10000040
+};
+static u8      CCKSwingTable_Ch1_Ch13[CCK_Table_length][8] = {
+       {0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04},
+       {0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03},
+       {0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03},
+       {0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03},
+       {0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02},
+       {0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02},
+       {0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02},
+       {0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02},
+       {0x16, 0x15, 0x12, 0x0f, 0x0b, 0x07, 0x04, 0x01},
+       {0x13, 0x13, 0x10, 0x0d, 0x0a, 0x06, 0x03, 0x01},
+       {0x11, 0x11, 0x0f, 0x0c, 0x09, 0x06, 0x03, 0x01},
+       {0x0f, 0x0f, 0x0d, 0x0b, 0x08, 0x05, 0x03, 0x01}
+};
+
+static u8      CCKSwingTable_Ch14[CCK_Table_length][8] = {
+       {0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00},
+       {0x30, 0x2f, 0x29, 0x18, 0x00, 0x00, 0x00, 0x00},
+       {0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00},
+       {0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00},
+       {0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00},
+       {0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00},
+       {0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00},
+       {0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00},
+       {0x16, 0x15, 0x12, 0x0b, 0x00, 0x00, 0x00, 0x00},
+       {0x13, 0x13, 0x10, 0x0a, 0x00, 0x00, 0x00, 0x00},
+       {0x11, 0x11, 0x0f, 0x09, 0x00, 0x00, 0x00, 0x00},
+       {0x0f, 0x0f, 0x0d, 0x08, 0x00, 0x00, 0x00, 0x00}
+};
+#endif
+#define                Pw_Track_Flag                           0x11d
+#define                Tssi_Mea_Value                          0x13c
+#define                Tssi_Report_Value1                      0x134
+#define                Tssi_Report_Value2                      0x13e
+#define                FW_Busy_Flag                            0x13f
+
+#ifndef RTL8192SE
+static void dm_TXPowerTrackingCallback_TSSI(struct net_device * dev)
+       {
+       struct r8192_priv *priv = rtllib_priv(dev);
+       bool                                            bHighpowerstate, viviflag = false;
+       DCMD_TXCMD_T                    tx_cmd;
+       u8                                      powerlevelOFDM24G;
+       int                                     i =0, j = 0, k = 0;
+       u8                                              RF_Type, tmp_report[5]={0, 0, 0, 0, 0};
+       u32                                             Value;
+       u8                                              Pwr_Flag;
+       u16                                     Avg_TSSI_Meas, TSSI_13dBm, Avg_TSSI_Meas_from_driver=0;
+#ifdef RTL8192U
+       RT_STATUS                               rtStatus = RT_STATUS_SUCCESS;
+#endif
+       u32                                             delta=0;
+       RT_TRACE(COMP_POWER_TRACKING,"%s()\n",__func__);
+       write_nic_byte(dev, Pw_Track_Flag, 0);
+       write_nic_byte(dev, FW_Busy_Flag, 0);
+       priv->rtllib->bdynamic_txpower_enable = false;
+       bHighpowerstate = priv->bDynamicTxHighPower;
+
+       powerlevelOFDM24G = (u8)(priv->Pwr_Track>>24);
+       RF_Type = priv->rf_type;
+       Value = (RF_Type<<8) | powerlevelOFDM24G;
+
+       RT_TRACE(COMP_POWER_TRACKING, "powerlevelOFDM24G = %x\n", powerlevelOFDM24G);
+
+
+#ifdef RTL8190P
+       for (j = 0; j<1; j++)
+#else
+       for (j = 0; j<=30; j++)
+#endif
+{
+
+       tx_cmd.Op               = TXCMD_SET_TX_PWR_TRACKING;
+       tx_cmd.Length   = 4;
+       tx_cmd.Value            = Value;
+#ifdef RTL8192U
+       rtStatus = SendTxCommandPacket(dev, &tx_cmd, 12);
+       if (rtStatus == RT_STATUS_FAILURE)
+       {
+               RT_TRACE(COMP_POWER_TRACKING, "Set configuration with tx cmd queue fail!\n");
+       }
+#else
+       cmpk_message_handle_tx(dev, (u8*)&tx_cmd, DESC_PACKET_TYPE_INIT, sizeof(DCMD_TXCMD_T));
+#endif
+       mdelay(1);
+       for (i = 0;i <= 30; i++)
+       {
+               Pwr_Flag = read_nic_byte(dev, Pw_Track_Flag);
+
+               if (Pwr_Flag == 0)
+               {
+                       mdelay(1);
+
+                       if (priv->bResetInProgress)
+                       {
+                               RT_TRACE(COMP_POWER_TRACKING, "we are in slient reset progress, so return\n");
+                               write_nic_byte(dev, Pw_Track_Flag, 0);
+                               write_nic_byte(dev, FW_Busy_Flag, 0);
+                               return;
+                       }
+#ifdef RTL8192E
+                       if ((priv->rtllib->eRFPowerState != eRfOn))
+                       {
+                               RT_TRACE(COMP_POWER_TRACKING, "we are in power save, so return\n");
+                               write_nic_byte(dev, Pw_Track_Flag, 0);
+                               write_nic_byte(dev, FW_Busy_Flag, 0);
+                               return;
+                       }
+
+#endif
+                       continue;
+               }
+
+               Avg_TSSI_Meas = read_nic_word(dev, Tssi_Mea_Value);
+
+               if (Avg_TSSI_Meas == 0)
+               {
+                       write_nic_byte(dev, Pw_Track_Flag, 0);
+                       write_nic_byte(dev, FW_Busy_Flag, 0);
+                       return;
+               }
+
+               for (k = 0;k < 5; k++)
+               {
+                       if (k !=4)
+                               tmp_report[k] = read_nic_byte(dev, Tssi_Report_Value1+k);
+                       else
+                               tmp_report[k] = read_nic_byte(dev, Tssi_Report_Value2);
+
+                       RT_TRACE(COMP_POWER_TRACKING, "TSSI_report_value = %d\n", tmp_report[k]);
+
+                       {
+                              if (tmp_report[k] <= 20)
+                              {
+                                     viviflag =true;
+                                     break;
+                              }
+                       }
+               }
+
+               if (viviflag ==true)
+               {
+                       write_nic_byte(dev, Pw_Track_Flag, 0);
+                       viviflag = false;
+                       RT_TRACE(COMP_POWER_TRACKING, "we filted this data\n");
+                       for (k = 0;k < 5; k++)
+                               tmp_report[k] = 0;
+                       break;
+               }
+
+               for (k = 0;k < 5; k++)
+               {
+                       Avg_TSSI_Meas_from_driver += tmp_report[k];
+               }
+
+               Avg_TSSI_Meas_from_driver = Avg_TSSI_Meas_from_driver*100/5;
+               RT_TRACE(COMP_POWER_TRACKING, "Avg_TSSI_Meas_from_driver = %d\n", Avg_TSSI_Meas_from_driver);
+               TSSI_13dBm = priv->TSSI_13dBm;
+               RT_TRACE(COMP_POWER_TRACKING, "TSSI_13dBm = %d\n", TSSI_13dBm);
+
+               if (Avg_TSSI_Meas_from_driver > TSSI_13dBm)
+                       delta = Avg_TSSI_Meas_from_driver - TSSI_13dBm;
+               else
+                       delta = TSSI_13dBm - Avg_TSSI_Meas_from_driver;
+
+               if (delta <= E_FOR_TX_POWER_TRACK)
+               {
+                       priv->rtllib->bdynamic_txpower_enable = true;
+                       write_nic_byte(dev, Pw_Track_Flag, 0);
+                       write_nic_byte(dev, FW_Busy_Flag, 0);
+                       RT_TRACE(COMP_POWER_TRACKING, "tx power track is done\n");
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex = %d\n", priv->rfa_txpowertrackingindex);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real = %d\n", priv->rfa_txpowertrackingindex_real);
+#ifdef RTL8190P
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfc_txpowertrackingindex = %d\n", priv->rfc_txpowertrackingindex);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->rfc_txpowertrackingindex_real = %d\n", priv->rfc_txpowertrackingindex_real);
+#endif
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_difference = %d\n", priv->CCKPresentAttentuation_difference);
+                       RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation = %d\n", priv->CCKPresentAttentuation);
+                       return;
+               }
+               else
+               {
+                       if (Avg_TSSI_Meas_from_driver < TSSI_13dBm - E_FOR_TX_POWER_TRACK)
+                       {
+                               if (RF_Type == RF_2T4R)
+                               {
+
+                                               if ((priv->rfa_txpowertrackingindex > 0) &&(priv->rfc_txpowertrackingindex > 0))
+                               {
+                                       priv->rfa_txpowertrackingindex--;
+                                       if (priv->rfa_txpowertrackingindex_real > 4)
+                                       {
+                                               priv->rfa_txpowertrackingindex_real--;
+                                               rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex_real].txbbgain_value);
+                                       }
+
+                                       priv->rfc_txpowertrackingindex--;
+                                       if (priv->rfc_txpowertrackingindex_real > 4)
+                                       {
+                                               priv->rfc_txpowertrackingindex_real--;
+                                               rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfc_txpowertrackingindex_real].txbbgain_value);
+                                       }
+                                               }
+                                               else
+                                               {
+                                                               rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[4].txbbgain_value);
+                                                               rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[4].txbbgain_value);
+                               }
+                       }
+                       else
+                       {
+                                               {
+#ifdef RTL8190P
+                                                               {
+                                               if (priv->rfc_txpowertrackingindex > 0)
+                                               {
+                                                       priv->rfc_txpowertrackingindex--;
+                                                       if (priv->rfc_txpowertrackingindex_real > 4)
+                                                       {
+                                                               priv->rfc_txpowertrackingindex_real--;
+                                                               rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfc_txpowertrackingindex_real].txbbgain_value);
+                                                       }
+                                               }
+                                               else
+                                                       rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[4].txbbgain_value);
+                               }
+#endif
+#ifdef RTL8192E
+                                                               {
+                                                                       if (priv->rfa_txpowertrackingindex > 0)
+                                                                       {
+                                                                               priv->rfa_txpowertrackingindex--;
+                                                                               if (priv->rfa_txpowertrackingindex_real > 4)
+                                                                               {
+                                                                                       priv->rfa_txpowertrackingindex_real--;
+                                                                                       rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex_real].txbbgain_value);
+                                                                               }
+                                                                       }
+                                                                       else
+                                                                                       rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[4].txbbgain_value);
+                                                               }
+#endif
+                                               }
+
+                               }
+                       }
+                       else
+                       {
+                               if (RF_Type == RF_2T4R)
+                               {
+                                       if ((priv->rfa_txpowertrackingindex < TxBBGainTableLength - 1) &&(priv->rfc_txpowertrackingindex < TxBBGainTableLength - 1))
+                               {
+                                       priv->rfa_txpowertrackingindex++;
+                                       priv->rfa_txpowertrackingindex_real++;
+                                       rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex_real].txbbgain_value);
+                                       priv->rfc_txpowertrackingindex++;
+                                       priv->rfc_txpowertrackingindex_real++;
+                                       rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfc_txpowertrackingindex_real].txbbgain_value);
+                               }
+                                       else
+                                       {
+                                               rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[TxBBGainTableLength - 1].txbbgain_value);
+                                               rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[TxBBGainTableLength - 1].txbbgain_value);
+                       }
+                               }
+                               else
+                               {
+                                       {
+#ifdef RTL8190P
+                                                       {
+                                       if (priv->rfc_txpowertrackingindex < (TxBBGainTableLength - 1))
+                                       {
+                                                       priv->rfc_txpowertrackingindex++;
+                                                       priv->rfc_txpowertrackingindex_real++;
+                                                       rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfc_txpowertrackingindex_real].txbbgain_value);
+                                       }
+                                       else
+                                                       rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[TxBBGainTableLength - 1].txbbgain_value);
+                               }
+#endif
+#ifdef RTL8192E
+                                                       {
+                                                               if (priv->rfa_txpowertrackingindex < (TxBBGainTableLength - 1))
+                                                               {
+                                                                       priv->rfa_txpowertrackingindex++;
+                                                                       priv->rfa_txpowertrackingindex_real++;
+                                                                       rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex_real].txbbgain_value);
+                       }
+                                                               else
+                                                                       rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[TxBBGainTableLength - 1].txbbgain_value);
+                                                       }
+#endif
+                                       }
+                               }
+                       }
+                       if (RF_Type == RF_2T4R){
+                       priv->CCKPresentAttentuation_difference
+                               = priv->rfa_txpowertrackingindex - priv->rfa_txpowertracking_default;
+                       }else{
+                               {
+#ifdef RTL8190P
+                               priv->CCKPresentAttentuation_difference
+                                       = priv->rfc_txpowertrackingindex - priv->rfc_txpowertracking_default;
+#endif
+#ifdef RTL8192E
+                                               priv->CCKPresentAttentuation_difference
+                                                       = priv->rfa_txpowertrackingindex_real - priv->rfa_txpowertracking_default;
+#endif
+                               }
+                       }
+
+                       if (priv->CurrentChannelBW == HT_CHANNEL_WIDTH_20)
+                               priv->CCKPresentAttentuation
+                               = priv->CCKPresentAttentuation_20Mdefault + priv->CCKPresentAttentuation_difference;
+                       else
+                               priv->CCKPresentAttentuation
+                               = priv->CCKPresentAttentuation_40Mdefault + priv->CCKPresentAttentuation_difference;
+
+                       if (priv->CCKPresentAttentuation > (CCKTxBBGainTableLength-1))
+                                       priv->CCKPresentAttentuation = CCKTxBBGainTableLength-1;
+                       if (priv->CCKPresentAttentuation < 0)
+                                       priv->CCKPresentAttentuation = 0;
+
+                       if (priv->CCKPresentAttentuation > -1&&priv->CCKPresentAttentuation < CCKTxBBGainTableLength)
+                       {
+                               if (priv->rtllib->current_network.channel == 14 && !priv->bcck_in_ch14)
+                               {
+                                       priv->bcck_in_ch14 = true;
+                                       dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                               }
+                               else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
+                               {
+                                       priv->bcck_in_ch14 = false;
+                                       dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                               }
+                               else
+                                       dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+                       }
+               RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex = %d\n", priv->rfa_txpowertrackingindex);
+               RT_TRACE(COMP_POWER_TRACKING, "priv->rfa_txpowertrackingindex_real = %d\n", priv->rfa_txpowertrackingindex_real);
+#ifdef RTL8190P
+               RT_TRACE(COMP_POWER_TRACKING, "priv->rfc_txpowertrackingindex = %d\n", priv->rfc_txpowertrackingindex);
+               RT_TRACE(COMP_POWER_TRACKING, "priv->rfc_txpowertrackingindex_real = %d\n", priv->rfc_txpowertrackingindex_real);
+#endif
+               RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation_difference = %d\n", priv->CCKPresentAttentuation_difference);
+               RT_TRACE(COMP_POWER_TRACKING, "priv->CCKPresentAttentuation = %d\n", priv->CCKPresentAttentuation);
+
+               if (priv->CCKPresentAttentuation_difference <= -12||priv->CCKPresentAttentuation_difference >= 24)
+               {
+                       priv->rtllib->bdynamic_txpower_enable = true;
+                       write_nic_byte(dev, Pw_Track_Flag, 0);
+                       write_nic_byte(dev, FW_Busy_Flag, 0);
+                       RT_TRACE(COMP_POWER_TRACKING, "tx power track--->limited\n");
+                       return;
+               }
+
+
+       }
+               write_nic_byte(dev, Pw_Track_Flag, 0);
+               Avg_TSSI_Meas_from_driver = 0;
+               for (k = 0;k < 5; k++)
+                       tmp_report[k] = 0;
+               break;
+       }
+       write_nic_byte(dev, FW_Busy_Flag, 0);
+}
+               priv->rtllib->bdynamic_txpower_enable = true;
+               write_nic_byte(dev, Pw_Track_Flag, 0);
+}
+#endif
+
+#ifdef RTL8192E
+static void dm_TXPowerTrackingCallback_ThermalMeter(struct net_device * dev)
+{
+#define ThermalMeterVal        9
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 tmpRegA, TempCCk;
+       u8 tmpOFDMindex, tmpCCKindex, tmpCCK20Mindex, tmpCCK40Mindex, tmpval;
+       int i =0, CCKSwingNeedUpdate=0;
+
+       if (!priv->btxpower_trackingInit)
+       {
+               tmpRegA= rtl8192_QueryBBReg(dev, rOFDM0_XATxIQImbalance, bMaskDWord);
+               for (i=0; i<OFDM_Table_Length; i++)
+               {
+                       if (tmpRegA == OFDMSwingTable[i])
+                       {
+                               priv->OFDM_index[0]= (u8)i;
+                               RT_TRACE(COMP_POWER_TRACKING, "Initial reg0x%x = 0x%x, OFDM_index=0x%x\n",
+                                       rOFDM0_XATxIQImbalance, tmpRegA, priv->OFDM_index[0]);
+                       }
+               }
+
+               TempCCk = rtl8192_QueryBBReg(dev, rCCK0_TxFilter1, bMaskByte2);
+               for (i=0 ; i<CCK_Table_length ; i++)
+               {
+                       if (TempCCk == (u32)CCKSwingTable_Ch1_Ch13[i][0])
+                       {
+                               priv->CCK_index =(u8) i;
+                               RT_TRACE(COMP_POWER_TRACKING, "Initial reg0x%x = 0x%x, CCK_index=0x%x\n",
+                                       rCCK0_TxFilter1, TempCCk, priv->CCK_index);
+               break;
+       }
+}
+               priv->btxpower_trackingInit = true;
+               return;
+       }
+
+       tmpRegA = rtl8192_phy_QueryRFReg(dev, RF90_PATH_A, 0x12, 0x078);
+       RT_TRACE(COMP_POWER_TRACKING, "Readback ThermalMeterA = %d \n", tmpRegA);
+       if (tmpRegA < 3 || tmpRegA > 13)
+               return;
+       if (tmpRegA >= 12)
+               tmpRegA = 12;
+       RT_TRACE(COMP_POWER_TRACKING, "Valid ThermalMeterA = %d \n", tmpRegA);
+       priv->ThermalMeter[0] = ThermalMeterVal;
+       priv->ThermalMeter[1] = ThermalMeterVal;
+
+       if (priv->ThermalMeter[0] >= (u8)tmpRegA)
+       {
+               tmpOFDMindex = tmpCCK20Mindex = 6+(priv->ThermalMeter[0]-(u8)tmpRegA);
+               tmpCCK40Mindex = tmpCCK20Mindex - 6;
+               if (tmpOFDMindex >= OFDM_Table_Length)
+                       tmpOFDMindex = OFDM_Table_Length-1;
+               if (tmpCCK20Mindex >= CCK_Table_length)
+                       tmpCCK20Mindex = CCK_Table_length-1;
+               if (tmpCCK40Mindex >= CCK_Table_length)
+                       tmpCCK40Mindex = CCK_Table_length-1;
+       }
+       else
+       {
+               tmpval = ((u8)tmpRegA - priv->ThermalMeter[0]);
+               if (tmpval >= 6)
+                       tmpOFDMindex = tmpCCK20Mindex = 0;
+               else
+                       tmpOFDMindex = tmpCCK20Mindex = 6 - tmpval;
+               tmpCCK40Mindex = 0;
+       }
+       if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+               tmpCCKindex = tmpCCK40Mindex;
+       else
+               tmpCCKindex = tmpCCK20Mindex;
+
+       priv->Record_CCK_20Mindex = tmpCCK20Mindex;
+       priv->Record_CCK_40Mindex = tmpCCK40Mindex;
+       RT_TRACE(COMP_POWER_TRACKING, "Record_CCK_20Mindex / Record_CCK_40Mindex = %d / %d.\n",
+               priv->Record_CCK_20Mindex, priv->Record_CCK_40Mindex);
+
+       if (priv->rtllib->current_network.channel == 14 && !priv->bcck_in_ch14)
+       {
+               priv->bcck_in_ch14 = true;
+               CCKSwingNeedUpdate = 1;
+       }
+       else if (priv->rtllib->current_network.channel != 14 && priv->bcck_in_ch14)
+       {
+               priv->bcck_in_ch14 = false;
+               CCKSwingNeedUpdate = 1;
+       }
+
+       if (priv->CCK_index != tmpCCKindex)
+{
+               priv->CCK_index = tmpCCKindex;
+               CCKSwingNeedUpdate = 1;
+       }
+
+       if (CCKSwingNeedUpdate)
+       {
+               dm_cck_txpower_adjust(dev, priv->bcck_in_ch14);
+       }
+       if (priv->OFDM_index[0] != tmpOFDMindex)
+       {
+               priv->OFDM_index[0] = tmpOFDMindex;
+               rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, OFDMSwingTable[priv->OFDM_index[0]]);
+               RT_TRACE(COMP_POWER_TRACKING, "Update OFDMSwing[%d] = 0x%x\n",
+                       priv->OFDM_index[0], OFDMSwingTable[priv->OFDM_index[0]]);
+       }
+       priv->txpower_count = 0;
+}
+#elif defined (RTL8192SE)
+static void dm_TXPowerTrackingCallback_ThermalMeter(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+        u8     ThermalValue=0;
+       u32     FwCmdVal=0;
+
+       priv->btxpower_trackingInit = true;
+
+
+       ThermalValue = (u8)rtl8192_phy_QueryRFReg(dev, RF90_PATH_A, RF_T_METER, 0x1f);
+       RT_TRACE(COMP_POWER_TRACKING, "Readback Thermal Meter = 0x%x\n", ThermalValue);
+       printk("%s()Readback Thermal Meter = 0x%x\n", __func__,ThermalValue);
+       if (ThermalValue)
+       {
+               priv->ThermalValue = ThermalValue;
+               if (priv->pFirmware->FirmwareVersion >= 0x35)
+               {
+                       priv->rtllib->SetFwCmdHandler(dev, FW_CMD_TXPWR_TRACK_THERMAL);
+               }
+               else
+               {
+               FwCmdVal = (FW_TXPWR_TRACK_THERMAL|
+               (priv->ThermalMeter[0]<<8)|(ThermalValue<<16));
+               RT_TRACE(COMP_POWER_TRACKING, "Write to FW Thermal Val = 0x%x\n", FwCmdVal);
+               write_nic_dword(dev, WFM5, FwCmdVal);
+                               ChkFwCmdIoDone(dev);
+               }
+       }
+
+       priv->txpower_count = 0;
+}
+#endif
+
+void   dm_txpower_trackingcallback(void *data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       struct r8192_priv *priv = container_of_dwork_rsl(data,struct r8192_priv,txpower_tracking_wq);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+
+#ifdef RTL8190P
+       dm_TXPowerTrackingCallback_TSSI(dev);
+#elif defined(RTL8192E)
+       if (priv->IC_Cut >= IC_VersionCut_D)
+               dm_TXPowerTrackingCallback_TSSI(dev);
+       else
+               dm_TXPowerTrackingCallback_ThermalMeter(dev);
+#elif defined(RTL8192SE)
+       dm_TXPowerTrackingCallback_ThermalMeter(dev);
+#endif
+}
+
+#ifndef RTL8192SE
+static void dm_InitializeTXPowerTracking_TSSI(struct net_device *dev)
+{
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->txbbgain_table[0].txbb_iq_amplifygain =                   12;
+       priv->txbbgain_table[0].txbbgain_value=0x7f8001fe;
+       priv->txbbgain_table[1].txbb_iq_amplifygain =                   11;
+       priv->txbbgain_table[1].txbbgain_value=0x788001e2;
+       priv->txbbgain_table[2].txbb_iq_amplifygain =                   10;
+       priv->txbbgain_table[2].txbbgain_value=0x71c001c7;
+       priv->txbbgain_table[3].txbb_iq_amplifygain =                   9;
+       priv->txbbgain_table[3].txbbgain_value=0x6b8001ae;
+       priv->txbbgain_table[4].txbb_iq_amplifygain =                  8;
+       priv->txbbgain_table[4].txbbgain_value=0x65400195;
+       priv->txbbgain_table[5].txbb_iq_amplifygain =                  7;
+       priv->txbbgain_table[5].txbbgain_value=0x5fc0017f;
+       priv->txbbgain_table[6].txbb_iq_amplifygain =                  6;
+       priv->txbbgain_table[6].txbbgain_value=0x5a400169;
+       priv->txbbgain_table[7].txbb_iq_amplifygain =                  5;
+       priv->txbbgain_table[7].txbbgain_value=0x55400155;
+       priv->txbbgain_table[8].txbb_iq_amplifygain =                  4;
+       priv->txbbgain_table[8].txbbgain_value=0x50800142;
+       priv->txbbgain_table[9].txbb_iq_amplifygain =                  3;
+       priv->txbbgain_table[9].txbbgain_value=0x4c000130;
+       priv->txbbgain_table[10].txbb_iq_amplifygain =                 2;
+       priv->txbbgain_table[10].txbbgain_value=0x47c0011f;
+       priv->txbbgain_table[11].txbb_iq_amplifygain =                 1;
+       priv->txbbgain_table[11].txbbgain_value=0x43c0010f;
+       priv->txbbgain_table[12].txbb_iq_amplifygain =                 0;
+       priv->txbbgain_table[12].txbbgain_value=0x40000100;
+       priv->txbbgain_table[13].txbb_iq_amplifygain =                 -1;
+       priv->txbbgain_table[13].txbbgain_value=0x3c8000f2;
+       priv->txbbgain_table[14].txbb_iq_amplifygain =               -2;
+       priv->txbbgain_table[14].txbbgain_value=0x390000e4;
+       priv->txbbgain_table[15].txbb_iq_amplifygain =               -3;
+       priv->txbbgain_table[15].txbbgain_value=0x35c000d7;
+       priv->txbbgain_table[16].txbb_iq_amplifygain =               -4;
+       priv->txbbgain_table[16].txbbgain_value=0x32c000cb;
+       priv->txbbgain_table[17].txbb_iq_amplifygain =               -5;
+       priv->txbbgain_table[17].txbbgain_value=0x300000c0;
+       priv->txbbgain_table[18].txbb_iq_amplifygain =                      -6;
+       priv->txbbgain_table[18].txbbgain_value=0x2d4000b5;
+       priv->txbbgain_table[19].txbb_iq_amplifygain =               -7;
+       priv->txbbgain_table[19].txbbgain_value=0x2ac000ab;
+       priv->txbbgain_table[20].txbb_iq_amplifygain =               -8;
+       priv->txbbgain_table[20].txbbgain_value=0x288000a2;
+       priv->txbbgain_table[21].txbb_iq_amplifygain =               -9;
+       priv->txbbgain_table[21].txbbgain_value=0x26000098;
+       priv->txbbgain_table[22].txbb_iq_amplifygain =               -10;
+       priv->txbbgain_table[22].txbbgain_value=0x24000090;
+       priv->txbbgain_table[23].txbb_iq_amplifygain =               -11;
+       priv->txbbgain_table[23].txbbgain_value=0x22000088;
+       priv->txbbgain_table[24].txbb_iq_amplifygain =               -12;
+       priv->txbbgain_table[24].txbbgain_value=0x20000080;
+       priv->txbbgain_table[25].txbb_iq_amplifygain =               -13;
+       priv->txbbgain_table[25].txbbgain_value=0x1a00006c;
+       priv->txbbgain_table[26].txbb_iq_amplifygain =               -14;
+       priv->txbbgain_table[26].txbbgain_value=0x1c800072;
+       priv->txbbgain_table[27].txbb_iq_amplifygain =               -15;
+       priv->txbbgain_table[27].txbbgain_value=0x18000060;
+       priv->txbbgain_table[28].txbb_iq_amplifygain =               -16;
+       priv->txbbgain_table[28].txbbgain_value=0x19800066;
+       priv->txbbgain_table[29].txbb_iq_amplifygain =               -17;
+       priv->txbbgain_table[29].txbbgain_value=0x15800056;
+       priv->txbbgain_table[30].txbb_iq_amplifygain =               -18;
+       priv->txbbgain_table[30].txbbgain_value=0x26c0005b;
+       priv->txbbgain_table[31].txbb_iq_amplifygain =               -19;
+       priv->txbbgain_table[31].txbbgain_value=0x14400051;
+       priv->txbbgain_table[32].txbb_iq_amplifygain =               -20;
+       priv->txbbgain_table[32].txbbgain_value=0x24400051;
+       priv->txbbgain_table[33].txbb_iq_amplifygain =               -21;
+       priv->txbbgain_table[33].txbbgain_value=0x1300004c;
+       priv->txbbgain_table[34].txbb_iq_amplifygain =               -22;
+       priv->txbbgain_table[34].txbbgain_value=0x12000048;
+       priv->txbbgain_table[35].txbb_iq_amplifygain =               -23;
+       priv->txbbgain_table[35].txbbgain_value=0x11000044;
+       priv->txbbgain_table[36].txbb_iq_amplifygain =               -24;
+       priv->txbbgain_table[36].txbbgain_value=0x10000040;
+
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[0] = 0x36;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[1] = 0x35;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[2] = 0x2e;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[3] = 0x25;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[4] = 0x1c;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[5] = 0x12;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[6] = 0x09;
+       priv->cck_txbbgain_table[0].ccktxbb_valuearray[7] = 0x04;
+
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[0] = 0x33;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[1] = 0x32;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[2] = 0x2b;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[3] = 0x23;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[4] = 0x1a;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[5] = 0x11;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[6] = 0x08;
+       priv->cck_txbbgain_table[1].ccktxbb_valuearray[7] = 0x04;
+
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[0] = 0x30;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[1] = 0x2f;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[2] = 0x29;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[3] = 0x21;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[4] = 0x19;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[5] = 0x10;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[6] = 0x08;
+       priv->cck_txbbgain_table[2].ccktxbb_valuearray[7] = 0x03;
+
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[0] = 0x2d;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[1] = 0x2d;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[2] = 0x27;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[3] = 0x1f;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[4] = 0x18;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[5] = 0x0f;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[6] = 0x08;
+       priv->cck_txbbgain_table[3].ccktxbb_valuearray[7] = 0x03;
+
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[0] = 0x2b;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[1] = 0x2a;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[2] = 0x25;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[3] = 0x1e;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[4] = 0x16;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[5] = 0x0e;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[6] = 0x07;
+       priv->cck_txbbgain_table[4].ccktxbb_valuearray[7] = 0x03;
+
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[0] = 0x28;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[1] = 0x28;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[2] = 0x22;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[3] = 0x1c;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[4] = 0x15;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[5] = 0x0d;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[6] = 0x07;
+       priv->cck_txbbgain_table[5].ccktxbb_valuearray[7] = 0x03;
+
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[0] = 0x26;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[1] = 0x25;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[2] = 0x21;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[3] = 0x1b;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[4] = 0x14;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[5] = 0x0d;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[6] = 0x06;
+       priv->cck_txbbgain_table[6].ccktxbb_valuearray[7] = 0x03;
+
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[0] = 0x24;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[1] = 0x23;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[2] = 0x1f;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[3] = 0x19;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[4] = 0x13;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[5] = 0x0c;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[6] = 0x06;
+       priv->cck_txbbgain_table[7].ccktxbb_valuearray[7] = 0x03;
+
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[0] = 0x22;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[1] = 0x21;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[2] = 0x1d;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[3] = 0x18;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[4] = 0x11;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[5] = 0x0b;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[6] = 0x06;
+       priv->cck_txbbgain_table[8].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[0] = 0x20;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[1] = 0x20;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[2] = 0x1b;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[3] = 0x16;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[4] = 0x11;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[5] = 0x08;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[6] = 0x05;
+       priv->cck_txbbgain_table[9].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[0] = 0x1f;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[1] = 0x1e;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[2] = 0x1a;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[3] = 0x15;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[4] = 0x10;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[5] = 0x0a;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[6] = 0x05;
+       priv->cck_txbbgain_table[10].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[0] = 0x1d;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[1] = 0x1c;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[2] = 0x18;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[3] = 0x14;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[4] = 0x0f;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[5] = 0x0a;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[6] = 0x05;
+       priv->cck_txbbgain_table[11].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[0] = 0x1b;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[1] = 0x1a;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[2] = 0x17;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[3] = 0x13;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[4] = 0x0e;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[5] = 0x09;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[6] = 0x04;
+       priv->cck_txbbgain_table[12].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[0] = 0x1a;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[1] = 0x19;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[2] = 0x16;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[3] = 0x12;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[4] = 0x0d;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[5] = 0x09;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[6] = 0x04;
+       priv->cck_txbbgain_table[13].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[0] = 0x18;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[1] = 0x17;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[2] = 0x15;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[3] = 0x11;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[4] = 0x0c;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[5] = 0x08;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[6] = 0x04;
+       priv->cck_txbbgain_table[14].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[0] = 0x17;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[1] = 0x16;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[2] = 0x13;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[3] = 0x10;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[4] = 0x0c;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[5] = 0x08;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[6] = 0x04;
+       priv->cck_txbbgain_table[15].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[0] = 0x16;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[1] = 0x15;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[2] = 0x12;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[3] = 0x0f;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[4] = 0x0b;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[5] = 0x07;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[6] = 0x04;
+       priv->cck_txbbgain_table[16].ccktxbb_valuearray[7] = 0x01;
+
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[0] = 0x14;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[1] = 0x14;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[2] = 0x11;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[3] = 0x0e;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[4] = 0x0b;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[5] = 0x07;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[6] = 0x03;
+       priv->cck_txbbgain_table[17].ccktxbb_valuearray[7] = 0x02;
+
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[0] = 0x13;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[1] = 0x13;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[2] = 0x10;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[3] = 0x0d;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[4] = 0x0a;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[5] = 0x06;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[6] = 0x03;
+       priv->cck_txbbgain_table[18].ccktxbb_valuearray[7] = 0x01;
+
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[0] = 0x12;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[1] = 0x12;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[2] = 0x0f;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[3] = 0x0c;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[4] = 0x09;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[5] = 0x06;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[6] = 0x03;
+       priv->cck_txbbgain_table[19].ccktxbb_valuearray[7] = 0x01;
+
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[0] = 0x11;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[1] = 0x11;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[2] = 0x0f;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[3] = 0x0c;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[4] = 0x09;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[5] = 0x06;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[6] = 0x03;
+       priv->cck_txbbgain_table[20].ccktxbb_valuearray[7] = 0x01;
+
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[0] = 0x10;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[1] = 0x10;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[2] = 0x0e;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[3] = 0x0b;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[4] = 0x08;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[5] = 0x05;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[6] = 0x03;
+       priv->cck_txbbgain_table[21].ccktxbb_valuearray[7] = 0x01;
+
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[0] = 0x0f;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[1] = 0x0f;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[2] = 0x0d;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[3] = 0x0b;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[4] = 0x08;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[5] = 0x05;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[6] = 0x03;
+       priv->cck_txbbgain_table[22].ccktxbb_valuearray[7] = 0x01;
+
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[0] = 0x36;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[1] = 0x35;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[2] = 0x2e;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[3] = 0x1b;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[0].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[0] = 0x33;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[1] = 0x32;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[2] = 0x2b;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[3] = 0x19;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[1].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[0] = 0x30;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[1] = 0x2f;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[2] = 0x29;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[3] = 0x18;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[2].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[0] = 0x2d;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[1] = 0x2d;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[2] = 0x27;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[3] = 0x17;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[3].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[0] = 0x2b;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[1] = 0x2a;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[2] = 0x25;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[3] = 0x15;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[4].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[0] = 0x28;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[1] = 0x28;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[2] = 0x22;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[3] = 0x14;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[5].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[0] = 0x26;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[1] = 0x25;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[2] = 0x21;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[3] = 0x13;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[6].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[0] = 0x24;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[1] = 0x23;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[2] = 0x1f;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[3] = 0x12;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[7].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[0] = 0x22;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[1] = 0x21;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[2] = 0x1d;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[3] = 0x11;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[8].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[0] = 0x20;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[1] = 0x20;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[2] = 0x1b;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[3] = 0x10;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[9].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[0] = 0x1f;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[1] = 0x1e;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[2] = 0x1a;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[3] = 0x0f;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[10].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[0] = 0x1d;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[1] = 0x1c;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[2] = 0x18;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[3] = 0x0e;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[11].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[0] = 0x1b;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[1] = 0x1a;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[2] = 0x17;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[3] = 0x0e;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[12].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[0] = 0x1a;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[1] = 0x19;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[2] = 0x16;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[3] = 0x0d;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[13].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[0] = 0x18;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[1] = 0x17;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[2] = 0x15;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[3] = 0x0c;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[14].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[0] = 0x17;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[1] = 0x16;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[2] = 0x13;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[3] = 0x0b;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[15].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[0] = 0x16;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[1] = 0x15;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[2] = 0x12;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[3] = 0x0b;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[16].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[0] = 0x14;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[1] = 0x14;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[2] = 0x11;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[3] = 0x0a;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[17].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[0] = 0x13;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[1] = 0x13;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[2] = 0x10;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[3] = 0x0a;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[18].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[0] = 0x12;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[1] = 0x12;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[2] = 0x0f;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[3] = 0x09;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[19].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[0] = 0x11;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[1] = 0x11;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[2] = 0x0f;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[3] = 0x09;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[20].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[0] = 0x10;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[1] = 0x10;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[2] = 0x0e;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[3] = 0x08;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[21].ccktxbb_valuearray[7] = 0x00;
+
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[0] = 0x0f;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[1] = 0x0f;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[2] = 0x0d;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[3] = 0x08;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[4] = 0x00;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[5] = 0x00;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[6] = 0x00;
+       priv->cck_txbbgain_ch14_table[22].ccktxbb_valuearray[7] = 0x00;
+
+       priv->btxpower_tracking = true;
+       priv->txpower_count       = 0;
+       priv->btxpower_trackingInit = false;
+
+}
+#endif
+#ifndef RTL8190P
+static void dm_InitializeTXPowerTracking_ThermalMeter(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+#ifdef RTL8192SE
+               priv->btxpower_tracking = false;
+               priv->txpower_count       = 0;
+               priv->btxpower_trackingInit = false;
+#else
+
+       if (priv->rtllib->FwRWRF)
+               priv->btxpower_tracking = true;
+       else
+               priv->btxpower_tracking = false;
+       priv->txpower_count       = 0;
+       priv->btxpower_trackingInit = false;
+#endif
+       RT_TRACE(COMP_POWER_TRACKING, "pMgntInfo->bTXPowerTracking = %d\n", priv->btxpower_tracking);
+}
+#endif
+
+void dm_initialize_txpower_tracking(struct net_device *dev)
+{
+#ifdef RTL8192E
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+#ifdef RTL8190P
+       dm_InitializeTXPowerTracking_TSSI(dev);
+#elif defined RTL8192E
+       if (priv->IC_Cut >= IC_VersionCut_D)
+               dm_InitializeTXPowerTracking_TSSI(dev);
+       else
+               dm_InitializeTXPowerTracking_ThermalMeter(dev);
+#elif defined RTL8192SE
+       dm_InitializeTXPowerTracking_ThermalMeter(dev);
+#endif
+}
+
+#if (defined RTL8192E || defined RTL8190P)
+static void dm_CheckTXPowerTracking_TSSI(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u32 tx_power_track_counter = 0;
+       RT_TRACE(COMP_POWER_TRACKING,"%s()\n",__func__);
+       if (read_nic_byte(dev, 0x11e) ==1)
+               return;
+       if (!priv->btxpower_tracking)
+               return;
+       tx_power_track_counter++;
+
+
+        if (tx_power_track_counter >= 180)
+               {
+               queue_delayed_work_rsl(priv->priv_wq,&priv->txpower_tracking_wq,0);
+               tx_power_track_counter =0;
+               }
+
+}
+#endif
+#ifndef RTL8190P
+static void dm_CheckTXPowerTracking_ThermalMeter(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u8       TM_Trigger=0;
+       u8              TxPowerCheckCnt = 0;
+
+       if (IS_HARDWARE_TYPE_8192SE(dev))
+               TxPowerCheckCnt = 5;
+       else
+               TxPowerCheckCnt = 2;
+        if (!priv->btxpower_tracking){
+            return;
+        } else {
+            if (priv->txpower_count  <= TxPowerCheckCnt) {
+                       priv->txpower_count++;
+                       return;
+               }
+       }
+
+       if (!TM_Trigger)
+       {
+#ifdef RTL8192SE
+               if (IS_HARDWARE_TYPE_8192SE(dev))
+               {
+                    rtl8192_phy_SetRFReg(dev, RF90_PATH_A, RF_T_METER, bRFRegOffsetMask, 0x60);
+                    RT_TRACE(COMP_POWER_TRACKING, "Trigger 92S Thermal Meter!!\n");
+                }
+                else
+#endif
+                {
+               rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
+               rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
+               rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4d);
+               rtl8192_phy_SetRFReg(dev, RF90_PATH_A, 0x02, bMask12Bits, 0x4f);
+                }
+               TM_Trigger = 1;
+               return;
+       } else {
+            printk("===============>Schedule TxPowerTrackingWorkItem\n");
+#ifdef RTL8192SE
+               DM_TXPowerTracking92SDirectCall(dev);
+#else
+
+               queue_delayed_work_rsl(priv->priv_wq,&priv->txpower_tracking_wq,0);
+#endif
+               TM_Trigger = 0;
+               }
+
+       }
+#endif
+
+#ifdef RTL8192SE
+void DM_TXPowerTracking92SDirectCall(struct net_device *dev)
+{
+       dm_TXPowerTrackingCallback_ThermalMeter(dev);
+       }
+#endif
+
+static void dm_check_txpower_tracking(struct net_device *dev)
+{
+#ifdef RTL8192E
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+#ifdef  RTL8190P
+       dm_CheckTXPowerTracking_TSSI(dev);
+#elif defined RTL8192E
+       if (priv->IC_Cut >= IC_VersionCut_D)
+               dm_CheckTXPowerTracking_TSSI(dev);
+       else
+               dm_CheckTXPowerTracking_ThermalMeter(dev);
+#elif defined RTL8192SE
+       dm_CheckTXPowerTracking_ThermalMeter(dev);
+#endif
+
+}
+
+#ifndef RTL8192SE
+static void dm_CCKTxPowerAdjust_TSSI(struct net_device *dev, bool  bInCH14)
+{
+       u32 TempVal;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       TempVal = 0;
+       if (!bInCH14){
+               TempVal =       (u32)(priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[0] +
+                                       (priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[1]<<8)) ;
+
+               rtl8192_setBBreg(dev, rCCK0_TxFilter1,bMaskHWord, TempVal);
+               TempVal = 0;
+               TempVal =       (u32)(priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[2] +
+                                       (priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[3]<<8) +
+                                       (priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[4]<<16 )+
+                                       (priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[5]<<24));
+               rtl8192_setBBreg(dev, rCCK0_TxFilter2,bMaskDWord, TempVal);
+               TempVal = 0;
+               TempVal =       (u32)(priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[6] +
+                                       (priv->cck_txbbgain_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[7]<<8)) ;
+
+               rtl8192_setBBreg(dev, rCCK0_DebugPort,bMaskLWord, TempVal);
+       }
+       else
+       {
+               TempVal =       (u32)(priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[0] +
+                                       (priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[1]<<8)) ;
+
+               rtl8192_setBBreg(dev, rCCK0_TxFilter1,bMaskHWord, TempVal);
+               TempVal = 0;
+               TempVal =       (u32)(priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[2] +
+                                       (priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[3]<<8) +
+                                       (priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[4]<<16 )+
+                                       (priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[5]<<24));
+               rtl8192_setBBreg(dev, rCCK0_TxFilter2,bMaskDWord, TempVal);
+               TempVal = 0;
+               TempVal =       (u32)(priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[6] +
+                                       (priv->cck_txbbgain_ch14_table[(u8)(priv->CCKPresentAttentuation)].ccktxbb_valuearray[7]<<8)) ;
+
+               rtl8192_setBBreg(dev, rCCK0_DebugPort,bMaskLWord, TempVal);
+       }
+
+
+}
+#endif
+#ifdef RTL8192E
+static void dm_CCKTxPowerAdjust_ThermalMeter(struct net_device *dev,   bool  bInCH14)
+{
+       u32 TempVal;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       TempVal = 0;
+       if (!bInCH14)
+       {
+               TempVal =       CCKSwingTable_Ch1_Ch13[priv->CCK_index][0] +
+                                       (CCKSwingTable_Ch1_Ch13[priv->CCK_index][1]<<8) ;
+               rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
+               RT_TRACE(COMP_POWER_TRACKING, "CCK not chnl 14, reg 0x%x = 0x%x\n",
+                       rCCK0_TxFilter1, TempVal);
+               TempVal = 0;
+               TempVal =       CCKSwingTable_Ch1_Ch13[priv->CCK_index][2] +
+                                       (CCKSwingTable_Ch1_Ch13[priv->CCK_index][3]<<8) +
+                                       (CCKSwingTable_Ch1_Ch13[priv->CCK_index][4]<<16 )+
+                                       (CCKSwingTable_Ch1_Ch13[priv->CCK_index][5]<<24);
+               rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
+               RT_TRACE(COMP_POWER_TRACKING, "CCK not chnl 14, reg 0x%x = 0x%x\n",
+                       rCCK0_TxFilter2, TempVal);
+               TempVal = 0;
+               TempVal =       CCKSwingTable_Ch1_Ch13[priv->CCK_index][6] +
+                                       (CCKSwingTable_Ch1_Ch13[priv->CCK_index][7]<<8) ;
+
+               rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
+               RT_TRACE(COMP_POWER_TRACKING, "CCK not chnl 14, reg 0x%x = 0x%x\n",
+                       rCCK0_DebugPort, TempVal);
+       }
+       else
+       {
+               TempVal =       CCKSwingTable_Ch14[priv->CCK_index][0] +
+                                       (CCKSwingTable_Ch14[priv->CCK_index][1]<<8) ;
+
+               rtl8192_setBBreg(dev, rCCK0_TxFilter1, bMaskHWord, TempVal);
+               RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
+                       rCCK0_TxFilter1, TempVal);
+               TempVal = 0;
+               TempVal =       CCKSwingTable_Ch14[priv->CCK_index][2] +
+                                       (CCKSwingTable_Ch14[priv->CCK_index][3]<<8) +
+                                       (CCKSwingTable_Ch14[priv->CCK_index][4]<<16 )+
+                                       (CCKSwingTable_Ch14[priv->CCK_index][5]<<24);
+               rtl8192_setBBreg(dev, rCCK0_TxFilter2, bMaskDWord, TempVal);
+               RT_TRACE(COMP_POWER_TRACKING, "CCK chnl 14, reg 0x%x = 0x%x\n",
+                       rCCK0_TxFilter2, TempVal);
+               TempVal = 0;
+               TempVal =       CCKSwingTable_Ch14[priv->CCK_index][6] +
+                                       (CCKSwingTable_Ch14[priv->CCK_index][7]<<8) ;
+
+               rtl8192_setBBreg(dev, rCCK0_DebugPort, bMaskLWord, TempVal);
+               RT_TRACE(COMP_POWER_TRACKING,"CCK chnl 14, reg 0x%x = 0x%x\n",
+                       rCCK0_DebugPort, TempVal);
+       }
+       }
+#endif
+
+#ifndef RTL8192SE
+extern void dm_cck_txpower_adjust(
+       struct net_device *dev,
+       bool  binch14
+)
+{
+#ifndef RTL8190P
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+#ifdef RTL8190P
+       dm_CCKTxPowerAdjust_TSSI(dev, binch14);
+#else
+       if (priv->IC_Cut >= IC_VersionCut_D)
+               dm_CCKTxPowerAdjust_TSSI(dev, binch14);
+       else
+               dm_CCKTxPowerAdjust_ThermalMeter(dev, binch14);
+#endif
+}
+#endif
+
+
+#if defined(RTL8192E)||defined(RTL8190P)
+static void dm_txpower_reset_recovery(
+       struct net_device *dev
+)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       RT_TRACE(COMP_POWER_TRACKING, "Start Reset Recovery ==>\n");
+       rtl8192_setBBreg(dev, rOFDM0_XATxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfa_txpowertrackingindex].txbbgain_value);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc80 is %08x\n",priv->txbbgain_table[priv->rfa_txpowertrackingindex].txbbgain_value);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in RFA_txPowerTrackingIndex is %x\n",priv->rfa_txpowertrackingindex);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery : RF A I/Q Amplify Gain is %ld\n",priv->txbbgain_table[priv->rfa_txpowertrackingindex].txbb_iq_amplifygain);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: CCK Attenuation is %d dB\n",priv->CCKPresentAttentuation);
+       dm_cck_txpower_adjust(dev,priv->bcck_in_ch14);
+
+       rtl8192_setBBreg(dev, rOFDM0_XCTxIQImbalance, bMaskDWord, priv->txbbgain_table[priv->rfc_txpowertrackingindex].txbbgain_value);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in 0xc90 is %08x\n",priv->txbbgain_table[priv->rfc_txpowertrackingindex].txbbgain_value);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery: Fill in RFC_txPowerTrackingIndex is %x\n",priv->rfc_txpowertrackingindex);
+       RT_TRACE(COMP_POWER_TRACKING, "Reset Recovery : RF C I/Q Amplify Gain is %ld\n",priv->txbbgain_table[priv->rfc_txpowertrackingindex].txbb_iq_amplifygain);
+
+}
+
+extern void dm_restore_dynamic_mechanism_state(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32     reg_ratr = priv->rate_adaptive.last_ratr;
+
+       if (IS_NIC_DOWN(priv)){
+               RT_TRACE(COMP_RATE, "<---- dm_restore_dynamic_mechanism_state(): driver is going to unload\n");
+               return;
+       }
+
+       if (priv->rate_adaptive.rate_adaptive_disabled)
+               return;
+       if ( !(priv->rtllib->mode==WIRELESS_MODE_N_24G ||
+                priv->rtllib->mode==WIRELESS_MODE_N_5G))
+                return;
+       {
+                       u32 ratr_value;
+                       ratr_value = reg_ratr;
+                       if (priv->rf_type == RF_1T2R)
+                       {
+                               ratr_value &=~ (RATE_ALL_OFDM_2SS);
+                       }
+                       write_nic_dword(dev, RATR0, ratr_value);
+                       write_nic_byte(dev, UFWP, 1);
+       }
+       if (priv->btxpower_trackingInit && priv->btxpower_tracking){
+               dm_txpower_reset_recovery(dev);
+       }
+
+       dm_bb_initialgain_restore(dev);
+
+}
+
+static void dm_bb_initialgain_restore(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 bit_mask = 0x7f;
+
+       if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
+               return;
+
+       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
+       rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, bit_mask, (u32)priv->initgain_backup.xaagccore1);
+       rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, bit_mask, (u32)priv->initgain_backup.xbagccore1);
+       rtl8192_setBBreg(dev, rOFDM0_XCAGCCore1, bit_mask, (u32)priv->initgain_backup.xcagccore1);
+       rtl8192_setBBreg(dev, rOFDM0_XDAGCCore1, bit_mask, (u32)priv->initgain_backup.xdagccore1);
+       bit_mask  = bMaskByte2;
+       rtl8192_setBBreg(dev, rCCK0_CCA, bit_mask, (u32)priv->initgain_backup.cca);
+
+       RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
+       RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
+       RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
+       RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
+       RT_TRACE(COMP_DIG, "dm_BBInitialGainRestore 0xa0a is %x\n",priv->initgain_backup.cca);
+       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1);
+
+}
+
+
+extern void dm_backup_dynamic_mechanism_state(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->bswitch_fsync  = false;
+       priv->bfsync_processing = false;
+       dm_bb_initialgain_backup(dev);
+
+}
+
+
+static void dm_bb_initialgain_backup(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 bit_mask = bMaskByte0;
+
+       if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
+               return;
+
+       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
+       priv->initgain_backup.xaagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, bit_mask);
+       priv->initgain_backup.xbagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XBAGCCore1, bit_mask);
+       priv->initgain_backup.xcagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XCAGCCore1, bit_mask);
+       priv->initgain_backup.xdagccore1 = (u8)rtl8192_QueryBBReg(dev, rOFDM0_XDAGCCore1, bit_mask);
+       bit_mask  = bMaskByte2;
+       priv->initgain_backup.cca = (u8)rtl8192_QueryBBReg(dev, rCCK0_CCA, bit_mask);
+
+       RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc50 is %x\n",priv->initgain_backup.xaagccore1);
+       RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc58 is %x\n",priv->initgain_backup.xbagccore1);
+       RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc60 is %x\n",priv->initgain_backup.xcagccore1);
+       RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xc68 is %x\n",priv->initgain_backup.xdagccore1);
+       RT_TRACE(COMP_DIG, "BBInitialGainBackup 0xa0a is %x\n",priv->initgain_backup.cca);
+
+}
+
+#endif
+extern void dm_change_dynamic_initgain_thresh(struct net_device *dev,
+                                                               u32             dm_type,
+                                                               u32             dm_value)
+{
+#ifdef RTL8192SE
+       struct r8192_priv *priv = rtllib_priv(dev);
+       if (dm_type == DIG_TYPE_THRESH_HIGHPWR_HIGH)
+               priv->MidHighPwrTHR_L2 = (u8)dm_value;
+       else if (dm_type == DIG_TYPE_THRESH_HIGHPWR_LOW)
+               priv->MidHighPwrTHR_L1 = (u8)dm_value;
+       return;
+#endif
+       if (dm_type == DIG_TYPE_THRESH_HIGH)
+       {
+               dm_digtable.rssi_high_thresh = dm_value;
+       }
+       else if (dm_type == DIG_TYPE_THRESH_LOW)
+       {
+               dm_digtable.rssi_low_thresh = dm_value;
+       }
+       else if (dm_type == DIG_TYPE_THRESH_HIGHPWR_HIGH)
+       {
+               dm_digtable.rssi_high_power_highthresh = dm_value;
+       }
+       else if (dm_type == DIG_TYPE_THRESH_HIGHPWR_HIGH)
+       {
+               dm_digtable.rssi_high_power_highthresh = dm_value;
+       }
+       else if (dm_type == DIG_TYPE_ENABLE)
+       {
+               dm_digtable.dig_state           = DM_STA_DIG_MAX;
+               dm_digtable.dig_enable_flag     = true;
+       }
+       else if (dm_type == DIG_TYPE_DISABLE)
+       {
+               dm_digtable.dig_state           = DM_STA_DIG_MAX;
+               dm_digtable.dig_enable_flag     = false;
+       }
+       else if (dm_type == DIG_TYPE_DBG_MODE)
+       {
+               if (dm_value >= DM_DBG_MAX)
+                       dm_value = DM_DBG_OFF;
+               dm_digtable.dbg_mode            = (u8)dm_value;
+       }
+       else if (dm_type == DIG_TYPE_RSSI)
+       {
+               if (dm_value > 100)
+                       dm_value = 30;
+               dm_digtable.rssi_val                    = (long)dm_value;
+       }
+       else if (dm_type == DIG_TYPE_ALGORITHM)
+       {
+               if (dm_value >= DIG_ALGO_MAX)
+                       dm_value = DIG_ALGO_BY_FALSE_ALARM;
+               if (dm_digtable.dig_algorithm != (u8)dm_value)
+                       dm_digtable.dig_algorithm_switch = 1;
+               dm_digtable.dig_algorithm       = (u8)dm_value;
+       }
+       else if (dm_type == DIG_TYPE_BACKOFF)
+       {
+               if (dm_value > 30)
+                       dm_value = 30;
+               dm_digtable.backoff_val         = (u8)dm_value;
+       }
+       else if (dm_type == DIG_TYPE_RX_GAIN_MIN)
+       {
+               if (dm_value == 0)
+                       dm_value = 0x1;
+               dm_digtable.rx_gain_range_min = (u8)dm_value;
+       }
+       else if (dm_type == DIG_TYPE_RX_GAIN_MAX)
+       {
+               if (dm_value > 0x50)
+                       dm_value = 0x50;
+               dm_digtable.rx_gain_range_max = (u8)dm_value;
+       }
+}
+extern void
+dm_change_fsync_setting(
+       struct net_device *dev,
+       s32             DM_Type,
+       s32             DM_Value)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (DM_Type == 0)
+       {
+               if (DM_Value > 1)
+                       DM_Value = 1;
+               priv->framesyncMonitor = (u8)DM_Value;
+       }
+}
+
+extern void
+dm_change_rxpath_selection_setting(
+       struct net_device *dev,
+       s32             DM_Type,
+       s32             DM_Value)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       prate_adaptive  pRA = (prate_adaptive)&(priv->rate_adaptive);
+
+
+       if (DM_Type == 0)
+       {
+               if (DM_Value > 1)
+                       DM_Value = 1;
+               DM_RxPathSelTable.Enable = (u8)DM_Value;
+       }
+       else if (DM_Type == 1)
+       {
+               if (DM_Value > 1)
+                       DM_Value = 1;
+               DM_RxPathSelTable.DbgMode = (u8)DM_Value;
+       }
+       else if (DM_Type == 2)
+       {
+               if (DM_Value > 40)
+                       DM_Value = 40;
+               DM_RxPathSelTable.SS_TH_low = (u8)DM_Value;
+       }
+       else if (DM_Type == 3)
+       {
+               if (DM_Value > 25)
+                       DM_Value = 25;
+               DM_RxPathSelTable.diff_TH = (u8)DM_Value;
+       }
+       else if (DM_Type == 4)
+       {
+               if (DM_Value >= CCK_Rx_Version_MAX)
+                       DM_Value = CCK_Rx_Version_1;
+               DM_RxPathSelTable.cck_method= (u8)DM_Value;
+       }
+       else if (DM_Type == 10)
+       {
+               if (DM_Value > 100)
+                       DM_Value = 50;
+               DM_RxPathSelTable.rf_rssi[0] = (u8)DM_Value;
+       }
+       else if (DM_Type == 11)
+       {
+               if (DM_Value > 100)
+                       DM_Value = 50;
+               DM_RxPathSelTable.rf_rssi[1] = (u8)DM_Value;
+       }
+       else if (DM_Type == 12)
+       {
+               if (DM_Value > 100)
+                       DM_Value = 50;
+               DM_RxPathSelTable.rf_rssi[2] = (u8)DM_Value;
+       }
+       else if (DM_Type == 13)
+       {
+               if (DM_Value > 100)
+                       DM_Value = 50;
+               DM_RxPathSelTable.rf_rssi[3] = (u8)DM_Value;
+       }
+       else if (DM_Type == 20)
+       {
+               if (DM_Value > 1)
+                       DM_Value = 1;
+               pRA->ping_rssi_enable = (u8)DM_Value;
+       }
+       else if (DM_Type == 21)
+       {
+               if (DM_Value > 30)
+                       DM_Value = 30;
+               pRA->ping_rssi_thresh_for_ra = DM_Value;
+       }
+}
+
+static void dm_dig_init(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       dm_digtable.dig_enable_flag     = true;
+       dm_digtable.Backoff_Enable_Flag = true;
+
+#ifdef RTL8192SE
+       if ((priv->DM_Type  == DM_Type_ByDriver) && (priv->pFirmware->FirmwareVersion >= 0x3c))
+               dm_digtable.dig_algorithm = DIG_ALGO_BY_TOW_PORT;
+       else
+               dm_digtable.dig_algorithm = DIG_ALGO_BEFORE_CONNECT_BY_RSSI_AND_ALARM;
+#else
+       dm_digtable.dig_algorithm = DIG_ALGO_BY_RSSI;
+#endif
+
+       dm_digtable.Dig_TwoPort_Algorithm = DIG_TWO_PORT_ALGO_RSSI;
+       dm_digtable.Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
+       dm_digtable.dbg_mode = DM_DBG_OFF;
+       dm_digtable.dig_algorithm_switch = 0;
+
+       dm_digtable.dig_state           = DM_STA_DIG_MAX;
+       dm_digtable.dig_highpwr_state   = DM_STA_DIG_MAX;
+       dm_digtable.CurSTAConnectState = dm_digtable.PreSTAConnectState = DIG_STA_DISCONNECT;
+       dm_digtable.CurAPConnectState = dm_digtable.PreAPConnectState = DIG_AP_DISCONNECT;
+       dm_digtable.initialgain_lowerbound_state = false;
+
+       dm_digtable.rssi_low_thresh     = DM_DIG_THRESH_LOW;
+       dm_digtable.rssi_high_thresh    = DM_DIG_THRESH_HIGH;
+
+       dm_digtable.FALowThresh = DM_FALSEALARM_THRESH_LOW;
+       dm_digtable.FAHighThresh        = DM_FALSEALARM_THRESH_HIGH;
+
+       dm_digtable.rssi_high_power_lowthresh = DM_DIG_HIGH_PWR_THRESH_LOW;
+       dm_digtable.rssi_high_power_highthresh = DM_DIG_HIGH_PWR_THRESH_HIGH;
+
+       dm_digtable.rssi_val = 50;
+       dm_digtable.backoff_val = DM_DIG_BACKOFF;
+       dm_digtable.rx_gain_range_max = DM_DIG_MAX;
+       if (priv->CustomerID == RT_CID_819x_Netcore)
+               dm_digtable.rx_gain_range_min = DM_DIG_MIN_Netcore;
+       else
+               dm_digtable.rx_gain_range_min = DM_DIG_MIN;
+
+       dm_digtable.BackoffVal_range_max = DM_DIG_BACKOFF_MAX;
+       dm_digtable.BackoffVal_range_min = DM_DIG_BACKOFF_MIN;
+}
+
+void dm_FalseAlarmCounterStatistics(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32 ret_value;
+       PFALSE_ALARM_STATISTICS FalseAlmCnt = &(priv->FalseAlmCnt);
+
+       ret_value = rtl8192_QueryBBReg(dev, rOFDM_PHYCounter1, bMaskDWord);
+        FalseAlmCnt->Cnt_Parity_Fail = ((ret_value&0xffff0000)>>16);
+
+        ret_value = rtl8192_QueryBBReg(dev, rOFDM_PHYCounter2, bMaskDWord);
+       FalseAlmCnt->Cnt_Rate_Illegal = (ret_value&0xffff);
+       FalseAlmCnt->Cnt_Crc8_fail = ((ret_value&0xffff0000)>>16);
+       ret_value = rtl8192_QueryBBReg(dev, rOFDM_PHYCounter3, bMaskDWord);
+       FalseAlmCnt->Cnt_Mcs_fail = (ret_value&0xffff);
+
+       FalseAlmCnt->Cnt_Ofdm_fail = FalseAlmCnt->Cnt_Parity_Fail + FalseAlmCnt->Cnt_Rate_Illegal +
+                                                         FalseAlmCnt->Cnt_Crc8_fail + FalseAlmCnt->Cnt_Mcs_fail;
+
+       ret_value = rtl8192_QueryBBReg(dev, 0xc64, bMaskDWord);
+       FalseAlmCnt->Cnt_Cck_fail = (ret_value&0xffff);
+       FalseAlmCnt->Cnt_all = (FalseAlmCnt->Cnt_Parity_Fail +
+                                               FalseAlmCnt->Cnt_Rate_Illegal +
+                                               FalseAlmCnt->Cnt_Crc8_fail +
+                                               FalseAlmCnt->Cnt_Mcs_fail +
+                                               FalseAlmCnt->Cnt_Cck_fail);
+
+       RT_TRACE(COMP_DIG, "Cnt_Ofdm_fail = %d, Cnt_Cck_fail = %d, Cnt_all = %d\n",
+                               FalseAlmCnt->Cnt_Ofdm_fail, FalseAlmCnt->Cnt_Cck_fail , FalseAlmCnt->Cnt_all);
+}
+
+#ifdef RTL8192SE
+static void dm_CtrlInitGainAPByFalseAlarm(struct net_device *dev)
+{
+       static u8               binitialized = false;
+
+       {
+               binitialized = false;
+               dm_digtable.Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
+               return;
+       }
+}
+#endif
+
+static void dm_ctrl_initgain_byrssi(struct net_device *dev)
+{
+
+       if (dm_digtable.dig_enable_flag == false)
+               return;
+
+       if (dm_digtable.dig_algorithm == DIG_ALGO_BY_FALSE_ALARM)
+               dm_ctrl_initgain_byrssi_by_fwfalse_alarm(dev);
+       else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_RSSI)
+               dm_ctrl_initgain_byrssi_by_driverrssi(dev);
+#ifdef RTL8192SE
+       else if (dm_digtable.dig_algorithm == DIG_ALGO_BEFORE_CONNECT_BY_RSSI_AND_ALARM)
+               dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm(dev);
+       else if (dm_digtable.dig_algorithm == DIG_ALGO_BY_TOW_PORT)
+               dm_CtrlInitGainByTwoPort(dev);
+#endif
+       else
+               return;
+}
+
+#ifdef RTL8192SE
+static void dm_CtrlInitGainByTwoPort(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (rtllib_act_scanning(priv->rtllib,true) == true)
+               return;
+
+       if ((priv->rtllib->state > RTLLIB_NOLINK) && (priv->rtllib->state < RTLLIB_LINKED))
+               dm_digtable.CurSTAConnectState = DIG_STA_BEFORE_CONNECT;
+       else if ((priv->rtllib->state == RTLLIB_LINKED) ||(priv->rtllib->state == RTLLIB_LINKED_SCANNING))
+               dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
+       else
+               dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
+
+       dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
+
+       if (dm_digtable.CurSTAConnectState != DIG_STA_DISCONNECT)
+       {
+               if (dm_digtable.Dig_TwoPort_Algorithm == DIG_TWO_PORT_ALGO_FALSE_ALARM)
+               {
+                       dm_digtable.Dig_TwoPort_Algorithm = DIG_TWO_PORT_ALGO_RSSI;
+                       priv->rtllib->SetFwCmdHandler(dev, FW_CMD_DIG_MODE_SS);
+               }
+       }
+
+       dm_FalseAlarmCounterStatistics(dev);
+       dm_initial_gain_STABeforeConnect(dev);
+       dm_CtrlInitGainAPByFalseAlarm(dev);
+
+       dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
+}
+#endif
+
+/*-----------------------------------------------------------------------------
+ * Function:   dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm()
+ *
+ * Overview:   Driver monitor RSSI and False Alarm to change initial gain.
+                       Only change initial gain during link in progress.
+ *
+ * Input:              IN      PADAPTER        pAdapter
+ *
+ * Output:             NONE
+ *
+ * Return:             NONE
+ *
+ * Revised History:
+ *     When            Who             Remark
+ *     03/04/2009      hpfan   Create Version 0.
+ *
+ *---------------------------------------------------------------------------*/
+
+#ifdef RTL8192SE
+static void dm_CtrlInitGainBeforeConnectByRssiAndFalseAlarm(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (rtllib_act_scanning(priv->rtllib,true) == true)
+               return;
+
+       if ((priv->rtllib->state > RTLLIB_NOLINK) && (priv->rtllib->state < RTLLIB_LINKED))
+               dm_digtable.CurSTAConnectState = DIG_STA_BEFORE_CONNECT;
+       else if ((priv->rtllib->state == RTLLIB_LINKED) ||(priv->rtllib->state == RTLLIB_LINKED_SCANNING))
+               dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
+       else
+               dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
+
+       if (dm_digtable.dbg_mode == DM_DBG_OFF)
+               dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
+
+       dm_FalseAlarmCounterStatistics(dev);
+       dm_initial_gain_STABeforeConnect(dev);
+       dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
+
+}
+#endif
+static void dm_ctrl_initgain_byrssi_by_driverrssi(
+       struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 i;
+       static u8       fw_dig=0;
+
+       if (dm_digtable.dig_enable_flag == false)
+               return;
+
+       if (dm_digtable.dig_algorithm_switch)
+               fw_dig = 0;
+       if (fw_dig <= 3)
+       {
+               for (i=0; i<3; i++)
+                       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
+               fw_dig++;
+               dm_digtable.dig_state = DM_STA_DIG_OFF;
+       }
+
+       if (priv->rtllib->state == RTLLIB_LINKED)
+               dm_digtable.CurSTAConnectState = DIG_STA_CONNECT;
+       else
+               dm_digtable.CurSTAConnectState = DIG_STA_DISCONNECT;
+
+
+       if (dm_digtable.dbg_mode == DM_DBG_OFF)
+               dm_digtable.rssi_val = priv->undecorated_smoothed_pwdb;
+       dm_initial_gain(dev);
+       dm_pd_th(dev);
+       dm_cs_ratio(dev);
+       if (dm_digtable.dig_algorithm_switch)
+               dm_digtable.dig_algorithm_switch = 0;
+       dm_digtable.PreSTAConnectState = dm_digtable.CurSTAConnectState;
+
+}
+
+static void dm_ctrl_initgain_byrssi_by_fwfalse_alarm(
+       struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u32 reset_cnt = 0;
+       u8 i;
+
+       if (dm_digtable.dig_enable_flag == false)
+               return;
+
+       if (dm_digtable.dig_algorithm_switch)
+       {
+               dm_digtable.dig_state = DM_STA_DIG_MAX;
+               for (i=0; i<3; i++)
+                       rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1);
+               dm_digtable.dig_algorithm_switch = 0;
+       }
+
+       if (priv->rtllib->state != RTLLIB_LINKED)
+               return;
+
+       if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_low_thresh) &&
+               (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_thresh))
+       {
+               return;
+       }
+       if ((priv->undecorated_smoothed_pwdb <= dm_digtable.rssi_low_thresh))
+       {
+               if (dm_digtable.dig_state == DM_STA_DIG_OFF &&
+                       (priv->reset_count == reset_cnt))
+               {
+                       return;
+               }
+               else
+               {
+                       reset_cnt = priv->reset_count;
+               }
+
+               dm_digtable.dig_highpwr_state = DM_STA_DIG_MAX;
+               dm_digtable.dig_state = DM_STA_DIG_OFF;
+
+               rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x8);
+
+               write_nic_byte(dev, rOFDM0_XAAGCCore1, 0x17);
+               write_nic_byte(dev, rOFDM0_XBAGCCore1, 0x17);
+               write_nic_byte(dev, rOFDM0_XCAGCCore1, 0x17);
+               write_nic_byte(dev, rOFDM0_XDAGCCore1, 0x17);
+
+               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+               {
+                       #ifdef RTL8190P
+                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x40);
+                       #else
+                               write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x00);
+                               #endif
+                       /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                               write_nic_byte(pAdapter, rOFDM0_RxDetector1, 0x40);
+                       */
+
+
+               }
+               else
+                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+
+               write_nic_byte(dev, 0xa0a, 0x08);
+
+               return;
+
+       }
+
+       if ((priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh) )
+       {
+               u8 reset_flag = 0;
+
+               if (dm_digtable.dig_state == DM_STA_DIG_ON &&
+                       (priv->reset_count == reset_cnt))
+               {
+                       dm_ctrl_initgain_byrssi_highpwr(dev);
+                       return;
+               }
+               else
+               {
+                       if (priv->reset_count != reset_cnt)
+                               reset_flag = 1;
+
+                       reset_cnt = priv->reset_count;
+               }
+
+               dm_digtable.dig_state = DM_STA_DIG_ON;
+
+               if (reset_flag == 1)
+               {
+                       write_nic_byte(dev, rOFDM0_XAAGCCore1, 0x2c);
+                       write_nic_byte(dev, rOFDM0_XBAGCCore1, 0x2c);
+                       write_nic_byte(dev, rOFDM0_XCAGCCore1, 0x2c);
+                       write_nic_byte(dev, rOFDM0_XDAGCCore1, 0x2c);
+               }
+               else
+               {
+               write_nic_byte(dev, rOFDM0_XAAGCCore1, 0x20);
+               write_nic_byte(dev, rOFDM0_XBAGCCore1, 0x20);
+               write_nic_byte(dev, rOFDM0_XCAGCCore1, 0x20);
+               write_nic_byte(dev, rOFDM0_XDAGCCore1, 0x20);
+               }
+
+               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+               {
+                       #ifdef RTL8190P
+                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                       #else
+                               write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x20);
+                               #endif
+                       /*
+                       else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                       */
+
+               }
+               else
+                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x44);
+
+               write_nic_byte(dev, 0xa0a, 0xcd);
+
+
+               rtl8192_setBBreg(dev, UFWP, bMaskByte1, 0x1);
+
+       }
+
+       dm_ctrl_initgain_byrssi_highpwr(dev);
+
+}
+
+
+static void dm_ctrl_initgain_byrssi_highpwr(
+       struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u32 reset_cnt_highpwr = 0;
+
+       if ((priv->undecorated_smoothed_pwdb > dm_digtable.rssi_high_power_lowthresh) &&
+               (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_power_highthresh))
+       {
+               return;
+       }
+
+       if (priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_power_highthresh)
+       {
+               if (dm_digtable.dig_highpwr_state == DM_STA_DIG_ON &&
+                       (priv->reset_count == reset_cnt_highpwr))
+                       return;
+               else
+                       dm_digtable.dig_highpwr_state = DM_STA_DIG_ON;
+
+               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+               {
+                       #ifdef RTL8190P
+                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x41);
+                       #else
+                               write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x10);
+                               #endif
+
+                       /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x41);
+                       */
+
+               }
+               else
+                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x43);
+       }
+       else
+       {
+               if (dm_digtable.dig_highpwr_state == DM_STA_DIG_OFF&&
+                       (priv->reset_count == reset_cnt_highpwr))
+                       return;
+               else
+                       dm_digtable.dig_highpwr_state = DM_STA_DIG_OFF;
+
+               if (priv->undecorated_smoothed_pwdb < dm_digtable.rssi_high_power_lowthresh &&
+                        priv->undecorated_smoothed_pwdb >= dm_digtable.rssi_high_thresh)
+               {
+                       if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+                       {
+                               #ifdef RTL8190P
+                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                               #else
+                                       write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x20);
+                                       #endif
+                               /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                               */
+
+                       }
+                       else
+                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x44);
+               }
+       }
+
+       reset_cnt_highpwr = priv->reset_count;
+
+}
+
+
+static void dm_initial_gain(
+       struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8                                      initial_gain=0;
+       static u8                               initialized=0, force_write=0;
+       static u32                      reset_cnt=0;
+
+       if (dm_digtable.dig_algorithm_switch)
+       {
+               initialized = 0;
+               reset_cnt = 0;
+       }
+
+       if (rtllib_act_scanning(priv->rtllib,true) == true)
+       {
+               force_write = 1;
+               return;
+       }
+
+       if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState)
+       {
+               if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT)
+               {
+                       if ((dm_digtable.rssi_val+10-dm_digtable.backoff_val) > dm_digtable.rx_gain_range_max)
+                               dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_max;
+                       else if ((dm_digtable.rssi_val+10-dm_digtable.backoff_val) < dm_digtable.rx_gain_range_min)
+                               dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_min;
+                       else
+                               dm_digtable.cur_ig_value = dm_digtable.rssi_val+10-dm_digtable.backoff_val;
+               }
+               else
+               {
+                       if (dm_digtable.cur_ig_value == 0)
+                               dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
+                       else
+                               dm_digtable.cur_ig_value = dm_digtable.pre_ig_value;
+               }
+       }
+       else
+       {
+               dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
+               dm_digtable.pre_ig_value = 0;
+       }
+
+       if (priv->reset_count != reset_cnt)
+       {
+               force_write = 1;
+               reset_cnt = priv->reset_count;
+       }
+
+       if (dm_digtable.pre_ig_value != read_nic_byte(dev, rOFDM0_XAAGCCore1))
+               force_write = 1;
+
+       {
+               if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value)
+                       || !initialized || force_write)
+               {
+                       initial_gain = (u8)dm_digtable.cur_ig_value;
+                       write_nic_byte(dev, rOFDM0_XAAGCCore1, initial_gain);
+                       write_nic_byte(dev, rOFDM0_XBAGCCore1, initial_gain);
+                       write_nic_byte(dev, rOFDM0_XCAGCCore1, initial_gain);
+                       write_nic_byte(dev, rOFDM0_XDAGCCore1, initial_gain);
+                       dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
+                       initialized = 1;
+                       force_write = 0;
+               }
+       }
+}
+
+void dm_initial_gain_STABeforeConnect(
+       struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8                      initial_gain=0;
+       static u8               initialized=0, force_write=0;
+
+       RT_TRACE(COMP_DIG, "PreSTAConnectState = %x, CurSTAConnectState = %x\n",
+                               dm_digtable.PreSTAConnectState, dm_digtable.CurSTAConnectState);
+
+
+       if ((dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState) ||
+               (dm_digtable.CurSTAConnectState == DIG_STA_BEFORE_CONNECT))
+       {
+               if (dm_digtable.CurSTAConnectState == DIG_STA_BEFORE_CONNECT)
+               {
+                       if (priv->rtllib->eRFPowerState != eRfOn)
+                               return;
+
+                       if (dm_digtable.Backoff_Enable_Flag == true)
+                       {
+                               if (priv->FalseAlmCnt.Cnt_all > dm_digtable.FAHighThresh)
+                               {
+                                       if ((dm_digtable.backoff_val -6) < dm_digtable.BackoffVal_range_min)
+                                               dm_digtable.backoff_val = dm_digtable.BackoffVal_range_min;
+                                       else
+                                               dm_digtable.backoff_val -= 6;
+                               }
+                               else if (priv->FalseAlmCnt.Cnt_all < dm_digtable.FALowThresh)
+                               {
+                                       if ((dm_digtable.backoff_val+6) > dm_digtable.BackoffVal_range_max)
+                                               dm_digtable.backoff_val = dm_digtable.BackoffVal_range_max;
+                                       else
+                                               dm_digtable.backoff_val +=6;
+                               }
+                       }
+                       else
+                               dm_digtable.backoff_val =DM_DIG_BACKOFF;
+
+                       if ((dm_digtable.rssi_val+10-dm_digtable.backoff_val) > dm_digtable.rx_gain_range_max)
+                               dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_max;
+                       else if ((dm_digtable.rssi_val+10-dm_digtable.backoff_val) < dm_digtable.rx_gain_range_min)
+                               dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_min;
+                       else
+                               dm_digtable.cur_ig_value = dm_digtable.rssi_val+10-dm_digtable.backoff_val;
+
+                       if (priv->FalseAlmCnt.Cnt_all > 10000)
+                               dm_digtable.cur_ig_value = (dm_digtable.cur_ig_value>0x33)?dm_digtable.cur_ig_value:0x33;
+
+                       if (priv->FalseAlmCnt.Cnt_all > 16000)
+                               dm_digtable.cur_ig_value = dm_digtable.rx_gain_range_max;
+
+               }
+               else
+               {
+                       return;
+               }
+       }
+       else
+       {
+               dm_digtable.Dig_Ext_Port_Stage = DIG_EXT_PORT_STAGE_MAX;
+               priv->rtllib->SetFwCmdHandler(dev, FW_CMD_DIG_ENABLE);
+
+               dm_digtable.backoff_val = DM_DIG_BACKOFF;
+               dm_digtable.cur_ig_value = priv->DefaultInitialGain[0];
+               dm_digtable.pre_ig_value = 0;
+               return;
+       }
+
+       if (dm_digtable.pre_ig_value != rtl8192_QueryBBReg(dev, rOFDM0_XAAGCCore1, bMaskByte0))
+               force_write = 1;
+
+       if ((dm_digtable.pre_ig_value != dm_digtable.cur_ig_value) || !initialized || force_write)
+       {
+               priv->rtllib->SetFwCmdHandler(dev, FW_CMD_DIG_DISABLE);
+
+               initial_gain = (u8)dm_digtable.cur_ig_value;
+
+               rtl8192_setBBreg(dev, rOFDM0_XAAGCCore1, bMaskByte0, initial_gain);
+               rtl8192_setBBreg(dev, rOFDM0_XBAGCCore1, bMaskByte0, initial_gain);
+               dm_digtable.pre_ig_value = dm_digtable.cur_ig_value;
+               initialized = 1;
+               force_write = 0;
+       }
+
+       RT_TRACE(COMP_DIG, "CurIGValue = 0x%x, pre_ig_value = 0x%x, backoff_val = %d\n",
+                               dm_digtable.cur_ig_value, dm_digtable.pre_ig_value, dm_digtable.backoff_val);
+
+}
+
+static void dm_pd_th(
+       struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u8                               initialized=0, force_write=0;
+       static u32                      reset_cnt = 0;
+
+       if (dm_digtable.dig_algorithm_switch)
+       {
+               initialized = 0;
+               reset_cnt = 0;
+       }
+
+       if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState)
+       {
+               if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT)
+               {
+                       if (dm_digtable.rssi_val >= dm_digtable.rssi_high_power_highthresh)
+                               dm_digtable.curpd_thstate = DIG_PD_AT_HIGH_POWER;
+                       else if ((dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh))
+                               dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
+                       else if ((dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh) &&
+                                       (dm_digtable.rssi_val < dm_digtable.rssi_high_power_lowthresh))
+                               dm_digtable.curpd_thstate = DIG_PD_AT_NORMAL_POWER;
+                       else
+                               dm_digtable.curpd_thstate = dm_digtable.prepd_thstate;
+               }
+               else
+               {
+                       dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
+               }
+       }
+       else
+       {
+               dm_digtable.curpd_thstate = DIG_PD_AT_LOW_POWER;
+       }
+
+       if (priv->reset_count != reset_cnt)
+       {
+               force_write = 1;
+               reset_cnt = priv->reset_count;
+       }
+
+       {
+               if ((dm_digtable.prepd_thstate != dm_digtable.curpd_thstate) ||
+                       (initialized<=3) || force_write)
+               {
+                       if (dm_digtable.curpd_thstate == DIG_PD_AT_LOW_POWER)
+                       {
+                               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+                               {
+                                       #ifdef RTL8190P
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x40);
+                                       #else
+                                               write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x00);
+                                               #endif
+                                       /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x40);
+                                       */
+                               }
+                               else
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                       }
+                       else if (dm_digtable.curpd_thstate == DIG_PD_AT_NORMAL_POWER)
+                       {
+                               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+                               {
+                                       #ifdef RTL8190P
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                                       #else
+                                               write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x20);
+                                               #endif
+                                       /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x42);
+                                       */
+                               }
+                               else
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x44);
+                       }
+                       else if (dm_digtable.curpd_thstate == DIG_PD_AT_HIGH_POWER)
+                       {
+                               if (priv->CurrentChannelBW != HT_CHANNEL_WIDTH_20)
+                               {
+                                       #ifdef RTL8190P
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x41);
+                                       #else
+                                               write_nic_byte(dev, (rOFDM0_XATxAFE+3), 0x10);
+                                               #endif
+                                       /*else if (priv->card_8192 == HARDWARE_TYPE_RTL8190P)
+                                               write_nic_byte(dev, rOFDM0_RxDetector1, 0x41);
+                                       */
+                               }
+                               else
+                                       write_nic_byte(dev, rOFDM0_RxDetector1, 0x43);
+                       }
+                       dm_digtable.prepd_thstate = dm_digtable.curpd_thstate;
+                       if (initialized <= 3)
+                               initialized++;
+                       force_write = 0;
+               }
+       }
+}
+
+static void dm_cs_ratio(
+       struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u8                               initialized=0,force_write=0;
+       static u32                      reset_cnt = 0;
+
+       if (dm_digtable.dig_algorithm_switch)
+       {
+               initialized = 0;
+               reset_cnt = 0;
+       }
+
+       if (dm_digtable.PreSTAConnectState == dm_digtable.CurSTAConnectState)
+       {
+               if (dm_digtable.CurSTAConnectState == DIG_STA_CONNECT)
+               {
+                       if ((dm_digtable.rssi_val <= dm_digtable.rssi_low_thresh))
+                               dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
+                       else if ((dm_digtable.rssi_val >= dm_digtable.rssi_high_thresh) )
+                               dm_digtable.curcs_ratio_state = DIG_CS_RATIO_HIGHER;
+                       else
+                               dm_digtable.curcs_ratio_state = dm_digtable.precs_ratio_state;
+               }
+               else
+               {
+                       dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
+               }
+       }
+       else
+       {
+               dm_digtable.curcs_ratio_state = DIG_CS_RATIO_LOWER;
+       }
+
+       if (priv->reset_count != reset_cnt)
+       {
+               force_write = 1;
+               reset_cnt = priv->reset_count;
+       }
+
+
+       {
+               if ((dm_digtable.precs_ratio_state != dm_digtable.curcs_ratio_state) ||
+                       !initialized || force_write)
+               {
+                       if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_LOWER)
+                       {
+                               write_nic_byte(dev, 0xa0a, 0x08);
+                       }
+                       else if (dm_digtable.curcs_ratio_state == DIG_CS_RATIO_HIGHER)
+                       {
+                               write_nic_byte(dev, 0xa0a, 0xcd);
+                       }
+                       dm_digtable.precs_ratio_state = dm_digtable.curcs_ratio_state;
+                       initialized = 1;
+                       force_write = 0;
+               }
+       }
+}
+
+extern void dm_init_edca_turbo(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->bcurrent_turbo_EDCA = false;
+       priv->rtllib->bis_any_nonbepkts = false;
+       priv->bis_cur_rdlstate = false;
+}
+
+#if 1
+static void dm_check_edca_turbo(
+       struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_HIGH_THROUGHPUT     pHTInfo = priv->rtllib->pHTInfo;
+
+       static unsigned long                    lastTxOkCnt = 0;
+       static unsigned long                    lastRxOkCnt = 0;
+       unsigned long                           curTxOkCnt = 0;
+       unsigned long                           curRxOkCnt = 0;
+
+       if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
+       {
+               goto dm_CheckEdcaTurbo_EXIT;
+       }
+       if (priv->rtllib->state != RTLLIB_LINKED)
+       {
+               goto dm_CheckEdcaTurbo_EXIT;
+       }
+       if (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_DISABLE_EDCA_TURBO)
+       {
+               goto dm_CheckEdcaTurbo_EXIT;
+       }
+
+       {
+               u8* peername[11] = {"unknown", "realtek_90", "realtek_92se","broadcom", "ralink", "atheros", "cisco", "marvell", "92u_softap", "self_softap"};
+               static int wb_tmp = 0;
+               if (wb_tmp == 0){
+                       printk("%s():iot peer is %s, bssid:"MAC_FMT"\n",__func__,peername[pHTInfo->IOTPeer], MAC_ARG(priv->rtllib->current_network.bssid));
+                       wb_tmp = 1;
+               }
+       }
+       if (!priv->rtllib->bis_any_nonbepkts)
+       {
+               curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
+               curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
+               if (pHTInfo->IOTAction & HT_IOT_ACT_EDCA_BIAS_ON_RX)
+               {
+                       if (curTxOkCnt > 4*curRxOkCnt)
+                       {
+                               if (priv->bis_cur_rdlstate || !priv->bcurrent_turbo_EDCA)
+                               {
+                                       write_nic_dword(dev, EDCAPARA_BE, edca_setting_UL[pHTInfo->IOTPeer]);
+                                       priv->bis_cur_rdlstate = false;
+                               }
+                       }
+                       else
+                       {
+                               if (!priv->bis_cur_rdlstate || !priv->bcurrent_turbo_EDCA)
+                               {
+                                       if (priv->rtllib->mode == WIRELESS_MODE_G)
+                                               write_nic_dword(dev, EDCAPARA_BE, edca_setting_DL_GMode[pHTInfo->IOTPeer]);
+                                       else
+                                               write_nic_dword(dev, EDCAPARA_BE, edca_setting_DL[pHTInfo->IOTPeer]);
+                                       priv->bis_cur_rdlstate = true;
+                               }
+                       }
+                       priv->bcurrent_turbo_EDCA = true;
+               }
+               else
+               {
+               if (curRxOkCnt > 4*curTxOkCnt)
+               {
+                       if (!priv->bis_cur_rdlstate || !priv->bcurrent_turbo_EDCA)
+                       {
+                               if (priv->rtllib->mode == WIRELESS_MODE_G)
+                                       write_nic_dword(dev, EDCAPARA_BE, edca_setting_DL_GMode[pHTInfo->IOTPeer]);
+                               else
+                               write_nic_dword(dev, EDCAPARA_BE, edca_setting_DL[pHTInfo->IOTPeer]);
+                               priv->bis_cur_rdlstate = true;
+                       }
+               }
+               else
+               {
+                       if (priv->bis_cur_rdlstate || !priv->bcurrent_turbo_EDCA)
+                       {
+                               write_nic_dword(dev, EDCAPARA_BE, edca_setting_UL[pHTInfo->IOTPeer]);
+                               priv->bis_cur_rdlstate = false;
+                       }
+
+               }
+
+               priv->bcurrent_turbo_EDCA = true;
+       }
+       }
+       else
+       {
+                if (priv->bcurrent_turbo_EDCA)
+               {
+
+                        u8 tmp = AC0_BE;
+                        priv->rtllib->SetHwRegHandler(dev, HW_VAR_AC_PARAM, (u8*)(&tmp) );
+                       priv->bcurrent_turbo_EDCA = false;
+               }
+       }
+
+
+dm_CheckEdcaTurbo_EXIT:
+       priv->rtllib->bis_any_nonbepkts = false;
+       lastTxOkCnt = priv->stats.txbytesunicast;
+       lastRxOkCnt = priv->stats.rxbytesunicast;
+}
+#endif
+
+extern void DM_CTSToSelfSetting(struct net_device * dev,u32 DM_Type, u32 DM_Value)
+{
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
+
+       if (DM_Type == 0)
+       {
+               if (DM_Value > 1)
+                       DM_Value = 1;
+               priv->rtllib->bCTSToSelfEnable = (bool)DM_Value;
+       }
+       else if (DM_Type == 1)
+       {
+               if (DM_Value >= 50)
+                       DM_Value = 50;
+               priv->rtllib->CTSToSelfTH = (u8)DM_Value;
+       }
+}
+
+static void dm_init_ctstoself(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
+
+       priv->rtllib->bCTSToSelfEnable = true;
+       priv->rtllib->CTSToSelfTH = CTSToSelfTHVal;
+}
+
+static void dm_ctstoself(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
+       PRT_HIGH_THROUGHPUT     pHTInfo = priv->rtllib->pHTInfo;
+       static unsigned long                            lastTxOkCnt = 0;
+       static unsigned long                            lastRxOkCnt = 0;
+       unsigned long                                           curTxOkCnt = 0;
+       unsigned long                                           curRxOkCnt = 0;
+
+       if (priv->rtllib->bCTSToSelfEnable != true)
+       {
+               pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
+               return;
+       }
+       if (pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               curTxOkCnt = priv->stats.txbytesunicast - lastTxOkCnt;
+               curRxOkCnt = priv->stats.rxbytesunicast - lastRxOkCnt;
+               if (curRxOkCnt > 4*curTxOkCnt)
+               {
+                       pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
+               }
+               else
+               {
+               #if 1
+                       pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
+               #else
+                       if (priv->undecorated_smoothed_pwdb < priv->rtllib->CTSToSelfTH)
+                       {
+                               pHTInfo->IOTAction &= ~HT_IOT_ACT_FORCED_CTS2SELF;
+                       }
+                       else if (priv->undecorated_smoothed_pwdb >= (priv->rtllib->CTSToSelfTH+5))
+                       {
+                               pHTInfo->IOTAction |= HT_IOT_ACT_FORCED_CTS2SELF;
+                       }
+               #endif
+               }
+
+               lastTxOkCnt = priv->stats.txbytesunicast;
+               lastRxOkCnt = priv->stats.rxbytesunicast;
+       }
+}
+
+
+static void
+dm_Init_WA_Broadcom_IOT(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
+       PRT_HIGH_THROUGHPUT     pHTInfo = priv->rtllib->pHTInfo;
+
+       pHTInfo->bWAIotBroadcom = false;
+       pHTInfo->WAIotTH = WAIotTHVal;
+}
+
+#ifdef RTL8192SE
+static void
+dm_WA_Broadcom_IOT(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)dev);
+       PRT_HIGH_THROUGHPUT     pHTInfo = priv->rtllib->pHTInfo;
+       u8                                      update=0;
+       static enum rtllib_state connectState = RTLLIB_NOLINK;
+
+       if ( (pHTInfo->bWAIotBroadcom != true) ||
+               (priv->rtllib->mode == WIRELESS_MODE_B) ||
+               (pHTInfo->bCurBW40MHz))
+       {
+               if (pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
+               {
+                       pHTInfo->IOTAction &= ~HT_IOT_ACT_WA_IOT_Broadcom;
+                       update = 1;
+                       printk(" dm_WA_Broadcom_IOT(), disable HT_IOT_ACT_WA_IOT_Broadcom\n");
+               }
+               else
+                       return;
+       }
+
+       if (connectState == RTLLIB_LINKED && priv->rtllib->state == RTLLIB_LINKED)
+       {
+               if (pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
+               {
+                       pHTInfo->IOTAction &= ~HT_IOT_ACT_WA_IOT_Broadcom;
+                       update = 1;
+                       pHTInfo->bWAIotBroadcom = false;
+                       printk("dm_WA_Broadcom_IOT(), from connect to disconnected, disable HT_IOT_ACT_WA_IOT_Broadcom\n");
+               }
+       }
+       connectState = priv->rtllib->state;
+
+       if (!update && pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               if (priv->undecorated_smoothed_pwdb < pHTInfo->WAIotTH)
+               {
+                       if (pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
+                       {
+                               pHTInfo->IOTAction &= ~HT_IOT_ACT_WA_IOT_Broadcom;
+                               update = 1;
+                               printk("dm_WA_Broadcom_IOT() ==> WA_IOT enable cck rates\n");
+                       }
+               }
+               else if (priv->undecorated_smoothed_pwdb >= (priv->rtllib->CTSToSelfTH+5))
+               {
+                       if ((pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) == 0)
+                       {
+                               pHTInfo->IOTAction |= HT_IOT_ACT_WA_IOT_Broadcom;
+                               update = 1;
+                               printk("dm_WA_Broadcom_IOT() ==> WA_IOT disable cck rates\n");
+                       }
+               }
+       }
+
+       if (update){
+               if (priv->rtllib->bUseRAMask){
+                       priv->rtllib->UpdateHalRAMaskHandler(
+                                                                               dev,
+                                                                               false,
+                                                                               0,
+                                                                               priv->rtllib->pHTInfo->PeerMimoPs,
+                                                                               priv->rtllib->mode,
+                                                                               priv->rtllib->pHTInfo->bCurTxBW40MHz,
+                                                                               0);
+               }else{
+                       priv->ops->update_ratr_table(dev, priv->rtllib->dot11HTOperationalRateSet, NULL);
+               }
+               priv->rtllib->SetHwRegHandler( dev, HW_VAR_BASIC_RATE, (u8*)(&priv->basic_rate));
+       }
+}
+#endif
+
+static void    dm_check_pbc_gpio(struct net_device *dev)
+{
+#ifdef RTL8192U
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 tmp1byte;
+
+
+       tmp1byte = read_nic_byte(dev,GPI);
+       if (tmp1byte == 0xff)
+       return;
+
+       if (tmp1byte&BIT6 || tmp1byte&BIT0)
+       {
+               RT_TRACE(COMP_IO, "CheckPbcGPIO - PBC is pressed\n");
+               priv->bpbc_pressed = true;
+       }
+#endif
+
+}
+
+#ifdef RTL8192E
+
+extern void    dm_CheckRfCtrlGPIO(void *data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       struct r8192_priv *priv = container_of_dwork_rsl(data,struct r8192_priv,gpio_change_rf_wq);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)data);
+       struct net_device *dev = priv->rtllib->dev;
+#endif
+       u8 tmp1byte;
+       RT_RF_POWER_STATE       eRfPowerStateToSet;
+       bool bActuallySet = false;
+
+       char *argv[3];
+       static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
+       static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL};
+
+       bActuallySet=false;
+
+       if ((priv->up_first_time == 1) || (priv->being_init_adapter))
+       {
+               return;
+       }
+
+       if (priv->bfirst_after_down){
+               priv->bfirst_after_down = 1;
+               return;
+       }
+
+
+
+       {
+               tmp1byte = read_nic_byte(dev,GPI);
+
+               eRfPowerStateToSet = (tmp1byte&BIT1) ?  eRfOn : eRfOff;
+
+               if ( (priv->bHwRadioOff == true) && (eRfPowerStateToSet == eRfOn))
+               {
+                       RT_TRACE(COMP_RF, "gpiochangeRF  - HW Radio ON\n");
+                       printk("gpiochangeRF  - HW Radio ON\n");
+                       priv->bHwRadioOff = false;
+                       bActuallySet = true;
+               }
+               else if ( (priv->bHwRadioOff == false) && (eRfPowerStateToSet == eRfOff))
+               {
+                       RT_TRACE(COMP_RF, "gpiochangeRF  - HW Radio OFF\n");
+                       printk("gpiochangeRF  - HW Radio OFF\n");
+                       priv->bHwRadioOff = true;
+                       bActuallySet = true;
+               }
+
+               if (bActuallySet)
+               {
+                       mdelay(1000);
+                       priv->bHwRfOffAction = 1;
+                       MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW,true);
+                       {
+                               if (priv->bHwRadioOff == true)
+                                       argv[1] = "RFOFF";
+                               else
+                                       argv[1] = "RFON";
+
+                               argv[0] = RadioPowerPath;
+                               argv[2] = NULL;
+                               call_usermodehelper(RadioPowerPath,argv,envp,1);
+                       }
+
+               }
+       }
+
+}
+#elif defined RTL8192SE
+extern void Power_DomainInit92SE(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8                              tmpU1b;
+       u16                             tmpU2b;
+
+
+
+       priv->PwrDomainProtect = true;
+
+       tmpU1b = read_nic_byte(dev, (SYS_CLKR + 1));
+       if (tmpU1b & BIT7)
+       {
+               tmpU1b &= ~(BIT6 | BIT7);
+               if (!HalSetSysClk8192SE(dev, tmpU1b)){
+                       priv->PwrDomainProtect = false;
+                       return;
+       }
+       }
+
+       write_nic_byte(dev, AFE_PLL_CTRL, 0x0);
+       write_nic_byte(dev, LDOA15_CTRL, 0x34);
+
+       tmpU1b = read_nic_byte(dev, SYS_FUNC_EN+1);
+       if (priv->rtllib->RfOffReason & (RF_CHANGE_BY_IPS | RF_CHANGE_BY_HW)) {
+               tmpU1b &= 0xFB;
+       } else {
+               tmpU1b &= 0x73;
+       }
+
+       write_nic_byte(dev, SYS_FUNC_EN+1, tmpU1b);
+       udelay(1000);
+
+       write_nic_byte(dev, CMDR, 0);
+       write_nic_byte(dev, TCR, 0);
+
+       tmpU1b = read_nic_byte(dev, 0x562);
+       tmpU1b |= 0x08;
+       write_nic_byte(dev, 0x562, tmpU1b);
+       tmpU1b &= ~(BIT3);
+       write_nic_byte(dev, 0x562, tmpU1b);
+
+       tmpU1b = read_nic_byte(dev, AFE_XTAL_CTRL);
+       write_nic_byte(dev, AFE_XTAL_CTRL, (tmpU1b|0x01));
+       udelay(1500);
+       tmpU1b = read_nic_byte(dev, AFE_XTAL_CTRL+1);
+       write_nic_byte(dev, AFE_XTAL_CTRL+1, (tmpU1b&0xfb));
+
+
+       tmpU1b = read_nic_byte(dev, AFE_MISC);
+       write_nic_byte(dev, AFE_MISC, (tmpU1b|BIT0));
+       udelay(1000);
+
+       tmpU1b = read_nic_byte(dev, AFE_MISC);
+       write_nic_byte(dev, AFE_MISC, (tmpU1b|0x02));
+       udelay(1000);
+
+       tmpU1b = read_nic_byte(dev, LDOA15_CTRL);
+       write_nic_byte(dev, LDOA15_CTRL, (tmpU1b|BIT0));
+
+       tmpU2b = read_nic_word(dev, SYS_ISO_CTRL);
+       write_nic_word(dev, SYS_ISO_CTRL, (tmpU2b|BIT11));
+
+
+       tmpU2b = read_nic_word(dev, SYS_FUNC_EN);
+       write_nic_word(dev, SYS_FUNC_EN, (tmpU2b |BIT13));
+
+       write_nic_byte(dev, SYS_ISO_CTRL+1, 0x68);
+
+       tmpU1b = read_nic_byte(dev, AFE_PLL_CTRL);
+       write_nic_byte(dev, AFE_PLL_CTRL, (tmpU1b|BIT0|BIT4));
+       tmpU1b = read_nic_byte(dev, AFE_PLL_CTRL+1);
+       write_nic_byte(dev, AFE_PLL_CTRL+1, (tmpU1b|BIT0));
+       udelay(1000);
+
+       write_nic_byte(dev, SYS_ISO_CTRL, 0xA6);
+
+       tmpU2b = read_nic_word(dev, SYS_CLKR);
+       write_nic_word(dev, SYS_CLKR, (tmpU2b|BIT12|BIT11));
+
+       tmpU2b = read_nic_word(dev, SYS_FUNC_EN);
+       write_nic_word(dev, SYS_FUNC_EN, (tmpU2b|BIT11));
+       write_nic_word(dev, SYS_FUNC_EN, (tmpU2b|BIT11|BIT15));
+
+        tmpU2b = read_nic_word(dev, SYS_CLKR);
+       write_nic_word(dev, SYS_CLKR, (tmpU2b&(~BIT2)));
+
+       tmpU1b = read_nic_byte(dev, (SYS_CLKR + 1));
+       tmpU1b = ((tmpU1b | BIT7) & (~BIT6));
+       if (!HalSetSysClk8192SE(dev, tmpU1b))
+       {
+               priv->PwrDomainProtect = false;
+               return;
+       }
+
+       write_nic_word(dev, CMDR, 0x37FC);
+
+       gen_RefreshLedState(dev);
+
+       priv->PwrDomainProtect = false;
+
+}
+
+void   SET_RTL8192SE_RF_HALT(struct net_device *dev)
+{
+       u8              u1bTmp;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->rtllib->RfOffReason == RF_CHANGE_BY_IPS && priv->LedStrategy == SW_LED_MODE8)
+       {
+               SET_RTL8192SE_RF_SLEEP(dev);
+               return;
+       }
+
+       u1bTmp = read_nic_byte(dev, LDOV12D_CTRL);
+       u1bTmp |= BIT0;
+       write_nic_byte(dev, LDOV12D_CTRL, u1bTmp);
+       write_nic_byte(dev, SPS1_CTRL, 0x0);
+       write_nic_byte(dev, TXPAUSE, 0xFF);
+       write_nic_word(dev, CMDR, 0x57FC);
+       udelay(100);
+       write_nic_word(dev, CMDR, 0x77FC);
+       write_nic_byte(dev, PHY_CCA, 0x0);
+       udelay(10);
+       write_nic_word(dev, CMDR, 0x37FC);
+       udelay(10);
+       write_nic_word(dev, CMDR, 0x77FC);
+       udelay(10);
+       write_nic_word(dev, CMDR, 0x57FC);
+       write_nic_word(dev, CMDR, 0x0000);
+       u1bTmp = read_nic_byte(dev, (SYS_CLKR + 1));
+       if (u1bTmp & BIT7)
+       {
+               u1bTmp &= ~(BIT6 | BIT7);
+               if (!HalSetSysClk8192SE(dev, u1bTmp))
+                       return;
+       }
+       if (priv->rtllib->RfOffReason==RF_CHANGE_BY_IPS )
+       {
+               write_nic_byte(dev, 0x03, 0xF9);
+       }
+       else
+       {
+               write_nic_byte(dev, 0x03, 0x71);
+       }
+       write_nic_byte(dev, SYS_CLKR+1, 0x70);
+       write_nic_byte(dev, AFE_PLL_CTRL+1, 0x68);
+       write_nic_byte(dev, AFE_PLL_CTRL, 0x00);
+       write_nic_byte(dev, LDOA15_CTRL, 0x34);
+       write_nic_byte(dev, AFE_XTAL_CTRL, 0x0E);
+
+}
+
+u8 RfOnOffDetect(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8      u1Tmp;
+       u8      retval=eRfOn;
+
+       if (priv->pwrdown)
+       {
+               u1Tmp = read_nic_byte(dev, 0x06);
+               printk("pwrdown, 0x6(BIT6)=%02x\n", u1Tmp);
+               retval = (u1Tmp & BIT6) ? eRfOn: eRfOff;
+       }
+       else
+       {
+#ifdef CONFIG_BT_COEXIST
+               if (pHalData->bt_coexist.BluetoothCoexist)
+               {
+                       if (pHalData->bt_coexist.BT_CoexistType == BT_2Wire)
+                       {
+                               PlatformEFIOWrite1Byte(pAdapter, MAC_PINMUX_CFG, 0xa);
+                               u1Tmp = PlatformEFIORead1Byte(pAdapter, GPIO_IO_SEL);
+                               delay_us(100);
+                               u1Tmp = PlatformEFIORead1Byte(pAdapter, GPIO_IN);
+                               RTPRINT(FPWR, PWRHW, ("GPIO_IN=%02x\n", u1Tmp));
+                               retval = (u1Tmp & HAL_8192S_HW_GPIO_OFF_BIT) ? eRfOn : eRfOff;
+                       }
+                       else if ( (pHalData->bt_coexist.BT_CoexistType == BT_ISSC_3Wire) ||
+                                       (pHalData->bt_coexist.BT_CoexistType == BT_Accel) ||
+                                       (pHalData->bt_coexist.BT_CoexistType == BT_CSR) )
+                       {
+                               u4tmp = PHY_QueryBBReg(pAdapter, 0x87c, bMaskDWord);
+                               if ((u4tmp & BIT17) != 0)
+                               {
+                                       PHY_SetBBReg(pAdapter, 0x87c, bMaskDWord, u4tmp & ~BIT17);
+                                       delay_us(50);
+                                       RTPRINT(FBT, BT_RFPoll, ("BT write 0x87c (~BIT17) = 0x%x\n", u4tmp &~BIT17));
+                               }
+                               u4tmp = PHY_QueryBBReg(pAdapter, 0x8e0, bMaskDWord);
+                               RTPRINT(FBT, BT_RFPoll, ("BT read 0x8e0 (BIT24)= 0x%x\n", u4tmp));
+                               retval = (u4tmp & BIT24) ? eRfOn : eRfOff;
+                               RTPRINT(FBT, BT_RFPoll, ("BT check RF state to %s\n", (retval==eRfOn)? "ON":"OFF"));
+                       }
+               }
+               else
+#endif
+               {
+                       write_nic_byte(dev, MAC_PINMUX_CFG, (GPIOMUX_EN | GPIOSEL_GPIO));
+                       u1Tmp = read_nic_byte(dev, GPIO_IO_SEL);
+
+                       u1Tmp &= HAL_8192S_HW_GPIO_OFF_MASK;
+                       write_nic_byte(dev, GPIO_IO_SEL, u1Tmp);
+
+                       mdelay(10);
+
+                       u1Tmp = read_nic_byte(dev, GPIO_IN);
+                       retval = (u1Tmp & HAL_8192S_HW_GPIO_OFF_BIT) ? eRfOn : eRfOff;
+               }
+       }
+
+       return retval;
+}
+
+extern void dm_CheckRfCtrlGPIO(void *data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       struct r8192_priv *priv = container_of_dwork_rsl(data,struct r8192_priv,gpio_change_rf_wq);
+       struct net_device *dev = priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+
+       RT_RF_POWER_STATE       eRfPowerStateToSet, CurRfState;
+       bool                                    bActuallySet = false;
+       PRT_POWER_SAVE_CONTROL          pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       unsigned long flag = 0;
+       bool                    turnonbypowerdomain = false;
+
+
+#ifdef CONFIG_RTL_RFKILL
+       return;
+#endif
+       if ((priv->up_first_time == 1) || (priv->being_init_adapter))
+       {
+               ;
+               return;
+       }
+
+       if (priv->ResetProgress == RESET_TYPE_SILENT)
+       {
+               RT_TRACE((COMP_INIT | COMP_POWER | COMP_RF), "GPIOChangeRFWorkItemCallBack(): Silent Reseting!!!!!!!\n");
+               return;
+       }
+
+
+       if (pPSC->bSwRfProcessing)
+       {
+               RT_TRACE(COMP_SCAN, "GPIOChangeRFWorkItemCallBack(): Rf is in switching state.\n");
+               return;
+       }
+
+       RT_TRACE(COMP_RF, "GPIOChangeRFWorkItemCallBack() ---------> \n");
+
+       spin_lock_irqsave(&priv->rf_ps_lock,flag);
+       if (priv->RFChangeInProgress) {
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+               RT_TRACE(COMP_RF, "GPIOChangeRFWorkItemCallBack(): RF Change in progress! \n");
+               return;
+       } else {
+               priv->RFChangeInProgress = true;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+       }
+       CurRfState = priv->rtllib->eRFPowerState;
+#ifdef CONFIG_ASPM_OR_D3
+       if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM))
+       {
+               RT_DISABLE_ASPM(dev);
+               RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
+       }
+       else if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_PCI_D3) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3))
+       {
+#ifdef TODO
+               RT_LEAVE_D3(dev, false);
+               RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3);
+#endif
+       }
+
+#endif
+       if (RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC))
+       {
+               Power_DomainInit92SE(dev);
+               turnonbypowerdomain = true;
+       }
+
+       eRfPowerStateToSet = RfOnOffDetect(dev);
+       if (priv->bResetInProgress) {
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               priv->RFChangeInProgress = false;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+               return;
+       }
+
+       if ( (priv->bHwRadioOff == true) && \
+          (((eRfPowerStateToSet == eRfOn)&&(priv->sw_radio_on == true))
+#ifdef CONFIG_RTLWIFI_DEBUGFS
+           ||priv->debug->hw_holding
+#endif
+           ))
+       {
+               RT_TRACE(COMP_RF, "GPIOChangeRF  - HW Radio ON, RF ON\n");
+               printk("GPIOChangeRF  - HW Radio ON, RF ON\n");
+                eRfPowerStateToSet = eRfOn;
+               bActuallySet = true;
+       } else if ((priv->bHwRadioOff == false) &&
+                ((eRfPowerStateToSet == eRfOff) || (priv->sw_radio_on == false)))
+       {
+               RT_TRACE(COMP_RF, "GPIOChangeRF  - HW Radio OFF\n");
+               printk("GPIOChangeRF  - HW Radio OFF\n");
+                eRfPowerStateToSet = eRfOff;
+               bActuallySet = true;
+       }
+
+       if (bActuallySet) {
+               priv->bHwRfOffAction = 1;
+#ifdef CONFIG_ASPM_OR_D3
+               if (eRfPowerStateToSet == eRfOn)
+               {
+                       if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM))
+                       {
+                               RT_DISABLE_ASPM(dev);
+                               RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
+                       }
+#ifdef TODO
+                       else if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_PCI_D3) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3))
+                       {
+                               RT_LEAVE_D3(dev, false);
+                               RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3);
+                       }
+#endif
+               }
+#endif
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               priv->RFChangeInProgress = false;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+               MgntActSet_RF_State(dev, eRfPowerStateToSet, RF_CHANGE_BY_HW,true);
+
+               {
+#ifdef CONFIG_CFG_80211
+                       struct wireless_dev *wdev = &priv->rtllib->wdev;
+                       wiphy_rfkill_set_hw_state(wdev->wiphy, priv->bHwRadioOff);
+#else
+                       char *argv[3];
+                       static char *RadioPowerPath = "/etc/acpi/events/RadioPower.sh";
+                       static char *envp[] = {"HOME=/", "TERM=linux", "PATH=/usr/bin:/bin", NULL};
+
+                       if (priv->bHwRadioOff == true)
+                               argv[1] = "RFOFF";
+                       else
+                               argv[1] = "RFON";
+
+                       argv[0] = RadioPowerPath;
+                       argv[2] = NULL;
+                       call_usermodehelper(RadioPowerPath,argv,envp,1);
+
+#endif
+               }
+
+               if (eRfPowerStateToSet == eRfOff)
+               {
+                       if (priv->pwrdown){
+
+                               write_nic_byte(dev, SYS_FUNC_EN+1, 0x31);
+                       }
+#ifdef CONFIG_ASPM_OR_D3
+                       if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM)
+                       {
+                               RT_ENABLE_ASPM(dev);
+                               RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
+                       }
+#ifdef TODO
+                       else if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_PCI_D3)
+                       {
+                               RT_ENTER_D3(dev, false);
+                               RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3);
+                       }
+#endif
+#endif
+               }
+       }
+       else if (eRfPowerStateToSet == eRfOff || CurRfState == eRfOff || priv->bDriverIsGoingToUnload)
+       {
+
+               if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_HALT_NIC && turnonbypowerdomain)
+               {
+                       PHY_SetRtl8192seRfHalt(dev);
+                       RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_HALT_NIC);
+               }
+#ifdef CONFIG_ASPM_OR_D3
+               if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM)
+               {
+                       RT_ENABLE_ASPM(dev);
+                       RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
+               }
+#ifdef TODO
+               else if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_PCI_D3)
+               {
+                       RT_ENTER_D3(dev, false);
+                       RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3);
+               }
+#endif
+#endif
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               priv->RFChangeInProgress = false;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+       }
+       else
+       {
+               spin_lock_irqsave(&priv->rf_ps_lock,flag);
+               priv->RFChangeInProgress = false;
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flag);
+       }
+       RT_TRACE(COMP_RF, "GPIOChangeRFWorkItemCallBack() <--------- \n");
+}
+#endif
+void   dm_rf_pathcheck_workitemcallback(void *data)
+{
+#if (LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20))
+       struct r8192_priv *priv = container_of_dwork_rsl(data,struct r8192_priv,rfpath_check_wq);
+       struct net_device *dev =priv->rtllib->dev;
+#else
+       struct net_device *dev = (struct net_device *)data;
+       struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+       u8 rfpath = 0, i;
+
+
+       rfpath = read_nic_byte(dev, 0xc04);
+
+       for (i = 0; i < RF90_PATH_MAX; i++)
+       {
+               if (rfpath & (0x01<<i))
+                       priv->brfpath_rxenable[i] = 1;
+               else
+                       priv->brfpath_rxenable[i] = 0;
+       }
+       if (!DM_RxPathSelTable.Enable)
+               return;
+
+       dm_rxpath_sel_byrssi(dev);
+}
+
+static void dm_init_rxpath_selection(struct net_device * dev)
+{
+       u8 i;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       DM_RxPathSelTable.Enable = 1;
+       DM_RxPathSelTable.SS_TH_low = RxPathSelection_SS_TH_low;
+       DM_RxPathSelTable.diff_TH = RxPathSelection_diff_TH;
+       if (priv->CustomerID == RT_CID_819x_Netcore)
+               DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
+       else
+               DM_RxPathSelTable.cck_method = CCK_Rx_Version_1;
+       DM_RxPathSelTable.DbgMode = DM_DBG_OFF;
+       DM_RxPathSelTable.disabledRF = 0;
+       for (i=0; i<4; i++)
+       {
+               DM_RxPathSelTable.rf_rssi[i] = 50;
+               DM_RxPathSelTable.cck_pwdb_sta[i] = -64;
+               DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
+       }
+}
+
+static void dm_rxpath_sel_byrssi(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8                              i, max_rssi_index=0, min_rssi_index=0, sec_rssi_index=0, rf_num=0;
+       u8                              tmp_max_rssi=0, tmp_min_rssi=0, tmp_sec_rssi=0;
+       u8                              cck_default_Rx=0x2;
+       u8                              cck_optional_Rx=0x3;
+       long                            tmp_cck_max_pwdb=0, tmp_cck_min_pwdb=0, tmp_cck_sec_pwdb=0;
+       u8                              cck_rx_ver2_max_index=0, cck_rx_ver2_min_index=0, cck_rx_ver2_sec_index=0;
+       u8                              cur_rf_rssi;
+       long                            cur_cck_pwdb;
+       static u8                       disabled_rf_cnt=0, cck_Rx_Path_initialized=0;
+       u8                              update_cck_rx_path;
+
+       if (priv->rf_type != RF_2T4R)
+               return;
+
+       if (!cck_Rx_Path_initialized)
+       {
+               DM_RxPathSelTable.cck_Rx_path = (read_nic_byte(dev, 0xa07)&0xf);
+               cck_Rx_Path_initialized = 1;
+       }
+
+       DM_RxPathSelTable.disabledRF = 0xf;
+       DM_RxPathSelTable.disabledRF &=~ (read_nic_byte(dev, 0xc04));
+
+       if (priv->rtllib->mode == WIRELESS_MODE_B)
+       {
+               DM_RxPathSelTable.cck_method = CCK_Rx_Version_2;
+       }
+
+       for (i=0; i<RF90_PATH_MAX; i++)
+       {
+               if (!DM_RxPathSelTable.DbgMode)
+                       DM_RxPathSelTable.rf_rssi[i] = priv->stats.rx_rssi_percentage[i];
+
+               if (priv->brfpath_rxenable[i])
+               {
+                       rf_num++;
+                       cur_rf_rssi = DM_RxPathSelTable.rf_rssi[i];
+
+                       if (rf_num == 1)
+                       {
+                               max_rssi_index = min_rssi_index = sec_rssi_index = i;
+                               tmp_max_rssi = tmp_min_rssi = tmp_sec_rssi = cur_rf_rssi;
+                       }
+                       else if (rf_num == 2)
+                       {
+                               if (cur_rf_rssi >= tmp_max_rssi)
+                               {
+                                       tmp_max_rssi = cur_rf_rssi;
+                                       max_rssi_index = i;
+                               }
+                               else
+                               {
+                                       tmp_sec_rssi = tmp_min_rssi = cur_rf_rssi;
+                                       sec_rssi_index = min_rssi_index = i;
+                               }
+                       }
+                       else
+                       {
+                               if (cur_rf_rssi > tmp_max_rssi)
+                               {
+                                       tmp_sec_rssi = tmp_max_rssi;
+                                       sec_rssi_index = max_rssi_index;
+                                       tmp_max_rssi = cur_rf_rssi;
+                                       max_rssi_index = i;
+                               }
+                               else if (cur_rf_rssi == tmp_max_rssi)
+                               {
+                                       tmp_sec_rssi = cur_rf_rssi;
+                                       sec_rssi_index = i;
+                               }
+                               else if ((cur_rf_rssi < tmp_max_rssi) &&(cur_rf_rssi > tmp_sec_rssi))
+                               {
+                                       tmp_sec_rssi = cur_rf_rssi;
+                                       sec_rssi_index = i;
+                               }
+                               else if (cur_rf_rssi == tmp_sec_rssi)
+                               {
+                                       if (tmp_sec_rssi == tmp_min_rssi)
+                                       {
+                                               tmp_sec_rssi = cur_rf_rssi;
+                                               sec_rssi_index = i;
+                                       }
+                                       else
+                                       {
+                                       }
+                               }
+                               else if ((cur_rf_rssi < tmp_sec_rssi) && (cur_rf_rssi > tmp_min_rssi))
+                               {
+                               }
+                               else if (cur_rf_rssi == tmp_min_rssi)
+                               {
+                                       if (tmp_sec_rssi == tmp_min_rssi)
+                                       {
+                                               tmp_min_rssi = cur_rf_rssi;
+                                               min_rssi_index = i;
+                                       }
+                                       else
+                                       {
+                                       }
+                               }
+                               else if (cur_rf_rssi < tmp_min_rssi)
+                               {
+                                       tmp_min_rssi = cur_rf_rssi;
+                                       min_rssi_index = i;
+                               }
+                       }
+               }
+       }
+
+       rf_num = 0;
+       if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2)
+       {
+               for (i=0; i<RF90_PATH_MAX; i++)
+               {
+                       if (priv->brfpath_rxenable[i])
+                       {
+                               rf_num++;
+                               cur_cck_pwdb =  DM_RxPathSelTable.cck_pwdb_sta[i];
+
+                               if (rf_num == 1)
+                               {
+                                       cck_rx_ver2_max_index = cck_rx_ver2_min_index = cck_rx_ver2_sec_index = i;
+                                       tmp_cck_max_pwdb = tmp_cck_min_pwdb = tmp_cck_sec_pwdb = cur_cck_pwdb;
+                               }
+                               else if (rf_num == 2)
+                               {
+                                       if (cur_cck_pwdb >= tmp_cck_max_pwdb)
+                                       {
+                                               tmp_cck_max_pwdb = cur_cck_pwdb;
+                                               cck_rx_ver2_max_index = i;
+                                       }
+                                       else
+                                       {
+                                               tmp_cck_sec_pwdb = tmp_cck_min_pwdb = cur_cck_pwdb;
+                                               cck_rx_ver2_sec_index = cck_rx_ver2_min_index = i;
+                                       }
+                               }
+                               else
+                               {
+                                       if (cur_cck_pwdb > tmp_cck_max_pwdb)
+                                       {
+                                               tmp_cck_sec_pwdb = tmp_cck_max_pwdb;
+                                               cck_rx_ver2_sec_index = cck_rx_ver2_max_index;
+                                               tmp_cck_max_pwdb = cur_cck_pwdb;
+                                               cck_rx_ver2_max_index = i;
+                                       }
+                                       else if (cur_cck_pwdb == tmp_cck_max_pwdb)
+                                       {
+                                               tmp_cck_sec_pwdb = cur_cck_pwdb;
+                                               cck_rx_ver2_sec_index = i;
+                                       }
+                                       else if ((cur_cck_pwdb < tmp_cck_max_pwdb) &&(cur_cck_pwdb > tmp_cck_sec_pwdb))
+                                       {
+                                               tmp_cck_sec_pwdb = cur_cck_pwdb;
+                                               cck_rx_ver2_sec_index = i;
+                                       }
+                                       else if (cur_cck_pwdb == tmp_cck_sec_pwdb)
+                                       {
+                                               if (tmp_cck_sec_pwdb == tmp_cck_min_pwdb)
+                                               {
+                                                       tmp_cck_sec_pwdb = cur_cck_pwdb;
+                                                       cck_rx_ver2_sec_index = i;
+                                               }
+                                               else
+                                               {
+                                               }
+                                       }
+                                       else if ((cur_cck_pwdb < tmp_cck_sec_pwdb) && (cur_cck_pwdb > tmp_cck_min_pwdb))
+                                       {
+                                       }
+                                       else if (cur_cck_pwdb == tmp_cck_min_pwdb)
+                                       {
+                                               if (tmp_cck_sec_pwdb == tmp_cck_min_pwdb)
+                                               {
+                                                       tmp_cck_min_pwdb = cur_cck_pwdb;
+                                                       cck_rx_ver2_min_index = i;
+                                               }
+                                               else
+                                               {
+                                               }
+                                       }
+                                       else if (cur_cck_pwdb < tmp_cck_min_pwdb)
+                                       {
+                                               tmp_cck_min_pwdb = cur_cck_pwdb;
+                                               cck_rx_ver2_min_index = i;
+                                       }
+                               }
+
+                       }
+               }
+       }
+
+
+       update_cck_rx_path = 0;
+       if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_2)
+       {
+               cck_default_Rx = cck_rx_ver2_max_index;
+               cck_optional_Rx = cck_rx_ver2_sec_index;
+               if (tmp_cck_max_pwdb != -64)
+                       update_cck_rx_path = 1;
+       }
+
+       if (tmp_min_rssi < DM_RxPathSelTable.SS_TH_low && disabled_rf_cnt < 2)
+       {
+               if ((tmp_max_rssi - tmp_min_rssi) >= DM_RxPathSelTable.diff_TH)
+               {
+                       DM_RxPathSelTable.rf_enable_rssi_th[min_rssi_index] = tmp_max_rssi+5;
+                       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x1<<min_rssi_index, 0x0);
+                       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x1<<min_rssi_index, 0x0);
+                       disabled_rf_cnt++;
+               }
+               if (DM_RxPathSelTable.cck_method == CCK_Rx_Version_1)
+               {
+                       cck_default_Rx = max_rssi_index;
+                       cck_optional_Rx = sec_rssi_index;
+                       if (tmp_max_rssi)
+                               update_cck_rx_path = 1;
+               }
+       }
+
+       if (update_cck_rx_path)
+       {
+               DM_RxPathSelTable.cck_Rx_path = (cck_default_Rx<<2)|(cck_optional_Rx);
+               rtl8192_setBBreg(dev, rCCK0_AFESetting, 0x0f000000, DM_RxPathSelTable.cck_Rx_path);
+       }
+
+       if (DM_RxPathSelTable.disabledRF)
+       {
+               for (i=0; i<4; i++)
+               {
+                       if ((DM_RxPathSelTable.disabledRF>>i) & 0x1)
+                       {
+                               if (tmp_max_rssi >= DM_RxPathSelTable.rf_enable_rssi_th[i])
+                               {
+                                       rtl8192_setBBreg(dev, rOFDM0_TRxPathEnable, 0x1<<i, 0x1);
+                                       rtl8192_setBBreg(dev, rOFDM1_TRxPathEnable, 0x1<<i, 0x1);
+                                       DM_RxPathSelTable.rf_enable_rssi_th[i] = 100;
+                                       disabled_rf_cnt--;
+                               }
+                       }
+               }
+       }
+}
+
+static void    dm_check_rx_path_selection(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       queue_delayed_work_rsl(priv->priv_wq,&priv->rfpath_check_wq,0);
+}
+
+
+static void dm_init_fsync (struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->rtllib->fsync_time_interval = 500;
+       priv->rtllib->fsync_rate_bitmap = 0x0f000800;
+       priv->rtllib->fsync_rssi_threshold = 30;
+#ifdef RTL8190P
+       priv->rtllib->bfsync_enable = true;
+#elif defined RTL8192E || defined RTL8192SE
+       priv->rtllib->bfsync_enable = false;
+#endif
+       priv->rtllib->fsync_multiple_timeinterval = 3;
+       priv->rtllib->fsync_firstdiff_ratethreshold= 100;
+       priv->rtllib->fsync_seconddiff_ratethreshold= 200;
+       priv->rtllib->fsync_state = Default_Fsync;
+
+#ifdef RTL8192SE
+       priv->framesyncMonitor = 0;
+#elif defined RTL8192E || defined RTL8190P
+       priv->framesyncMonitor = 1;
+#endif
+
+       init_timer(&priv->fsync_timer);
+       setup_timer(&priv->fsync_timer, dm_fsync_timer_callback,(unsigned long) dev);
+}
+
+
+static void dm_deInit_fsync(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       del_timer_sync(&priv->fsync_timer);
+}
+
+extern void dm_fsync_timer_callback(unsigned long data)
+{
+       struct net_device *dev = (struct net_device *)data;
+       struct r8192_priv *priv = rtllib_priv((struct net_device *)data);
+       u32 rate_index, rate_count = 0, rate_count_diff=0;
+       bool            bSwitchFromCountDiff = false;
+       bool            bDoubleTimeInterval = false;
+
+       if (    priv->rtllib->state == RTLLIB_LINKED &&
+               priv->rtllib->bfsync_enable &&
+               (priv->rtllib->pHTInfo->IOTAction & HT_IOT_ACT_CDD_FSYNC))
+       {
+               u32 rate_bitmap;
+               for (rate_index = 0; rate_index <= 27; rate_index++)
+               {
+                       rate_bitmap  = 1 << rate_index;
+                       if (priv->rtllib->fsync_rate_bitmap &  rate_bitmap)
+                               rate_count+= priv->stats.received_rate_histogram[1][rate_index];
+               }
+
+               if (rate_count < priv->rate_record)
+                       rate_count_diff = 0xffffffff - rate_count + priv->rate_record;
+               else
+                       rate_count_diff = rate_count - priv->rate_record;
+               if (rate_count_diff < priv->rateCountDiffRecord)
+               {
+
+                       u32 DiffNum = priv->rateCountDiffRecord - rate_count_diff;
+                       if (DiffNum >= priv->rtllib->fsync_seconddiff_ratethreshold)
+                               priv->ContiuneDiffCount++;
+                       else
+                               priv->ContiuneDiffCount = 0;
+
+                       if (priv->ContiuneDiffCount >=2)
+                       {
+                               bSwitchFromCountDiff = true;
+                               priv->ContiuneDiffCount = 0;
+                       }
+               }
+               else
+               {
+                       priv->ContiuneDiffCount = 0;
+               }
+
+               if (rate_count_diff <= priv->rtllib->fsync_firstdiff_ratethreshold)
+               {
+                       bSwitchFromCountDiff = true;
+                       priv->ContiuneDiffCount = 0;
+               }
+               priv->rate_record = rate_count;
+               priv->rateCountDiffRecord = rate_count_diff;
+               RT_TRACE(COMP_HALDM, "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n", priv->rate_record, rate_count, rate_count_diff , priv->bswitch_fsync);
+               if (priv->undecorated_smoothed_pwdb > priv->rtllib->fsync_rssi_threshold && bSwitchFromCountDiff)
+               {
+                       bDoubleTimeInterval = true;
+                       priv->bswitch_fsync = !priv->bswitch_fsync;
+                       if (priv->bswitch_fsync)
+                       {
+                       #ifdef RTL8190P
+                               write_nic_byte(dev,0xC36, 0x00);
+#elif defined RTL8192E
+                               write_nic_byte(dev,0xC36, 0x1c);
+                       #endif
+                               write_nic_byte(dev, 0xC3e, 0x90);
+                       }
+                       else
+                       {
+                       #ifdef RTL8190P
+                               write_nic_byte(dev, 0xC36, 0x40);
+                       #else
+                               write_nic_byte(dev, 0xC36, 0x5c);
+                       #endif
+                               write_nic_byte(dev, 0xC3e, 0x96);
+                       }
+               }
+               else if (priv->undecorated_smoothed_pwdb <= priv->rtllib->fsync_rssi_threshold)
+               {
+                       if (priv->bswitch_fsync)
+                       {
+                               priv->bswitch_fsync  = false;
+                       #ifdef RTL8190P
+                               write_nic_byte(dev, 0xC36, 0x40);
+#elif defined RTL8192E
+                               write_nic_byte(dev, 0xC36, 0x5c);
+                       #endif
+                               write_nic_byte(dev, 0xC3e, 0x96);
+                       }
+               }
+               if (bDoubleTimeInterval){
+                       if (timer_pending(&priv->fsync_timer))
+                               del_timer_sync(&priv->fsync_timer);
+                       priv->fsync_timer.expires = jiffies + MSECS(priv->rtllib->fsync_time_interval*priv->rtllib->fsync_multiple_timeinterval);
+                       add_timer(&priv->fsync_timer);
+               }
+               else{
+                       if (timer_pending(&priv->fsync_timer))
+                               del_timer_sync(&priv->fsync_timer);
+                       priv->fsync_timer.expires = jiffies + MSECS(priv->rtllib->fsync_time_interval);
+                       add_timer(&priv->fsync_timer);
+               }
+       }
+       else
+       {
+               if (priv->bswitch_fsync)
+               {
+                       priv->bswitch_fsync  = false;
+               #ifdef RTL8190P
+                       write_nic_byte(dev, 0xC36, 0x40);
+#elif defined RTL8192E
+                       write_nic_byte(dev, 0xC36, 0x5c);
+               #endif
+                       write_nic_byte(dev, 0xC3e, 0x96);
+               }
+               priv->ContiuneDiffCount = 0;
+       #ifdef RTL8190P
+               write_nic_dword(dev, rOFDM0_RxDetector2, 0x164052cd);
+#elif defined RTL8192E
+               write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c52cd);
+       #endif
+       }
+       RT_TRACE(COMP_HALDM, "ContiuneDiffCount %d\n", priv->ContiuneDiffCount);
+       RT_TRACE(COMP_HALDM, "rateRecord %d rateCount %d, rateCountdiff %d bSwitchFsync %d\n", priv->rate_record, rate_count, rate_count_diff , priv->bswitch_fsync);
+}
+
+static void dm_StartHWFsync(struct net_device *dev)
+{
+#if defined RTL8192E
+       u8 rf_timing = 0x77;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       RT_TRACE(COMP_HALDM, "%s\n", __func__);
+       write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c12cf);
+       priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING, (u8*)(&rf_timing));
+       write_nic_byte(dev, 0xc3b, 0x41);
+#elif defined RTL8192SE
+       write_nic_byte(dev, rOFDM0_RxDetector3, 0x96);
+#endif
+}
+
+static void dm_EndHWFsync(struct net_device *dev)
+{
+#if defined RTL8192E
+       u8 rf_timing = 0xaa;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       RT_TRACE(COMP_HALDM,"%s\n", __func__);
+       write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c52cd);
+       priv->rtllib->SetHwRegHandler(dev, HW_VAR_RF_TIMING, (u8*)(&rf_timing));
+       write_nic_byte(dev, 0xc3b, 0x49);
+#elif defined RTL8192SE
+       write_nic_byte(dev, rOFDM0_RxDetector3, 0x94);
+#endif
+
+}
+
+static void dm_EndSWFsync(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       RT_TRACE(COMP_HALDM, "%s\n", __func__);
+       del_timer_sync(&(priv->fsync_timer));
+
+       if (priv->bswitch_fsync)
+       {
+               priv->bswitch_fsync  = false;
+
+               #ifdef RTL8190P
+                       write_nic_byte(dev, 0xC36, 0x40);
+#elif defined RTL8192E
+               write_nic_byte(dev, 0xC36, 0x5c);
+#endif
+
+               write_nic_byte(dev, 0xC3e, 0x96);
+       }
+
+       priv->ContiuneDiffCount = 0;
+#ifdef RTL8192E
+       write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c52cd);
+#endif
+
+}
+
+static void dm_StartSWFsync(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u32                     rateIndex;
+       u32                     rateBitmap;
+
+       RT_TRACE(COMP_HALDM,"%s\n", __func__);
+       priv->rate_record = 0;
+       priv->ContiuneDiffCount = 0;
+       priv->rateCountDiffRecord = 0;
+       priv->bswitch_fsync  = false;
+
+       if (priv->rtllib->mode == WIRELESS_MODE_N_24G)
+       {
+               priv->rtllib->fsync_firstdiff_ratethreshold= 600;
+               priv->rtllib->fsync_seconddiff_ratethreshold = 0xffff;
+       }
+       else
+       {
+               priv->rtllib->fsync_firstdiff_ratethreshold= 200;
+               priv->rtllib->fsync_seconddiff_ratethreshold = 200;
+       }
+       for (rateIndex = 0; rateIndex <= 27; rateIndex++)
+       {
+               rateBitmap  = 1 << rateIndex;
+               if (priv->rtllib->fsync_rate_bitmap &  rateBitmap)
+                       priv->rate_record += priv->stats.received_rate_histogram[1][rateIndex];
+       }
+       if (timer_pending(&priv->fsync_timer))
+               del_timer_sync(&priv->fsync_timer);
+       priv->fsync_timer.expires = jiffies + MSECS(priv->rtllib->fsync_time_interval);
+       add_timer(&priv->fsync_timer);
+
+#ifdef RTL8192E
+       write_nic_dword(dev, rOFDM0_RxDetector2, 0x465c12cd);
+#endif
+
+}
+
+void dm_check_fsync(struct net_device *dev)
+{
+#define        RegC38_Default                          0
+#define        RegC38_NonFsync_Other_AP        1
+#define        RegC38_Fsync_AP_BCM             2
+       struct r8192_priv *priv = rtllib_priv(dev);
+       static u8               reg_c38_State=RegC38_Default;
+       static u32      reset_cnt=0;
+
+       RT_TRACE(COMP_HALDM, "RSSI %d TimeInterval %d MultipleTimeInterval %d\n", priv->rtllib->fsync_rssi_threshold, priv->rtllib->fsync_time_interval, priv->rtllib->fsync_multiple_timeinterval);
+       RT_TRACE(COMP_HALDM, "RateBitmap 0x%x FirstDiffRateThreshold %d SecondDiffRateThreshold %d\n", priv->rtllib->fsync_rate_bitmap, priv->rtllib->fsync_firstdiff_ratethreshold, priv->rtllib->fsync_seconddiff_ratethreshold);
+
+       if (    priv->rtllib->state == RTLLIB_LINKED &&
+               priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_BROADCOM)
+       {
+               if (priv->rtllib->bfsync_enable == 0)
+               {
+                       switch (priv->rtllib->fsync_state)
+                       {
+                               case Default_Fsync:
+                                       dm_StartHWFsync(dev);
+                                       priv->rtllib->fsync_state = HW_Fsync;
+                                       break;
+                               case SW_Fsync:
+                                       dm_EndSWFsync(dev);
+                                       dm_StartHWFsync(dev);
+                                       priv->rtllib->fsync_state = HW_Fsync;
+                                       break;
+                               case HW_Fsync:
+                               default:
+                                       break;
+                       }
+               }
+               else
+               {
+                       switch (priv->rtllib->fsync_state)
+                       {
+                               case Default_Fsync:
+                                       dm_StartSWFsync(dev);
+                                       priv->rtllib->fsync_state = SW_Fsync;
+                                       break;
+                               case HW_Fsync:
+                                       dm_EndHWFsync(dev);
+                                       dm_StartSWFsync(dev);
+                                       priv->rtllib->fsync_state = SW_Fsync;
+                                       break;
+                               case SW_Fsync:
+                               default:
+                                       break;
+
+                       }
+               }
+               if (priv->framesyncMonitor)
+               {
+                       if (reg_c38_State != RegC38_Fsync_AP_BCM)
+                       {
+                               #ifdef RTL8190P
+                                       write_nic_byte(dev, rOFDM0_RxDetector3, 0x15);
+                               #else
+                                       write_nic_byte(dev, rOFDM0_RxDetector3, 0x95);
+                               #endif
+
+                               reg_c38_State = RegC38_Fsync_AP_BCM;
+                       }
+               }
+       } else {
+               switch (priv->rtllib->fsync_state) {
+               case HW_Fsync:
+                       dm_EndHWFsync(dev);
+                       priv->rtllib->fsync_state = Default_Fsync;
+                       break;
+               case SW_Fsync:
+                       dm_EndSWFsync(dev);
+                       priv->rtllib->fsync_state = Default_Fsync;
+                       break;
+               case Default_Fsync:
+               default:
+                       break;
+               }
+
+               if (priv->framesyncMonitor) {
+                       if (priv->rtllib->state == RTLLIB_LINKED) {
+                               if (priv->undecorated_smoothed_pwdb <= RegC38_TH) {
+                                       if (reg_c38_State != RegC38_NonFsync_Other_AP) {
+#ifdef RTL8190P
+                                                       write_nic_byte(dev, rOFDM0_RxDetector3, 0x10);
+#else
+                                                       write_nic_byte(dev, rOFDM0_RxDetector3, 0x90);
+#endif
+
+                                               reg_c38_State = RegC38_NonFsync_Other_AP;
+                                       }
+                               } else if (priv->undecorated_smoothed_pwdb >= (RegC38_TH+5)) {
+                                       if (reg_c38_State) {
+                                               write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
+                                               reg_c38_State = RegC38_Default;
+                                       }
+                               }
+                       } else {
+                               if (reg_c38_State) {
+                                       write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
+                                       reg_c38_State = RegC38_Default;
+                               }
+                       }
+               }
+       }
+       if (priv->framesyncMonitor) {
+               if (priv->reset_count != reset_cnt) {
+                       write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
+                       reg_c38_State = RegC38_Default;
+                       reset_cnt = priv->reset_count;
+               }
+       } else {
+               if (reg_c38_State) {
+                       write_nic_byte(dev, rOFDM0_RxDetector3, priv->framesync);
+                       reg_c38_State = RegC38_Default;
+               }
+       }
+}
+
+extern void dm_shadow_init(struct net_device *dev)
+{
+       u8      page;
+       u16     offset;
+
+       for (page = 0; page < 5; page++)
+               for (offset = 0; offset < 256; offset++)
+                       dm_shadow[page][offset] = read_nic_byte(dev, offset+page*256);
+
+       for (page = 8; page < 11; page++)
+               for (offset = 0; offset < 256; offset++)
+                       dm_shadow[page][offset] = read_nic_byte(dev, offset+page*256);
+
+       for (page = 12; page < 15; page++)
+               for (offset = 0; offset < 256; offset++)
+                       dm_shadow[page][offset] = read_nic_byte(dev, offset+page*256);
+
+}
+
+/*---------------------------Define function prototype------------------------*/
+static void dm_init_dynamic_txpower(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       priv->rtllib->bdynamic_txpower_enable = true;
+       priv->bLastDTPFlag_High = false;
+       priv->bLastDTPFlag_Low = false;
+       priv->bDynamicTxHighPower = false;
+       priv->bDynamicTxLowPower = false;
+}
+
+static void dm_dynamic_txpower(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       unsigned int txhipower_threshhold=0;
+        unsigned int txlowpower_threshold=0;
+       if (priv->rtllib->bdynamic_txpower_enable != true)
+       {
+               priv->bDynamicTxHighPower = false;
+               priv->bDynamicTxLowPower = false;
+               return;
+       }
+        if ((priv->rtllib->pHTInfo->IOTPeer == HT_IOT_PEER_ATHEROS) && (priv->rtllib->mode == IEEE_G)){
+               txhipower_threshhold = TX_POWER_ATHEROAP_THRESH_HIGH;
+               txlowpower_threshold = TX_POWER_ATHEROAP_THRESH_LOW;
+       }
+       else
+       {
+               txhipower_threshhold = TX_POWER_NEAR_FIELD_THRESH_HIGH;
+               txlowpower_threshold = TX_POWER_NEAR_FIELD_THRESH_LOW;
+       }
+
+
+       RT_TRACE(COMP_TXAGC,"priv->undecorated_smoothed_pwdb = %ld \n" , priv->undecorated_smoothed_pwdb);
+
+       if (priv->rtllib->state == RTLLIB_LINKED)
+       {
+               if (priv->undecorated_smoothed_pwdb >= txhipower_threshhold)
+               {
+                       priv->bDynamicTxHighPower = true;
+                       priv->bDynamicTxLowPower = false;
+               }
+               else
+               {
+                       if (priv->undecorated_smoothed_pwdb < txlowpower_threshold && priv->bDynamicTxHighPower == true)
+                       {
+                               priv->bDynamicTxHighPower = false;
+                       }
+                       if (priv->undecorated_smoothed_pwdb < 35)
+                       {
+                               priv->bDynamicTxLowPower = true;
+                       }
+                       else if (priv->undecorated_smoothed_pwdb >= 40)
+                       {
+                               priv->bDynamicTxLowPower = false;
+                       }
+               }
+       }
+       else
+       {
+               priv->bDynamicTxHighPower = false;
+               priv->bDynamicTxLowPower = false;
+       }
+
+       if ( (priv->bDynamicTxHighPower != priv->bLastDTPFlag_High ) ||
+               (priv->bDynamicTxLowPower != priv->bLastDTPFlag_Low ) )
+       {
+               RT_TRACE(COMP_TXAGC,"SetTxPowerLevel8190()  channel = %d \n" , priv->rtllib->current_network.channel);
+
+               rtl8192_phy_setTxPower(dev,priv->rtllib->current_network.channel);
+       }
+       priv->bLastDTPFlag_High = priv->bDynamicTxHighPower;
+       priv->bLastDTPFlag_Low = priv->bDynamicTxLowPower;
+
+}
+
+static void dm_check_txrateandretrycount(struct net_device * dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       ieee->softmac_stats.CurrentShowTxate = read_nic_byte(dev, Current_Tx_Rate_Reg);
+
+       ieee->softmac_stats.last_packet_rate = read_nic_byte(dev ,Initial_Tx_Rate_Reg);
+
+       ieee->softmac_stats.txretrycount = read_nic_dword(dev, Tx_Retry_Count_Reg);
+}
+
+static void dm_send_rssi_tofw(struct net_device *dev)
+{
+       DCMD_TXCMD_T                    tx_cmd;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       write_nic_byte(dev, DRIVER_RSSI, (u8)priv->undecorated_smoothed_pwdb);
+       return;
+       tx_cmd.Op               = TXCMD_SET_RX_RSSI;
+       tx_cmd.Length   = 4;
+       tx_cmd.Value            = priv->undecorated_smoothed_pwdb;
+
+       cmpk_message_handle_tx(dev, (u8*)&tx_cmd,
+                                                               DESC_PACKET_TYPE_INIT, sizeof(DCMD_TXCMD_T));
+}
+
+#if defined RTL8192SE
+/*-----------------------------------------------------------------------------
+ * Function:   dm_RefreshRateAdaptiveMask()
+ *
+ * Overview:   Update rate table mask according to rssi
+ *
+ * Input:              NONE
+ *
+ * Output:             NONE
+ *
+ * Return:             NONE
+ *
+ * Revised History:
+ *     When            Who             Remark
+ *     05/27/2009      hpfan   Create Version 0.
+ *
+ *---------------------------------------------------------------------------*/
+static void dm_RefreshRateAdaptiveMask(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       prate_adaptive  pRA = (prate_adaptive)&priv->rate_adaptive;
+       u32     LowRSSIThreshForRA = 0, HighRSSIThreshForRA = 0;
+       u8      rssi_level;
+
+       if (IS_NIC_DOWN(priv)){
+               RT_TRACE(COMP_RATE,"<---- dm_RefreshRateAdaptiveMask(): driver is going to unload\n");
+               return;
+       }
+
+       if (!priv->rtllib->bUseRAMask){
+               return;
+       }
+
+       if (priv->pFirmware->FirmwareVersion >= 61 && !priv->bInformFWDriverControlDM){
+               RT_TRACE(COMP_RATE, "<---- dm_RefreshRateAdaptiveMask(): inform fw driver control dm\n");
+               priv->rtllib->SetFwCmdHandler(dev, FW_CMD_CTRL_DM_BY_DRIVER);
+               priv->bInformFWDriverControlDM = true;
+       }
+
+       if ((priv->rtllib->state == RTLLIB_LINKED &&
+           (priv->rtllib->iw_mode == IW_MODE_INFRA))) {
+
+               switch (pRA->PreRATRState){
+               case DM_RATR_STA_HIGH:
+                       HighRSSIThreshForRA = 50;
+                       LowRSSIThreshForRA = 20;
+                       break;
+               case DM_RATR_STA_MIDDLE:
+                       HighRSSIThreshForRA = 55;
+                       LowRSSIThreshForRA = 20;
+                       break;
+               case DM_RATR_STA_LOW:
+                       HighRSSIThreshForRA = 50;
+                       LowRSSIThreshForRA = 25;
+                       break;
+               default:
+                       HighRSSIThreshForRA = 50;
+                       LowRSSIThreshForRA = 20;
+                       break;
+               }
+
+               if (priv->undecorated_smoothed_pwdb > (long)HighRSSIThreshForRA) {
+                       pRA->ratr_state = DM_RATR_STA_HIGH;
+                       rssi_level = 1;
+               } else if (priv->undecorated_smoothed_pwdb > (long)LowRSSIThreshForRA) {
+                       pRA->ratr_state = DM_RATR_STA_MIDDLE;
+                       rssi_level = 2;
+               } else {
+                       pRA->ratr_state = DM_RATR_STA_LOW;
+                       rssi_level = 3;
+               }
+               if ((pRA->PreRATRState != pRA->ratr_state) ||
+                   ((pRA->PreRATRState == pRA->ratr_state) &&
+                   (rssi_level != priv->rssi_level))) {
+                       RT_TRACE(COMP_RATE, "Target AP addr : "MAC_FMT"\n",
+                                MAC_ARG(priv->rtllib->current_network.bssid));
+                       RT_TRACE(COMP_RATE, "RSSI = %ld\n",
+                                priv->undecorated_smoothed_pwdb);
+                       RT_TRACE(COMP_RATE, "RSSI_LEVEL = %d\n", rssi_level);
+                       RT_TRACE(COMP_RATE, "PreState = %d, CurState = %d\n",
+                                pRA->PreRATRState, pRA->ratr_state);
+                       priv->rtllib->UpdateHalRAMaskHandler(dev, false, 0,
+                                        priv->rtllib->pHTInfo->PeerMimoPs,
+                                        priv->rtllib->mode,
+                                        priv->rtllib->pHTInfo->bCurTxBW40MHz,
+                                        rssi_level);
+                       priv->rssi_level = rssi_level;
+                       pRA->PreRATRState = pRA->ratr_state;
+               }
+       }
+       if ((priv->rtllib->state == RTLLIB_LINKED) &&
+           (priv->rtllib->iw_mode == IW_MODE_ADHOC)) {
+               int i;
+               struct sta_info *pEntry;
+
+               for (i = 0; i < PEER_MAX_ASSOC; i++) {
+                       pEntry = priv->rtllib->peer_assoc_list[i];
+                       if (NULL != pEntry) {
+                               pRA = &pEntry->rate_adaptive;
+                               switch (pRA->PreRATRState){
+                               case DM_RATR_STA_HIGH:
+                                       HighRSSIThreshForRA = 50;
+                                       LowRSSIThreshForRA = 20;
+                                       break;
+                               case DM_RATR_STA_MIDDLE:
+                                       HighRSSIThreshForRA = 55;
+                                       LowRSSIThreshForRA = 20;
+                                       break;
+                               case DM_RATR_STA_LOW:
+                                       HighRSSIThreshForRA = 50;
+                                       LowRSSIThreshForRA = 25;
+                                       break;
+                               default:
+                                       HighRSSIThreshForRA = 50;
+                                       LowRSSIThreshForRA = 20;
+                                       break;
+                               }
+
+                               if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > HighRSSIThreshForRA) {
+                                       pRA->ratr_state = DM_RATR_STA_HIGH;
+                                       rssi_level = 1;
+                               } else if (pEntry->rssi_stat.UndecoratedSmoothedPWDB > LowRSSIThreshForRA) {
+                                       pRA->ratr_state = DM_RATR_STA_MIDDLE;
+                                       rssi_level = 2;
+                               } else {
+                                       pRA->ratr_state = DM_RATR_STA_LOW;
+                                       rssi_level = 3;
+                               }
+
+                               if (pRA->PreRATRState != pRA->ratr_state) {
+                                       RT_TRACE(COMP_RATE, "AsocEntry addr : "
+                                                MAC_FMT"\n",
+                                                MAC_ARG(pEntry->macaddr));
+                                       RT_TRACE(COMP_RATE, "RSSI = %ld\n",
+                                                pEntry->rssi_stat.UndecoratedSmoothedPWDB);
+                                       RT_TRACE(COMP_RATE,
+                                                "RSSI_LEVEL = %d\n",
+                                                rssi_level);
+                                       RT_TRACE(COMP_RATE,
+                                                "PreState = %d, CurState = %d\n",
+                                                pRA->PreRATRState,
+                                                pRA->ratr_state);
+                                       priv->rtllib->UpdateHalRAMaskHandler(
+                                                       dev, false,
+                                                       pEntry->aid+1,
+                                                       pEntry->htinfo.MimoPs,
+                                                       pEntry->wireless_mode,
+                                                       pEntry->htinfo.bCurTxBW40MHz,
+                                                       rssi_level);
+                                       pRA->PreRATRState = pRA->ratr_state;
+                               }
+
+                       }
+               }
+       }
+}
+
+void Adhoc_InitRateAdaptive(struct net_device *dev,struct sta_info  *pEntry)
+{
+       prate_adaptive  pRA = (prate_adaptive)&pEntry->rate_adaptive;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       pRA->ratr_state = DM_RATR_STA_MAX;
+       pRA->high2low_rssi_thresh_for_ra = RateAdaptiveTH_High;
+       pRA->low2high_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M+5;
+       pRA->low2high_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M+5;
+
+       pRA->high_rssi_thresh_for_ra = RateAdaptiveTH_High+5;
+       pRA->low_rssi_thresh_for_ra20M = RateAdaptiveTH_Low_20M;
+       pRA->low_rssi_thresh_for_ra40M = RateAdaptiveTH_Low_40M;
+
+       if (priv->rf_type == RF_2T4R) {
+               /* 2008/01/11 MH Modify 2T RATR table for different RSSI. */
+               pRA->upper_rssi_threshold_ratr          =       0x8f0f0000;
+               pRA->middle_rssi_threshold_ratr         =       0x8d0ff000;
+               pRA->low_rssi_threshold_ratr            =       0x8f0ff003;
+               pRA->low_rssi_threshold_ratr_40M        =       0x8f0ff007;
+               pRA->low_rssi_threshold_ratr_20M        =       0x8f0ff003;
+       }
+       else if (priv->rf_type == RF_1T2R)
+       {
+               pRA->upper_rssi_threshold_ratr          =       0x000f0000;
+               pRA->middle_rssi_threshold_ratr         =       0x000ff000;
+               pRA->low_rssi_threshold_ratr            =       0x000ff003;
+               pRA->low_rssi_threshold_ratr_40M        =       0x000ff007;
+               pRA->low_rssi_threshold_ratr_20M        =       0x000ff003;
+       }
+
+}
+
+
+void Adhoc_InitRateAdaptiveState(struct net_device *dev,struct sta_info  *pEntry)
+{
+       prate_adaptive  pRA = (prate_adaptive)&pEntry->rate_adaptive;
+
+       pRA->ratr_state = DM_RATR_STA_MAX;
+       pRA->PreRATRState = DM_RATR_STA_MAX;
+}
+
+
+#endif
+/*---------------------------Define function prototype------------------------*/
diff --git a/drivers/staging/rtl8192e/rtl_dm.h b/drivers/staging/rtl8192e/rtl_dm.h
new file mode 100644 (file)
index 0000000..1af0dc3
--- /dev/null
@@ -0,0 +1,331 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#ifndef        __R8192UDM_H__
+#define __R8192UDM_H__
+
+
+/*--------------------------Define Parameters-------------------------------*/
+#define                        OFDM_Table_Length       19
+#define                CCK_Table_length        12
+
+#define                DM_DIG_THRESH_HIGH                                      40
+#define                DM_DIG_THRESH_LOW                                       35
+
+#define                DM_FALSEALARM_THRESH_LOW        40
+#define                DM_FALSEALARM_THRESH_HIGH       1000
+
+#define                DM_DIG_HIGH_PWR_THRESH_HIGH             75
+#define                DM_DIG_HIGH_PWR_THRESH_LOW              70
+
+#define                BW_AUTO_SWITCH_HIGH_LOW                 25
+#define                BW_AUTO_SWITCH_LOW_HIGH                 30
+
+#define                DM_check_fsync_time_interval                            500
+
+
+#define                DM_DIG_BACKOFF                          12
+#ifdef RTL8192SE
+#define                DM_DIG_MAX                                      0x3e
+#elif defined RTL8190P || defined RTL8192E
+#define                DM_DIG_MAX                                      0x36
+#endif
+#define                DM_DIG_MIN                                      0x1c
+#define                DM_DIG_MIN_Netcore                      0x12
+
+#define                DM_DIG_BACKOFF_MAX                      12
+#define                DM_DIG_BACKOFF_MIN                      -4
+
+#define                RxPathSelection_SS_TH_low               30
+#define                RxPathSelection_diff_TH                 18
+
+#define                RateAdaptiveTH_High                     50
+#define                RateAdaptiveTH_Low_20M          30
+#define                RateAdaptiveTH_Low_40M          10
+#define                VeryLowRSSI                                     15
+
+#ifdef RTL8192SE
+#define                CTSToSelfTHVal                          30
+#elif defined RTL8190P || defined RTL8192E
+#define                CTSToSelfTHVal                                  35
+#endif
+
+#define                WAIotTHVal                                              25
+
+#define                E_FOR_TX_POWER_TRACK               300
+#define                TX_POWER_NEAR_FIELD_THRESH_HIGH         68
+#define                TX_POWER_NEAR_FIELD_THRESH_LOW          62
+#define         TX_POWER_ATHEROAP_THRESH_HIGH           78
+#define                TX_POWER_ATHEROAP_THRESH_LOW            72
+
+#define                        Current_Tx_Rate_Reg         0x1e0
+#define                        Initial_Tx_Rate_Reg         0x1e1
+#define                        Tx_Retry_Count_Reg         0x1ac
+#define                RegC38_TH                                20
+
+#define                TX_POWER_NEAR_FIELD_THRESH_LVL2 74
+#define                TX_POWER_NEAR_FIELD_THRESH_LVL1 67
+
+#define                TxHighPwrLevel_Normal           0
+#define                TxHighPwrLevel_Level1           1
+#define                TxHighPwrLevel_Level2           2
+
+#define                DM_Type_ByFW                    0
+#define                DM_Type_ByDriver                1
+
+/*--------------------------Define Parameters-------------------------------*/
+
+
+/*------------------------------Define structure----------------------------*/
+typedef struct _dynamic_initial_gain_threshold_
+{
+       u8              dig_enable_flag;
+       u8              dig_algorithm;
+       u8              Dig_TwoPort_Algorithm;
+       u8              Dig_Ext_Port_Stage;
+       u8              dbg_mode;
+       u8              dig_algorithm_switch;
+
+       long            rssi_low_thresh;
+       long            rssi_high_thresh;
+
+       u32             FALowThresh;
+       u32             FAHighThresh;
+
+       long            rssi_high_power_lowthresh;
+       long            rssi_high_power_highthresh;
+
+       u8              dig_state;
+       u8              dig_highpwr_state;
+       u8              CurSTAConnectState;
+       u8              PreSTAConnectState;
+       u8              CurAPConnectState;
+       u8              PreAPConnectState;
+
+       u8              curpd_thstate;
+       u8              prepd_thstate;
+       u8              curcs_ratio_state;
+       u8              precs_ratio_state;
+
+       u32             pre_ig_value;
+       u32             cur_ig_value;
+
+       u8              Backoff_Enable_Flag;
+       u8              backoff_val;
+       char            BackoffVal_range_max;
+       char            BackoffVal_range_min;
+       u8              rx_gain_range_max;
+       u8              rx_gain_range_min;
+       bool            initialgain_lowerbound_state;
+
+       long            rssi_val;
+}dig_t;
+
+typedef enum tag_dynamic_init_gain_state_definition
+{
+       DM_STA_DIG_OFF = 0,
+       DM_STA_DIG_ON,
+       DM_STA_DIG_MAX
+}dm_dig_sta_e;
+
+
+typedef enum tag_dynamic_ratr_state_definition
+{
+       DM_RATR_STA_HIGH = 0,
+       DM_RATR_STA_MIDDLE = 1,
+       DM_RATR_STA_LOW = 2,
+       DM_RATR_STA_MAX
+}dm_ratr_sta_e;
+
+typedef enum tag_dynamic_init_gain_operation_type_definition
+{
+       DIG_TYPE_THRESH_HIGH    = 0,
+       DIG_TYPE_THRESH_LOW     = 1,
+       DIG_TYPE_THRESH_HIGHPWR_HIGH    = 2,
+       DIG_TYPE_THRESH_HIGHPWR_LOW     = 3,
+       DIG_TYPE_DBG_MODE                               = 4,
+       DIG_TYPE_RSSI                                           = 5,
+       DIG_TYPE_ALGORITHM                              = 6,
+       DIG_TYPE_BACKOFF                                        = 7,
+       DIG_TYPE_PWDB_FACTOR                    = 8,
+       DIG_TYPE_RX_GAIN_MIN                            = 9,
+       DIG_TYPE_RX_GAIN_MAX                            = 10,
+       DIG_TYPE_ENABLE                 = 20,
+       DIG_TYPE_DISABLE                = 30,
+       DIG_OP_TYPE_MAX
+}dm_dig_op_e;
+
+typedef enum tag_dig_algorithm_definition
+{
+       DIG_ALGO_BY_FALSE_ALARM = 0,
+       DIG_ALGO_BY_RSSI        = 1,
+       DIG_ALGO_BEFORE_CONNECT_BY_RSSI_AND_ALARM = 2,
+       DIG_ALGO_BY_TOW_PORT = 3,
+       DIG_ALGO_MAX
+}dm_dig_alg_e;
+
+typedef enum tag_DIG_TWO_PORT_ALGO_Definition
+{
+       DIG_TWO_PORT_ALGO_RSSI = 0,
+       DIG_TWO_PORT_ALGO_FALSE_ALARM = 1,
+}DM_DIG_TWO_PORT_ALG_E;
+
+
+typedef enum tag_DIG_EXT_PORT_ALGO_Definition
+{
+       DIG_EXT_PORT_STAGE_0 = 0,
+       DIG_EXT_PORT_STAGE_1 = 1,
+       DIG_EXT_PORT_STAGE_2 = 2,
+       DIG_EXT_PORT_STAGE_3 = 3,
+       DIG_EXT_PORT_STAGE_MAX = 4,
+}DM_DIG_EXT_PORT_ALG_E;
+
+typedef enum tag_dig_dbgmode_definition
+{
+       DIG_DBG_OFF = 0,
+       DIG_DBG_ON = 1,
+       DIG_DBG_MAX
+}dm_dig_dbg_e;
+
+typedef enum tag_dig_connect_definition
+{
+       DIG_STA_DISCONNECT = 0,
+       DIG_STA_CONNECT = 1,
+       DIG_STA_BEFORE_CONNECT = 2,
+       DIG_AP_DISCONNECT = 3,
+       DIG_AP_CONNECT = 4,
+       DIG_AP_ADD_STATION = 5,
+       DIG_CONNECT_MAX
+}dm_dig_connect_e;
+
+typedef enum tag_dig_packetdetection_threshold_definition
+{
+       DIG_PD_AT_LOW_POWER = 0,
+       DIG_PD_AT_NORMAL_POWER = 1,
+       DIG_PD_AT_HIGH_POWER = 2,
+       DIG_PD_MAX
+}dm_dig_pd_th_e;
+
+typedef enum tag_dig_cck_cs_ratio_state_definition
+{
+       DIG_CS_RATIO_LOWER = 0,
+       DIG_CS_RATIO_HIGHER = 1,
+       DIG_CS_MAX
+}dm_dig_cs_ratio_e;
+typedef struct _Dynamic_Rx_Path_Selection_
+{
+       u8              Enable;
+       u8              DbgMode;
+       u8              cck_method;
+       u8              cck_Rx_path;
+
+       u8              SS_TH_low;
+       u8              diff_TH;
+       u8              disabledRF;
+       u8              reserved;
+
+       u8              rf_rssi[4];
+       u8              rf_enable_rssi_th[4];
+       long            cck_pwdb_sta[4];
+}DRxPathSel;
+
+typedef enum tag_CCK_Rx_Path_Method_Definition
+{
+       CCK_Rx_Version_1 = 0,
+       CCK_Rx_Version_2= 1,
+       CCK_Rx_Version_MAX
+}DM_CCK_Rx_Path_Method;
+
+
+typedef enum tag_DM_DbgMode_Definition
+{
+       DM_DBG_OFF = 0,
+       DM_DBG_ON = 1,
+       DM_DBG_MAX
+}DM_DBG_E;
+
+typedef struct tag_Tx_Config_Cmd_Format
+{
+       u32     Op;
+       u32     Length;
+       u32     Value;
+}DCMD_TXCMD_T, *PDCMD_TXCMD_T;
+/*------------------------------Define structure----------------------------*/
+
+
+/*------------------------Export global variable----------------------------*/
+extern dig_t   dm_digtable;
+extern u8              dm_shadow[16][256];
+extern DRxPathSel      DM_RxPathSelTable;
+
+extern u8                      test_flag;
+/*------------------------Export global variable----------------------------*/
+
+
+/*------------------------Export Marco Definition---------------------------*/
+#define DM_APInitGainChangeNotify(Event) {dm_digtable.CurAPConnectState = Event;}
+/*------------------------Export Marco Definition---------------------------*/
+
+
+/*--------------------------Exported Function prototype---------------------*/
+/*--------------------------Exported Function prototype---------------------*/
+extern  void    init_hal_dm(struct net_device *dev);
+extern  void deinit_hal_dm(struct net_device *dev);
+
+extern void hal_dm_watchdog(struct net_device *dev);
+
+
+extern  void    init_rate_adaptive(struct net_device *dev);
+extern  void    dm_txpower_trackingcallback(void *data);
+
+#ifndef RTL8192SE
+extern  void dm_cck_txpower_adjust(struct net_device *dev,bool  binch14);
+#endif
+
+extern  void    dm_restore_dynamic_mechanism_state(struct net_device *dev);
+extern  void    dm_backup_dynamic_mechanism_state(struct net_device *dev);
+extern  void    dm_change_dynamic_initgain_thresh(struct net_device *dev,
+                                                                u32             dm_type,
+                                                                u32             dm_value);
+extern  void    DM_ChangeFsyncSetting(struct net_device *dev,
+                                                                                                s32             DM_Type,
+                                                                                                s32             DM_Value);
+extern  void dm_force_tx_fw_info(struct net_device *dev,
+                                                                                u32             force_type,
+                                                                                u32             force_value);
+extern  void    dm_init_edca_turbo(struct net_device *dev);
+extern  void    dm_rf_operation_test_callback(unsigned long data);
+extern  void    dm_rf_pathcheck_workitemcallback(void *data);
+extern  void dm_fsync_timer_callback(unsigned long data);
+extern  void dm_check_fsync(struct net_device *dev);
+extern  void    dm_shadow_init(struct net_device *dev);
+extern  void dm_initialize_txpower_tracking(struct net_device *dev);
+
+#if (defined RTL8192E || defined RTL8192SE)
+extern  void    dm_CheckRfCtrlGPIO(void *data);
+#endif
+
+#ifdef RTL8192SE
+extern void Power_DomainInit92SE(struct net_device *dev);
+#endif
+
+extern void dm_InitRateAdaptiveMask(struct net_device * dev);
+
+#endif /*__R8192UDM_H__ */
+
+/* End of r8192U_dm.h */
diff --git a/drivers/staging/rtl8192e/rtl_eeprom.c b/drivers/staging/rtl8192e/rtl_eeprom.c
new file mode 100644 (file)
index 0000000..14a8c1d
--- /dev/null
@@ -0,0 +1,141 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+#include "rtl_core.h"
+#include "rtl_eeprom.h"
+
+void eprom_cs(struct net_device *dev, short bit)
+{
+       if (bit)
+               write_nic_byte(dev, EPROM_CMD,
+                              (1<<EPROM_CS_SHIFT) | \
+                              read_nic_byte(dev, EPROM_CMD));
+       else
+               write_nic_byte(dev, EPROM_CMD, read_nic_byte(dev, EPROM_CMD)\
+                              &~(1<<EPROM_CS_SHIFT));
+
+       udelay(EPROM_DELAY);
+}
+
+
+void eprom_ck_cycle(struct net_device *dev)
+{
+       write_nic_byte(dev, EPROM_CMD,
+                      (1<<EPROM_CK_SHIFT) | read_nic_byte(dev,EPROM_CMD));
+       udelay(EPROM_DELAY);
+       write_nic_byte(dev, EPROM_CMD,
+                      read_nic_byte(dev, EPROM_CMD) &~ (1<<EPROM_CK_SHIFT));
+       udelay(EPROM_DELAY);
+}
+
+
+void eprom_w(struct net_device *dev,short bit)
+{
+       if (bit)
+               write_nic_byte(dev, EPROM_CMD, (1<<EPROM_W_SHIFT) | \
+                              read_nic_byte(dev,EPROM_CMD));
+       else
+               write_nic_byte(dev, EPROM_CMD, read_nic_byte(dev,EPROM_CMD)\
+                              &~(1<<EPROM_W_SHIFT));
+
+       udelay(EPROM_DELAY);
+}
+
+
+short eprom_r(struct net_device *dev)
+{
+       short bit;
+
+       bit=(read_nic_byte(dev, EPROM_CMD) & (1<<EPROM_R_SHIFT) );
+       udelay(EPROM_DELAY);
+
+       if (bit)
+               return 1;
+       return 0;
+}
+
+
+void eprom_send_bits_string(struct net_device *dev, short b[], int len)
+{
+       int i;
+
+       for (i=0; i<len; i++){
+               eprom_w(dev, b[i]);
+               eprom_ck_cycle(dev);
+       }
+}
+
+
+u32 eprom_read(struct net_device *dev, u32 addr)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       short read_cmd[]={1,1,0};
+       short addr_str[8];
+       int i;
+       int addr_len;
+       u32 ret;
+
+       ret=0;
+       write_nic_byte(dev, EPROM_CMD,
+                      (EPROM_CMD_PROGRAM<<EPROM_CMD_OPERATING_MODE_SHIFT));
+       udelay(EPROM_DELAY);
+
+       if (priv->epromtype==EEPROM_93C56){
+               addr_str[7]=addr & 1;
+               addr_str[6]=addr & (1<<1);
+               addr_str[5]=addr & (1<<2);
+               addr_str[4]=addr & (1<<3);
+               addr_str[3]=addr & (1<<4);
+               addr_str[2]=addr & (1<<5);
+               addr_str[1]=addr & (1<<6);
+               addr_str[0]=addr & (1<<7);
+               addr_len=8;
+       }else{
+               addr_str[5]=addr & 1;
+               addr_str[4]=addr & (1<<1);
+               addr_str[3]=addr & (1<<2);
+               addr_str[2]=addr & (1<<3);
+               addr_str[1]=addr & (1<<4);
+               addr_str[0]=addr & (1<<5);
+               addr_len=6;
+       }
+       eprom_cs(dev, 1);
+       eprom_ck_cycle(dev);
+       eprom_send_bits_string(dev, read_cmd, 3);
+       eprom_send_bits_string(dev, addr_str, addr_len);
+
+       eprom_w(dev, 0);
+
+       for (i = 0; i < 16; i++){
+               eprom_ck_cycle(dev);
+               ret |= (eprom_r(dev)<<(15-i));
+       }
+
+       eprom_cs(dev, 0);
+       eprom_ck_cycle(dev);
+
+       write_nic_byte(dev, EPROM_CMD,
+                      (EPROM_CMD_NORMAL<<EPROM_CMD_OPERATING_MODE_SHIFT));
+       return ret;
+}
diff --git a/drivers/staging/rtl8192e/rtl_eeprom.h b/drivers/staging/rtl8192e/rtl_eeprom.h
new file mode 100644 (file)
index 0000000..f765efb
--- /dev/null
@@ -0,0 +1,29 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+
+#define EPROM_DELAY 10
+
+u32 eprom_read(struct net_device *dev,u32 addr);
diff --git a/drivers/staging/rtl8192e/rtl_ethtool.c b/drivers/staging/rtl8192e/rtl_ethtool.c
new file mode 100644 (file)
index 0000000..6c732e1
--- /dev/null
@@ -0,0 +1,59 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+ *****************************************************************************
+ */
+#include <linux/netdevice.h>
+#include <linux/ethtool.h>
+#include <linux/delay.h>
+
+#include "rtl_core.h"
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+static void rtl819x_ethtool_get_drvinfo(struct net_device *dev,
+               struct ethtool_drvinfo *info)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       strcpy(info->driver, DRV_NAME);
+       strcpy(info->version, DRV_VERSION);
+#if defined RTL8192SE
+       snprintf(info->fw_version, sizeof(info->fw_version), "%d",
+                       priv->pFirmware->FirmwareVersion);
+#endif
+       strcpy(info->bus_info, pci_name(priv->pdev));
+}
+
+static u32 rtl819x_ethtool_get_link(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       return ((priv->rtllib->state == RTLLIB_LINKED) ||
+               (priv->rtllib->state == RTLLIB_LINKED_SCANNING));
+}
+
+const struct ethtool_ops rtl819x_ethtool_ops = {
+       .get_drvinfo = rtl819x_ethtool_get_drvinfo,
+       .get_link = rtl819x_ethtool_get_link,
+};
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_pci.c b/drivers/staging/rtl8192e/rtl_pci.c
new file mode 100644 (file)
index 0000000..39b96c1
--- /dev/null
@@ -0,0 +1,444 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+ *****************************************************************************/
+#include "rtl_pci.h"
+#include "rtl_core.h"
+
+#if defined RTL8192CE || defined RTL8192SE
+bool
+rtl8192_get_LinkControl_field(
+       struct net_device *dev,
+       u8                      BusNum,
+       u8                      DevNum,
+       u8                      FuncNum
+       )
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       RT_PCI_CAPABILITIES_HEADER              CapabilityHdr;
+       unsigned char   CapabilityOffset, Num4Bytes;
+       u32                     PciCfgAddrPort=0;
+       u8                      LinkCtrlReg;
+       bool                    Status = false;
+
+       if ( BusNum == 0xff && DevNum == 0xff && FuncNum == 0xff ){
+               printk("GetLinkControlField(): Fail to find PCIe Capability\n");
+               return false;
+       }
+
+
+       PciCfgAddrPort= (BusNum<< 16)|(DevNum << 11)|(FuncNum <<  8)|(1 << 31);
+
+
+       Num4Bytes = 0x34/4;
+       NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+( Num4Bytes<< 2));
+       NdisRawReadPortUchar(PCI_CONF_DATA, &CapabilityOffset);
+
+
+       while (CapabilityOffset != 0)
+       {
+               Num4Bytes = CapabilityOffset/4;
+
+
+               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+( Num4Bytes<< 2));
+               NdisRawReadPortUshort(PCI_CONF_DATA, (u16*)&CapabilityHdr);
+
+               if (CapabilityHdr.CapabilityID == PCI_CAPABILITY_ID_PCI_EXPRESS)
+               {
+                       break;
+               }
+               else
+               {
+                       CapabilityOffset = CapabilityHdr.Next;
+               }
+       }
+
+
+       if (CapabilityHdr.CapabilityID == PCI_CAPABILITY_ID_PCI_EXPRESS)
+       {
+               Num4Bytes = (CapabilityOffset+0x10)/4;
+
+               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
+               NdisRawReadPortUchar(PCI_CONF_DATA, &LinkCtrlReg);
+
+               priv->NdisAdapter.PciBridgePCIeHdrOffset = CapabilityOffset;
+               priv->NdisAdapter.PciBridgeLinkCtrlReg = LinkCtrlReg;
+
+               Status = true;
+       }
+       else
+       {
+               printk("GetLinkControlField(): Cannot Find PCIe Capability\n");
+       }
+
+       return Status;
+}
+
+bool
+rtl8192_get_pci_BusInfo(
+       struct net_device *dev,
+       u16                     VendorId,
+       u16                     DeviceId,
+       u8                      IRQL,
+       u8                      BaseCode,
+       u8                      SubClass,
+       u8                      filed19val,
+       u8*                     BusNum,
+       u8*                     DevNum,
+       u8*                     FuncNum
+       )
+{
+
+       u8                      busNumIdx, deviceNumIdx, functionNumIdx;
+       u32                     PciCfgAddrPort=0;
+       u32                     devVenID = 0, classCode, field19, headertype;
+       u16                     venId, devId;
+       u8                      basec, subc, irqLine;
+       u16                     RegOffset;
+       bool                    bSingleFunc = false;
+       bool                    bBridgeChk = false;
+
+       *BusNum = 0xFF;
+       *DevNum = 0xFF;
+       *FuncNum = 0xFF;
+
+       if ((BaseCode == PCI_CLASS_BRIDGE_DEV) && (SubClass==PCI_SUBCLASS_BR_PCI_TO_PCI) && (filed19val==U1DONTCARE))
+               bBridgeChk = true;
+
+       for (busNumIdx = 0; busNumIdx < PCI_MAX_BRIDGE_NUMBER  ; busNumIdx++)
+       {
+               for (deviceNumIdx = 0; deviceNumIdx < PCI_MAX_DEVICES; deviceNumIdx ++)
+               {
+                       bSingleFunc = false;
+                       for (functionNumIdx = 0; functionNumIdx < PCI_MAX_FUNCTION; functionNumIdx++)
+                       {
+
+                               if (functionNumIdx == 0)
+                               {
+                                       PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31);
+                                       NdisRawWritePortUlong(PCI_CONF_ADDRESS ,  PciCfgAddrPort + (3 << 2));
+                                       NdisRawReadPortUlong(PCI_CONF_DATA, &headertype);
+                                       headertype = ((headertype >> 16) & 0x0080) >> 7;
+                                       if ( headertype == 0)
+                                               bSingleFunc = true;
+                               }
+                               else
+                               {
+                                       if (bSingleFunc == true) break;
+                               }
+
+                               PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31);
+
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort);
+                               NdisRawReadPortUlong(PCI_CONF_DATA, &devVenID);
+
+                               if ( devVenID == 0xFFFFFFFF||devVenID == 0 ) continue;
+
+                               RegOffset = 0x3C;
+                               PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31)|(RegOffset & 0xFFFFFFFC);
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort);
+                               NdisRawReadPortUchar((PCI_CONF_DATA+ (RegOffset & 0x3)), &irqLine);
+
+                               venId = (u16)(devVenID >>  0)& 0xFFFF;
+                               devId = (u16)(devVenID >> 16)& 0xFFFF;
+
+                               if (!bBridgeChk && (venId != VendorId) && (VendorId != U2DONTCARE))
+                                       continue;
+
+                               if (!bBridgeChk && (devId != DeviceId) && (DeviceId != U2DONTCARE))
+                                       continue;
+
+                               if (!bBridgeChk && (irqLine != IRQL) && (IRQL != U1DONTCARE))
+                                       continue;
+
+                               PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31);
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS ,  PciCfgAddrPort + (2 << 2));
+                               NdisRawReadPortUlong(PCI_CONF_DATA, &classCode);
+                               classCode = classCode >> 8;
+
+                               basec = (u8)(classCode >>16 ) & 0xFF;
+                               subc = (u8)(classCode >>8 ) & 0xFF;
+                               if (bBridgeChk && (venId != VendorId) &&(basec == BaseCode) && (subc== SubClass ) )
+                                       return true;
+
+                               if (bBridgeChk && (venId != VendorId) && (VendorId != U2DONTCARE))
+                                       continue;
+
+                               if (bBridgeChk && (devId != DeviceId) && (DeviceId != U2DONTCARE))
+                                       continue;
+
+                               if (bBridgeChk && (irqLine != IRQL) && (IRQL != U1DONTCARE))
+                                       continue;
+
+
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS ,  PciCfgAddrPort + (6 << 2));
+                               NdisRawReadPortUlong(PCI_CONF_DATA, &field19);
+                               field19 = (field19 >> 8)& 0xFF;
+
+                               if ((basec == BaseCode) && (subc== SubClass ) && ((field19 == filed19val) ||(filed19val==U1DONTCARE) ))
+                               {
+                                       *BusNum = busNumIdx;
+                                       *DevNum = deviceNumIdx;
+                                       *FuncNum = functionNumIdx;
+
+                                       printk( "GetPciBusInfo(): Find Device(%X:%X)  bus=%d dev=%d, func=%d\n",VendorId, DeviceId, busNumIdx, deviceNumIdx, functionNumIdx);
+                                       return true;
+                               }
+                       }
+               }
+       }
+
+       printk( "GetPciBusInfo(): Cannot Find Device(%X:%X:%X)\n",VendorId, DeviceId, devVenID);
+       return false;
+}
+
+bool rtl8192_get_pci_BridegInfo(
+       struct net_device *dev,
+       u8                      BaseCode,
+       u8                      SubClass,
+       u8                      filed19val,
+       u8*                     BusNum,
+       u8*                     DevNum,
+       u8*                     FuncNum,
+       u16*            VendorId,
+       u16*            DeviceId
+       )
+
+{
+
+       u8                      busNumIdx, deviceNumIdx, functionNumIdx;
+       u32                     PciCfgAddrPort=0;
+       u32                     devVenID, classCode, field19, headertype;
+       u16                     venId, devId;
+       u8                      basec, subc, irqLine;
+       u16                     RegOffset;
+       bool                    bSingleFunc = false;
+
+       *BusNum = 0xFF;
+       *DevNum = 0xFF;
+       *FuncNum = 0xFF;
+
+       for (busNumIdx = 0; busNumIdx < PCI_MAX_BRIDGE_NUMBER  ; busNumIdx++)
+       {
+               for (deviceNumIdx = 0; deviceNumIdx < PCI_MAX_DEVICES; deviceNumIdx ++)
+               {
+                       bSingleFunc = false;
+                       for (functionNumIdx = 0; functionNumIdx < PCI_MAX_FUNCTION; functionNumIdx++)
+                       {
+
+                               if (functionNumIdx == 0)
+                               {
+                                       PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31);
+                                       NdisRawWritePortUlong(PCI_CONF_ADDRESS ,  PciCfgAddrPort + (3 << 2));
+                                       NdisRawReadPortUlong(PCI_CONF_DATA, &headertype);
+                                       headertype = ((headertype >> 16) & 0x0080) >> 7;
+                                       if ( headertype == 0)
+                                               bSingleFunc = true;
+                               }
+                               else
+                               {
+                                       if ( bSingleFunc ==true ) break;
+                               }
+
+                               PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31);
+
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort);
+                               NdisRawReadPortUlong(PCI_CONF_DATA, &devVenID);
+
+                               RegOffset = 0x3C;
+                               PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31)|(RegOffset & 0xFFFFFFFC);
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort);
+                               NdisRawReadPortUchar((PCI_CONF_DATA+ (RegOffset & 0x3)), &irqLine);
+
+                               venId = (u16)(devVenID >>  0)& 0xFFFF;
+                               devId = (u16)(devVenID >> 16)& 0xFFFF;
+
+                               PciCfgAddrPort= (busNumIdx << 16)|(deviceNumIdx << 11)|(functionNumIdx <<  8)|(1 << 31);
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS ,  PciCfgAddrPort + (2 << 2));
+                               NdisRawReadPortUlong(PCI_CONF_DATA, &classCode);
+                               classCode = classCode >> 8;
+
+                               basec = (u8)(classCode >>16 ) & 0xFF;
+                               subc = (u8)(classCode >>8 ) & 0xFF;
+
+                               NdisRawWritePortUlong(PCI_CONF_ADDRESS ,  PciCfgAddrPort + (6 << 2));
+                               NdisRawReadPortUlong(PCI_CONF_DATA, &field19);
+                               field19 = (field19 >> 8)& 0xFF;
+
+                               if ((basec == BaseCode) && (subc== SubClass ) && ((field19 == filed19val) ||(filed19val==U1DONTCARE) ))
+                               {
+                                       *BusNum = busNumIdx;
+                                       *DevNum = deviceNumIdx;
+                                       *FuncNum = functionNumIdx;
+                                       *VendorId = venId;
+                                       *DeviceId = devId;
+
+                                       printk("GetPciBridegInfo : Find Device(%X:%X)  bus=%d dev=%d, func=%d\n",
+                                               venId, devId, busNumIdx, deviceNumIdx, functionNumIdx);
+
+                                       return true;
+                               }
+                       }
+               }
+       }
+
+       printk( "GetPciBridegInfo(): Cannot Find PciBridge for Device\n");
+
+       return false;
+}
+
+
+static u16 PciBridgeVendorArray[PCI_BRIDGE_VENDOR_MAX]
+       = {INTEL_VENDOR_ID,ATI_VENDOR_ID,AMD_VENDOR_ID,SIS_VENDOR_ID};
+
+void
+rtl8192_pci_find_BridgeInfo(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       u8      PciBridgeBusNum = 0xff;
+       u8      PciBridgeDevNum = 0xff;
+       u8      PciBridgeFuncNum = 0xff;
+       u16     PciBridgeVendorId= 0xff;
+       u16     PciBridgeDeviceId = 0xff;
+       u8      tmp = 0;
+
+       rtl8192_get_pci_BridegInfo(dev,
+               PCI_CLASS_BRIDGE_DEV,
+               PCI_SUBCLASS_BR_PCI_TO_PCI ,
+               priv->NdisAdapter.BusNumber,
+               &PciBridgeBusNum,
+               &PciBridgeDevNum,
+               &PciBridgeFuncNum,
+               &PciBridgeVendorId,
+               &PciBridgeDeviceId);
+
+
+       priv->NdisAdapter.PciBridgeVendor = PCI_BRIDGE_VENDOR_UNKNOWN;
+
+       for (tmp = 0; tmp < PCI_BRIDGE_VENDOR_MAX; tmp++) {
+               if (PciBridgeVendorId == PciBridgeVendorArray[tmp]) {
+                       priv->NdisAdapter.PciBridgeVendor = tmp;
+                       printk("Pci Bridge Vendor is found index: %d\n",tmp);
+                       break;
+               }
+       }
+       printk("Pci Bridge Vendor is %x\n",PciBridgeVendorArray[tmp]);
+
+       priv->NdisAdapter.PciBridgeBusNum = PciBridgeBusNum;
+       priv->NdisAdapter.PciBridgeDevNum = PciBridgeDevNum;
+       priv->NdisAdapter.PciBridgeFuncNum = PciBridgeFuncNum;
+       priv->NdisAdapter.PciBridgeVendorId = PciBridgeVendorId;
+       priv->NdisAdapter.PciBridgeDeviceId = PciBridgeDeviceId;
+
+
+}
+#endif
+
+static void rtl8192_parse_pci_configuration(struct pci_dev *pdev, struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       u8 tmp;
+       int pos;
+       u8 LinkCtrlReg;
+
+       pos = pci_find_capability(priv->pdev, PCI_CAP_ID_EXP);
+       pci_read_config_byte(priv->pdev, pos + PCI_EXP_LNKCTL, &LinkCtrlReg);
+       priv->NdisAdapter.LinkCtrlReg = LinkCtrlReg;
+
+       RT_TRACE(COMP_INIT, "Link Control Register =%x\n", priv->NdisAdapter.LinkCtrlReg);
+
+       pci_read_config_byte(pdev, 0x98, &tmp);
+       tmp |=BIT4;
+       pci_write_config_byte(pdev, 0x98, tmp);
+
+       tmp = 0x17;
+       pci_write_config_byte(pdev, 0x70f, tmp);
+}
+
+bool rtl8192_pci_findadapter(struct pci_dev *pdev, struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       u16 VenderID;
+       u16 DeviceID;
+       u8  RevisionID;
+       u16 IrqLine;
+
+       VenderID = pdev->vendor;
+       DeviceID = pdev->device;
+       RevisionID = pdev->revision;
+       pci_read_config_word(pdev, 0x3C, &IrqLine);
+
+       priv->card_8192 = priv->ops->nic_type;
+
+       if (DeviceID == 0x8172) {
+               switch (RevisionID) {
+               case HAL_HW_PCI_REVISION_ID_8192PCIE:
+                       printk("Adapter(8192 PCI-E) is found - DeviceID=%x\n", DeviceID);
+                       priv->card_8192 = NIC_8192E;
+                       break;
+               case HAL_HW_PCI_REVISION_ID_8192SE:
+                       printk("Adapter(8192SE) is found - DeviceID=%x\n", DeviceID);
+                       priv->card_8192 = NIC_8192SE;
+                       break;
+               default:
+                       printk("UNKNOWN nic type(%4x:%4x)\n", pdev->vendor, pdev->device);
+                       priv->card_8192 = NIC_UNKNOWN;
+                       return false;
+               }
+       }
+
+       if (priv->ops->nic_type != priv->card_8192) {
+               printk("Detect info(%x) and hardware info(%x) not match!\n",
+                               priv->ops->nic_type, priv->card_8192);
+               printk("Please select proper driver before install!!!!\n");
+               return false;
+       }
+
+#if defined RTL8192CE || defined RTL8192SE
+       rtl8192_get_pci_BusInfo(dev,
+               VenderID,
+               DeviceID,
+               (u8)IrqLine,
+               0x02,0x80, U1DONTCARE,
+               &priv->NdisAdapter.BusNumber,
+               &priv->NdisAdapter.DevNumber,
+               &priv->NdisAdapter.FuncNumber);
+
+       rtl8192_pci_find_BridgeInfo(dev);
+
+#ifdef RTL8192SE
+       if (priv->NdisAdapter.PciBridgeVendor != PCI_BRIDGE_VENDOR_UNKNOWN)
+#endif
+       {
+               rtl8192_get_LinkControl_field(dev, priv->NdisAdapter.PciBridgeBusNum,
+                       priv->NdisAdapter.PciBridgeDevNum, priv->NdisAdapter.PciBridgeFuncNum);
+       }
+#endif
+
+       rtl8192_parse_pci_configuration(pdev, dev);
+
+       return true;
+}
diff --git a/drivers/staging/rtl8192e/rtl_pci.h b/drivers/staging/rtl8192e/rtl_pci.h
new file mode 100644 (file)
index 0000000..2266272
--- /dev/null
@@ -0,0 +1,104 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+ ******************************************************************************/
+#ifndef _RTL_PCI_H
+#define _RTL_PCI_H
+
+#include <linux/types.h>
+#include <linux/pci.h>
+#include "rtllib.h"
+
+static inline void NdisRawWritePortUlong(u32 port,  u32 val)
+{
+       outl(val, port);
+}
+
+static inline void NdisRawWritePortUchar(u32 port,  u8 val)
+{
+       outb(val, port);
+}
+
+static inline void NdisRawReadPortUchar(u32 port, u8 *pval)
+{
+       *pval = inb(port);
+}
+
+static inline void NdisRawReadPortUshort(u32 port, u16 *pval)
+{
+       *pval = inw(port);
+}
+
+static inline void NdisRawReadPortUlong(u32 port, u32 *pval)
+{
+       *pval = inl(port);
+}
+
+typedef struct _mp_adapter{
+       u8              LinkCtrlReg;
+
+       u8              BusNumber;
+       u8              DevNumber;
+       u8              FuncNumber;
+
+       u8              PciBridgeBusNum;
+       u8              PciBridgeDevNum;
+       u8              PciBridgeFuncNum;
+       u8              PciBridgeVendor;
+       u16             PciBridgeVendorId;
+       u16             PciBridgeDeviceId;
+       u8              PciBridgePCIeHdrOffset;
+       u8              PciBridgeLinkCtrlReg;
+}mp_adapter,*pmp_adapter;
+
+typedef struct _RT_PCI_CAPABILITIES_HEADER {
+    unsigned char   CapabilityID;
+    unsigned char   Next;
+} RT_PCI_CAPABILITIES_HEADER, *PRT_PCI_CAPABILITIES_HEADER;
+
+#define PCI_MAX_BRIDGE_NUMBER                          255
+#define PCI_MAX_DEVICES                                                32
+#define PCI_MAX_FUNCTION                                       8
+
+#define PCI_CONF_ADDRESS                                       0x0CF8
+#define PCI_CONF_DATA                                          0x0CFC
+
+#define        PCI_CLASS_BRIDGE_DEV                            0x06
+#define        PCI_SUBCLASS_BR_PCI_TO_PCI              0x04
+
+#define        U1DONTCARE                                              0xFF
+#define        U2DONTCARE                                              0xFFFF
+#define        U4DONTCARE                                              0xFFFFFFFF
+
+#define        INTEL_VENDOR_ID                                 0x8086
+#define        SIS_VENDOR_ID                                           0x1039
+#define        ATI_VENDOR_ID                                           0x1002
+#define        ATI_DEVICE_ID                                           0x7914
+#define        AMD_VENDOR_ID                                           0x1022
+
+#define PCI_CAPABILITY_ID_PCI_EXPRESS          0x10
+
+struct net_device;
+bool rtl8192_pci_findadapter(struct pci_dev *pdev, struct net_device *dev);
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_pm.c b/drivers/staging/rtl8192e/rtl_pm.c
new file mode 100644 (file)
index 0000000..4fbe819
--- /dev/null
@@ -0,0 +1,168 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#ifdef CONFIG_PM_RTL
+#include "rtl_core.h"
+#include "r8192E_hw.h"
+#include "r8190P_rtl8256.h"
+#include "rtl_pm.h"
+
+int rtl8192E_save_state (struct pci_dev *dev, pm_message_t state)
+{
+        printk(KERN_NOTICE "r8192E save state call (state %u).\n", state.event);
+       return(-EAGAIN);
+}
+
+
+int rtl8192E_suspend (struct pci_dev *pdev, pm_message_t state)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct r8192_priv *priv = rtllib_priv(dev);
+#if !(defined RTL8192SE || defined RTL8192CE)
+       u32     ulRegRead;
+#endif
+
+        RT_TRACE(COMP_POWER, "============> r8192E suspend call.\n");
+        printk("============> r8192E suspend call.\n");
+#ifdef ENABLE_GPIO_RADIO_CTL
+       del_timer_sync(&priv->gpio_polling_timer);
+       cancel_delayed_work(&priv->gpio_change_rf_wq);
+       priv->polling_timer_on = 0;
+#endif
+
+        if (!netif_running(dev)){
+            printk("RTL819XE:UI is open out of suspend function\n");
+            goto out_pci_suspend;
+        }
+
+#ifdef HAVE_NET_DEVICE_OPS
+       if (dev->netdev_ops->ndo_stop)
+               dev->netdev_ops->ndo_stop(dev);
+#else
+       dev->stop(dev);
+#endif
+       netif_device_detach(dev);
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+       if (!priv->rtllib->bSupportRemoteWakeUp) {
+               MgntActSet_RF_State(dev, eRfOff, RF_CHANGE_BY_INIT,true);
+               ulRegRead = read_nic_dword(dev, CPU_GEN);
+               ulRegRead|=CPU_GEN_SYSTEM_RESET;
+               write_nic_dword(dev, CPU_GEN, ulRegRead);
+       } else {
+               write_nic_dword(dev, WFCRC0, 0xffffffff);
+               write_nic_dword(dev, WFCRC1, 0xffffffff);
+               write_nic_dword(dev, WFCRC2, 0xffffffff);
+#ifdef RTL8190P
+               {
+                       u8      ucRegRead;
+                       ucRegRead = read_nic_byte(dev, GPO);
+                       ucRegRead |= BIT0;
+                       write_nic_byte(dev, GPO, ucRegRead);
+               }
+#endif
+               write_nic_byte(dev, PMR, 0x5);
+               write_nic_byte(dev, MacBlkCtrl, 0xa);
+       }
+#endif
+out_pci_suspend:
+       RT_TRACE(COMP_POWER, "r8192E support WOL call??????????????????????\n");
+       printk("r8192E support WOL call??????????????????????\n");
+       if (priv->rtllib->bSupportRemoteWakeUp) {
+               RT_TRACE(COMP_POWER, "r8192E support WOL call!!!!!!!!!!!!!!!!!!.\n");
+       }
+       pci_save_state(pdev);
+       pci_disable_device(pdev);
+       pci_enable_wake(pdev, pci_choose_state(pdev,state),\
+                       priv->rtllib->bSupportRemoteWakeUp?1:0);
+       pci_set_power_state(pdev,pci_choose_state(pdev,state));
+
+        mdelay(20);
+
+       return 0;
+}
+
+int rtl8192E_resume (struct pci_dev *pdev)
+{
+    struct net_device *dev = pci_get_drvdata(pdev);
+#if defined ENABLE_GPIO_RADIO_CTL || !(defined RTL8192SE || defined RTL8192CE)
+    struct r8192_priv *priv = rtllib_priv(dev);
+#endif
+    int err;
+    u32 val;
+
+    RT_TRACE(COMP_POWER, "================>r8192E resume call.");
+    printk("================>r8192E resume call.\n");
+
+    pci_set_power_state(pdev, PCI_D0);
+
+    err = pci_enable_device(pdev);
+    if (err) {
+        printk(KERN_ERR "%s: pci_enable_device failed on resume\n",
+                dev->name);
+        return err;
+    }
+    pci_restore_state(pdev);
+
+    pci_read_config_dword(pdev, 0x40, &val);
+    if ((val & 0x0000ff00) != 0) {
+        pci_write_config_dword(pdev, 0x40, val & 0xffff00ff);
+    }
+
+    pci_enable_wake(pdev, PCI_D0, 0);
+
+#ifdef ENABLE_GPIO_RADIO_CTL
+    if (priv->polling_timer_on == 0){
+        check_rfctrl_gpio_timer((unsigned long)dev);
+    }
+#endif
+
+    if (!netif_running(dev)){
+        printk("RTL819XE:UI is open out of resume function\n");
+        goto out;
+    }
+
+    netif_device_attach(dev);
+#ifdef HAVE_NET_DEVICE_OPS
+    if (dev->netdev_ops->ndo_open)
+           dev->netdev_ops->ndo_open(dev);
+#else
+    dev->open(dev);
+#endif
+
+#if !(defined RTL8192SE || defined RTL8192CE)
+    if (!priv->rtllib->bSupportRemoteWakeUp) {
+           MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_INIT,true);
+    }
+#endif
+
+out:
+    RT_TRACE(COMP_POWER, "<================r8192E resume call.\n");
+    return 0;
+}
+
+
+int rtl8192E_enable_wake (struct pci_dev *dev, pm_message_t state, int enable)
+{
+        printk(KERN_NOTICE "r8192E enable wake call (state %u, enable %d).\n",
+              state.event, enable);
+       return(-EAGAIN);
+}
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_pm.h b/drivers/staging/rtl8192e/rtl_pm.h
new file mode 100644 (file)
index 0000000..edf8427
--- /dev/null
@@ -0,0 +1,39 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#ifdef CONFIG_PM_RTL
+
+#ifndef R8192E_PM_H
+#define R8192E_PM_H
+
+#include <linux/types.h>
+#include <linux/pci.h>
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+#define pm_message_t u32
+#endif
+
+int rtl8192E_save_state (struct pci_dev *dev, pm_message_t state);
+int rtl8192E_suspend (struct pci_dev *dev, pm_message_t state);
+int rtl8192E_resume (struct pci_dev *dev);
+int rtl8192E_enable_wake (struct pci_dev *dev, pm_message_t state, int enable);
+
+#endif
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_ps.c b/drivers/staging/rtl8192e/rtl_ps.c
new file mode 100644 (file)
index 0000000..cf40135
--- /dev/null
@@ -0,0 +1,649 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+ *****************************************************************************/
+#include "rtl_ps.h"
+#include "rtl_core.h"
+#include "r8192E_phy.h"
+#include "r8192E_phyreg.h"
+#include "r8190P_rtl8256.h" /* RTL8225 Radio frontend */
+#include "r8192E_cmdpkt.h"
+
+void rtl8192_hw_sleep_down(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       unsigned long flags = 0;
+#ifdef CONFIG_ASPM_OR_D3
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+#endif
+       spin_lock_irqsave(&priv->rf_ps_lock,flags);
+       if (priv->RFChangeInProgress) {
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+               RT_TRACE(COMP_DBG, "rtl8192_hw_sleep_down(): RF Change in progress! \n");
+               return;
+       }
+       spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+       RT_TRACE(COMP_DBG, "%s()============>come to sleep down\n", __func__);
+
+#ifdef CONFIG_RTLWIFI_DEBUGFS
+       if (priv->debug->hw_holding) {
+               return;
+       }
+#endif
+       MgntActSet_RF_State(dev, eRfSleep, RF_CHANGE_BY_PS,false);
+#ifdef CONFIG_ASPM_OR_D3
+       if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM)
+       {
+               RT_ENABLE_ASPM(dev);
+               RT_SET_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM);
+       }
+#endif
+}
+
+void rtl8192_hw_sleep_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data,struct rtllib_device,hw_sleep_wq);
+       struct net_device *dev = ieee->dev;
+        rtl8192_hw_sleep_down(dev);
+}
+
+void rtl8192_hw_wakeup(struct net_device* dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       unsigned long flags = 0;
+#ifdef CONFIG_ASPM_OR_D3
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+#endif
+       spin_lock_irqsave(&priv->rf_ps_lock,flags);
+       if (priv->RFChangeInProgress) {
+               spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+               RT_TRACE(COMP_DBG, "rtl8192_hw_wakeup(): RF Change in progress! \n");
+               queue_delayed_work_rsl(priv->rtllib->wq,&priv->rtllib->hw_wakeup_wq,MSECS(10));
+               return;
+       }
+       spin_unlock_irqrestore(&priv->rf_ps_lock,flags);
+#ifdef CONFIG_ASPM_OR_D3
+       if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM) {
+               RT_DISABLE_ASPM(dev);
+               RT_CLEAR_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM);
+       }
+#endif
+       RT_TRACE(COMP_PS, "%s()============>come to wake up\n", __func__);
+       MgntActSet_RF_State(dev, eRfOn, RF_CHANGE_BY_PS,false);
+}
+
+void rtl8192_hw_wakeup_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data,struct rtllib_device,hw_wakeup_wq);
+       struct net_device *dev = ieee->dev;
+       rtl8192_hw_wakeup(dev);
+
+}
+
+#define MIN_SLEEP_TIME 50
+#define MAX_SLEEP_TIME 10000
+void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       u32 rb = jiffies;
+       unsigned long flags;
+
+       spin_lock_irqsave(&priv->ps_lock,flags);
+
+       tl -= MSECS(8+16+7);
+
+       if (((tl>=rb)&& (tl-rb) <= MSECS(MIN_SLEEP_TIME))
+                       ||((rb>tl)&& (rb-tl) < MSECS(MIN_SLEEP_TIME))) {
+               spin_unlock_irqrestore(&priv->ps_lock,flags);
+               printk("too short to sleep::%x, %x, %lx\n",tl, rb,  MSECS(MIN_SLEEP_TIME));
+               return;
+       }
+
+       if (((tl > rb) && ((tl-rb) > MSECS(MAX_SLEEP_TIME)))||
+                       ((tl < rb) && (tl>MSECS(69)) && ((rb-tl) > MSECS(MAX_SLEEP_TIME)))||
+                       ((tl<rb)&&(tl<MSECS(69))&&((tl+0xffffffff-rb)>MSECS(MAX_SLEEP_TIME)))) {
+               printk("========>too long to sleep:%x, %x, %lx\n", tl, rb,  MSECS(MAX_SLEEP_TIME));
+               spin_unlock_irqrestore(&priv->ps_lock,flags);
+               return;
+       }
+       {
+               u32 tmp = (tl>rb)?(tl-rb):(rb-tl);
+               queue_delayed_work_rsl(priv->rtllib->wq,
+                               &priv->rtllib->hw_wakeup_wq,tmp);
+       }
+       queue_delayed_work_rsl(priv->rtllib->wq,
+                       (void *)&priv->rtllib->hw_sleep_wq,0);
+       spin_unlock_irqrestore(&priv->ps_lock,flags);
+}
+
+void InactivePsWorkItemCallback(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+       RT_TRACE(COMP_PS, "InactivePsWorkItemCallback() ---------> \n");
+       pPSC->bSwRfProcessing = true;
+
+       RT_TRACE(COMP_PS, "InactivePsWorkItemCallback(): Set RF to %s.\n", \
+                       pPSC->eInactivePowerState == eRfOff?"OFF":"ON");
+#ifdef CONFIG_ASPM_OR_D3
+       if (pPSC->eInactivePowerState == eRfOn)
+       {
+
+               if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM))
+               {
+                       RT_DISABLE_ASPM(dev);
+                       RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
+               }
+#ifdef TODO
+               else if ((pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_PCI_D3) && RT_IN_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3))
+               {
+                       RT_LEAVE_D3(dev, false);
+                       RT_CLEAR_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3);
+               }
+#endif
+       }
+#endif
+       MgntActSet_RF_State(dev, pPSC->eInactivePowerState, RF_CHANGE_BY_IPS,false);
+
+#ifdef CONFIG_ASPM_OR_D3
+       if (pPSC->eInactivePowerState == eRfOff)
+       {
+               if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_ASPM)
+               {
+                       RT_ENABLE_ASPM(dev);
+                       RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_ASPM);
+               }
+#ifdef TODO
+               else if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_PCI_D3)
+               {
+                       RT_ENTER_D3(dev, false);
+                       RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_PCI_D3);
+               }
+#endif
+       }
+#endif
+
+       pPSC->bSwRfProcessing = false;
+       RT_TRACE(COMP_PS, "InactivePsWorkItemCallback() <--------- \n");
+}
+
+void
+IPSEnter(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL          pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       RT_RF_POWER_STATE                       rtState;
+
+       if (pPSC->bInactivePs)
+       {
+               rtState = priv->rtllib->eRFPowerState;
+               if (rtState == eRfOn && !pPSC->bSwRfProcessing &&\
+                       (priv->rtllib->state != RTLLIB_LINKED)&&\
+                       (priv->rtllib->iw_mode != IW_MODE_MASTER))
+               {
+                       RT_TRACE(COMP_PS,"IPSEnter(): Turn off RF.\n");
+                       pPSC->eInactivePowerState = eRfOff;
+                       priv->isRFOff = true;
+                       priv->bInPowerSaveMode = true;
+                       InactivePsWorkItemCallback(dev);
+               }
+       }
+}
+
+void
+IPSLeave(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       RT_RF_POWER_STATE       rtState;
+
+       if (pPSC->bInactivePs)
+       {
+               rtState = priv->rtllib->eRFPowerState;
+               if (rtState != eRfOn  && !pPSC->bSwRfProcessing && priv->rtllib->RfOffReason <= RF_CHANGE_BY_IPS)
+               {
+                       RT_TRACE(COMP_PS, "IPSLeave(): Turn on RF.\n");
+                       pPSC->eInactivePowerState = eRfOn;
+                       priv->bInPowerSaveMode = false;
+                       InactivePsWorkItemCallback(dev);
+               }
+       }
+}
+void IPSLeave_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_work_rsl(data,struct rtllib_device,ips_leave_wq);
+       struct net_device *dev = ieee->dev;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       down(&priv->rtllib->ips_sem);
+       IPSLeave(dev);
+       up(&priv->rtllib->ips_sem);
+}
+
+void rtllib_ips_leave_wq(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       RT_RF_POWER_STATE       rtState;
+       rtState = priv->rtllib->eRFPowerState;
+
+       if (priv->rtllib->PowerSaveControl.bInactivePs){
+               if (rtState == eRfOff){
+                       if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
+                       {
+                               RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__func__);
+                               return;
+                       }
+                       else{
+                               printk("=========>%s(): IPSLeave\n",__func__);
+                               queue_work_rsl(priv->rtllib->wq,&priv->rtllib->ips_leave_wq);
+                       }
+               }
+       }
+}
+void rtllib_ips_leave(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       down(&priv->rtllib->ips_sem);
+       IPSLeave(dev);
+       up(&priv->rtllib->ips_sem);
+}
+
+bool MgntActSet_802_11_PowerSaveMode(struct net_device *dev,   u8 rtPsMode)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->rtllib->iw_mode == IW_MODE_ADHOC)
+               return false;
+
+       RT_TRACE(COMP_LPS,"%s(): set ieee->ps = %x\n",__func__,rtPsMode);
+       if (!priv->ps_force) {
+               priv->rtllib->ps = rtPsMode;
+       }
+       if (priv->rtllib->sta_sleep != LPS_IS_WAKE && rtPsMode == RTLLIB_PS_DISABLED) {
+                unsigned long flags;
+
+               rtl8192_hw_wakeup(dev);
+               priv->rtllib->sta_sleep = LPS_IS_WAKE;
+
+                spin_lock_irqsave(&(priv->rtllib->mgmt_tx_lock), flags);
+               RT_TRACE(COMP_DBG, "LPS leave: notify AP we are awaked"
+                        " ++++++++++ SendNullFunctionData\n");
+               rtllib_sta_ps_send_null_frame(priv->rtllib, 0);
+                spin_unlock_irqrestore(&(priv->rtllib->mgmt_tx_lock), flags);
+       }
+
+       return true;
+}
+
+
+void LeisurePSEnter(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+       RT_TRACE(COMP_PS, "LeisurePSEnter()...\n");
+       RT_TRACE(COMP_PS, "pPSC->bLeisurePs = %d, ieee->ps = %d,pPSC->LpsIdleCount is %d,RT_CHECK_FOR_HANG_PERIOD is %d\n",
+               pPSC->bLeisurePs, priv->rtllib->ps,pPSC->LpsIdleCount,RT_CHECK_FOR_HANG_PERIOD);
+
+       if (!((priv->rtllib->iw_mode == IW_MODE_INFRA) && (priv->rtllib->state == RTLLIB_LINKED))
+           || (priv->rtllib->iw_mode == IW_MODE_ADHOC) || (priv->rtllib->iw_mode == IW_MODE_MASTER))
+               return;
+
+       if (pPSC->bLeisurePs) {
+               if (pPSC->LpsIdleCount >= RT_CHECK_FOR_HANG_PERIOD) {
+
+                       if (priv->rtllib->ps == RTLLIB_PS_DISABLED) {
+
+                               RT_TRACE(COMP_LPS, "LeisurePSEnter(): Enter 802.11 power save mode...\n");
+
+                               if (!pPSC->bFwCtrlLPS) {
+                                       if (priv->rtllib->SetFwCmdHandler)
+                                               priv->rtllib->SetFwCmdHandler(dev, FW_CMD_LPS_ENTER);
+                               }
+                               MgntActSet_802_11_PowerSaveMode(dev, RTLLIB_PS_MBCAST|RTLLIB_PS_UNICAST);
+                       }
+               } else
+                       pPSC->LpsIdleCount++;
+       }
+}
+
+
+void LeisurePSLeave(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+
+       RT_TRACE(COMP_PS, "LeisurePSLeave()...\n");
+       RT_TRACE(COMP_PS, "pPSC->bLeisurePs = %d, ieee->ps = %d\n",
+               pPSC->bLeisurePs, priv->rtllib->ps);
+
+       if (pPSC->bLeisurePs)
+       {
+               if (priv->rtllib->ps != RTLLIB_PS_DISABLED)
+               {
+#ifdef CONFIG_ASPM_OR_D3
+                       if (pPSC->RegRfPsLevel & RT_RF_LPS_LEVEL_ASPM && RT_IN_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM))
+                       {
+                               RT_DISABLE_ASPM(dev);
+                               RT_CLEAR_PS_LEVEL(pPSC, RT_RF_LPS_LEVEL_ASPM);
+                       }
+#endif
+                       RT_TRACE(COMP_LPS, "LeisurePSLeave(): Busy Traffic , Leave 802.11 power save..\n");
+                       MgntActSet_802_11_PowerSaveMode(dev, RTLLIB_PS_DISABLED);
+
+                       if (!pPSC->bFwCtrlLPS)
+                       {
+                               if (priv->rtllib->SetFwCmdHandler)
+                               {
+                                       priv->rtllib->SetFwCmdHandler(dev, FW_CMD_LPS_LEAVE);
+                               }
+                    }
+               }
+       }
+}
+
+#ifdef CONFIG_ASPM_OR_D3
+
+void
+PlatformDisableHostL0s(struct net_device *dev)
+{
+       struct r8192_priv       *priv = (struct r8192_priv *)rtllib_priv(dev);
+       u32                             PciCfgAddrPort=0;
+       u8                              Num4Bytes;
+       u8                              uPciBridgeASPMSetting = 0;
+
+
+       if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
+               (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
+       {
+               printk("PlatformDisableHostL0s(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
+               return;
+       }
+
+       PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|(priv->NdisAdapter.PciBridgeDevNum<< 11)|(priv->NdisAdapter.PciBridgeFuncNum <<  8)|(1 << 31);
+       Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
+
+
+       NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
+
+       NdisRawReadPortUchar(PCI_CONF_DATA, &uPciBridgeASPMSetting);
+
+       if (uPciBridgeASPMSetting & BIT0)
+               uPciBridgeASPMSetting &=  ~(BIT0);
+
+       NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
+       NdisRawWritePortUchar(PCI_CONF_DATA, uPciBridgeASPMSetting);
+
+       udelay(50);
+
+       printk("PlatformDisableHostL0s():PciBridge BusNumber[%x], DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n",
+               priv->NdisAdapter.PciBridgeBusNum, priv->NdisAdapter.PciBridgeDevNum, priv->NdisAdapter.PciBridgeFuncNum,
+               (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), (priv->NdisAdapter.PciBridgeLinkCtrlReg | (priv->RegDevicePciASPMSetting&~BIT0)));
+}
+
+bool
+PlatformEnable92CEBackDoor(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       bool                    bResult = true;
+       u8                      value;
+
+       if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
+               (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
+       {
+               RT_TRACE(COMP_INIT, "PlatformEnableASPM(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
+               return false;
+       }
+
+       pci_read_config_byte(priv->pdev, 0x70f, &value);
+
+       if (priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_INTEL)
+       {
+       value |= BIT7;
+       }
+       else
+       {
+               value = 0x23;
+       }
+
+       pci_write_config_byte(priv->pdev, 0x70f, value);
+
+
+       pci_read_config_byte(priv->pdev, 0x719, &value);
+       value |= (BIT3|BIT4);
+       pci_write_config_byte(priv->pdev, 0x719, value);
+
+
+       return bResult;
+}
+
+bool PlatformSwitchDevicePciASPM(struct net_device *dev, u8 value)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       bool bResult = false;
+
+       pci_write_config_byte(priv->pdev, 0x80, value);
+
+       return bResult;
+}
+
+bool PlatformSwitchClkReq(struct net_device *dev, u8 value)
+{
+       bool bResult = false;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       u8      Buffer;
+
+       Buffer= value;
+
+#ifdef MERGE_TO_DO
+       if (Adapter->bDriverIsGoingToPnpSetPowerSleep && pDevice->RegSupportLowPowerState
+               && value == 0x0)
+               return false;
+#endif
+
+       pci_write_config_byte(priv->pdev,0x81,value);
+       bResult = true;
+
+#ifdef TODO
+       if (Buffer) {
+               priv->ClkReqState = true;
+       } else {
+               priv->ClkReqState = false;
+       }
+#endif
+
+#ifdef RTL8192SE
+       udelay(100);
+#endif
+
+       return bResult;
+}
+
+void
+PlatformDisableASPM(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+#if 1
+       u32     PciCfgAddrPort=0;
+       u8      Num4Bytes;
+#endif
+       u8      LinkCtrlReg;
+       u16     PciBridgeLinkCtrlReg, ASPMLevel=0;
+
+       if (priv->NdisAdapter.PciBridgeVendor == PCI_BRIDGE_VENDOR_UNKNOWN)
+       {
+               RT_TRACE(COMP_POWER,  "%s(): Disable ASPM. Recognize the Bus of PCI(Bridge) as UNKNOWN.\n",__func__);
+       }
+
+
+       LinkCtrlReg = priv->NdisAdapter.LinkCtrlReg;
+       PciBridgeLinkCtrlReg = priv->NdisAdapter.PciBridgeLinkCtrlReg;
+
+       ASPMLevel |= BIT0|BIT1;
+       LinkCtrlReg &=~ASPMLevel;
+       PciBridgeLinkCtrlReg &=~(BIT0|BIT1);
+
+       if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
+               (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
+       {
+       } else  {
+               PciCfgAddrPort= (priv->NdisAdapter.PciBridgeBusNum << 16)|(priv->NdisAdapter.PciBridgeDevNum<< 11)|(priv->NdisAdapter.PciBridgeFuncNum <<  8)|(1 << 31);
+               Num4Bytes = (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10)/4;
+
+               NdisRawWritePortUlong(PCI_CONF_ADDRESS , PciCfgAddrPort+(Num4Bytes << 2));
+
+               NdisRawWritePortUchar(PCI_CONF_DATA, PciBridgeLinkCtrlReg);
+               RT_TRACE(COMP_POWER, "PlatformDisableASPM():PciBridge BusNumber[%x], DevNumbe[%x], FuncNumber[%x], Write reg[%x] = %x\n",
+                       priv->NdisAdapter.PciBridgeBusNum, priv->NdisAdapter.PciBridgeDevNum, priv->NdisAdapter.PciBridgeFuncNum,
+                       (priv->NdisAdapter.PciBridgePCIeHdrOffset+0x10), PciBridgeLinkCtrlReg);
+
+               udelay(50);
+       }
+}
+
+void PlatformEnableASPM(struct net_device *dev)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       u16     ASPMLevel = 0;
+       u32     PciCfgAddrPort=0;
+       u8      Num4Bytes;
+       u8      uPciBridgeASPMSetting = 0;
+       u8      uDeviceASPMSetting = 0;
+
+
+       if ( (priv->NdisAdapter.BusNumber == 0xff && priv->NdisAdapter.DevNumber == 0xff && priv->NdisAdapter.FuncNumber == 0xff) ||
+               (priv->NdisAdapter.PciBridgeBusNum == 0xff && priv->NdisAdapter.PciBridgeDevNum == 0xff && priv->NdisAdapter.PciBridgeFuncNum == 0xff) )
+       {
+               RT_TRACE(COMP_INIT, "PlatformEnableASPM(): Fail to enable ASPM. Cannot find the Bus of PCI(Bridge).\n");
+               return;
+       }
+
+#ifdef RTL8192SE
+       if (priv->NdisAdapter.PciBridgeVendor != PCI_BRIDGE_VENDOR_INTEL )
+       {
+               RT_TRACE(COMP_POWER, "%s(): Dont modify ASPM for non intel chipset. For Bridge Vendor %d.\n"
+                       ,__func__,priv->NdisAdapter.PciBridgeVendor);
+               return;
+       }
+#endif
+
+       ASPMLevel |= priv->RegDevicePciASPMSetting;
+       uDeviceASPMSetting = priv->NdisAdapter.LinkCtrlReg;
+
+       uDeviceASPMSetting |= ASPMLevel;
+
+       PlatformSwitchDevicePciASPM(dev, uDeviceASPMSetting);
+
+       if (pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) {
+               PlatformSwitchClkReq(dev,(pPSC->RegRfPsLevel & RT_RF_OFF_LEVL_CLK_REQ) ? 1 : 0);
+               RT_SET_PS_LEVEL(pPSC, RT_RF_OFF_LEVL_CLK_REQ);
+       }
+       udelay(100);
+
+       udelay(100);
+}
+
+u32 PlatformResetPciSpace(struct net_device *dev,u8 Value)
+{
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+
+       pci_write_config_byte(priv->pdev,0x04,Value);
+
+       return 1;
+
+}
+bool PlatformSetPMCSR(struct net_device *dev,u8 value,bool bTempSetting)
+{
+       bool bResult = false;
+       struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
+       u8  Buffer;
+       bool bActuallySet=false, bSetFunc=false;
+       unsigned long flag;
+
+       Buffer= value;
+       spin_lock_irqsave(&priv->D3_lock,flag);
+#ifdef TODO
+       if (bTempSetting)
+       {
+               if (Buffer==0x00)
+               {
+                       priv->LeaveD3Cnt++;
+
+                       {
+                               bActuallySet =true;
+                       }
+               }
+               else
+               {
+                       priv->LeaveD3Cnt--;
+
+                       if (priv->LeaveD3Cnt == 0)
+                       {
+                               bActuallySet=true;
+                       }
+               }
+       }
+       else
+       {
+               priv->LeaveD3Cnt=0;
+               bActuallySet=true;
+               bSetFunc=true;
+       }
+#endif
+       if (bActuallySet) {
+               if (Buffer) {
+                       PlatformSwitchClkReq(dev, 0x01);
+               } else {
+                       PlatformSwitchClkReq(dev, 0x00);
+               }
+
+               pci_write_config_byte(priv->pdev,0x44,Buffer);
+               RT_TRACE(COMP_POWER, "PlatformSetPMCSR(): D3(value: %d)\n", Buffer);
+
+               bResult = true;
+               if (!Buffer) {
+                       PlatformResetPciSpace(dev, 0x06);
+                       PlatformResetPciSpace(dev, 0x07);
+               }
+
+               if (bSetFunc) {
+                       if (Buffer) {
+#ifdef TO_DO_LIST
+                               RT_DISABLE_FUNC(Adapter, DF_IO_D3_BIT);
+#endif
+                       } else {
+#ifdef TO_DO_LIST
+                               RT_ENABLE_FUNC(Adapter, DF_IO_D3_BIT);
+#endif
+                       }
+               }
+
+       }
+       spin_unlock_irqrestore(&priv->D3_lock,flag);
+       return bResult;
+}
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_ps.h b/drivers/staging/rtl8192e/rtl_ps.h
new file mode 100644 (file)
index 0000000..71f2042
--- /dev/null
@@ -0,0 +1,64 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * Based on the r8180 driver, which is:
+ * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+ ******************************************************************************/
+#ifndef _RTL_PS_H
+#define _RTL_PS_H
+
+#include <linux/types.h>
+#include "rtllib.h"
+struct net_device;
+
+#define RT_CHECK_FOR_HANG_PERIOD 2
+#define INIT_DEFAULT_CHAN       1
+
+#if defined CONFIG_ASPM_OR_D3
+#define RT_DISABLE_ASPM(dev)            PlatformDisableASPM(dev)
+#define RT_ENABLE_ASPM(dev)             PlatformEnableASPM(dev)
+#define RT_ENTER_D3(dev, _bTempSetting) PlatformSetPMCSR(dev, 0x03, _bTempSetting)
+#define RT_LEAVE_D3(dev, _bTempSetting) PlatformSetPMCSR(dev, 0, _bTempSetting)
+
+#define RT_DISABLE_HOST_L0S(_PADAPTER) PlatformDisableHostL0s(dev)
+
+void PlatformDisableHostL0s(struct net_device *dev);
+bool PlatformEnable92CEBackDoor(struct net_device *dev);
+void PlatformDisableASPM(struct net_device *dev);
+void PlatformEnableASPM(struct net_device *dev);
+u32 PlatformResetPciSpace(struct net_device *dev,u8 Value);
+#endif
+
+#if defined(RTL8192E) || defined(RTL8192SE) || defined RTL8192CE
+void rtl8192_hw_wakeup(struct net_device *dev);
+void rtl8192_hw_to_sleep(struct net_device *dev, u32 th, u32 tl);
+void rtllib_ips_leave_wq(struct net_device *dev);
+void rtllib_ips_leave(struct net_device *dev);
+void IPSLeave_wq (void *data);
+#endif
+
+void IPSEnter(struct net_device *dev);
+void IPSLeave(struct net_device *dev);
+
+void LeisurePSEnter(struct net_device *dev);
+void LeisurePSLeave(struct net_device *dev);
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtl_wx.c b/drivers/staging/rtl8192e/rtl_wx.c
new file mode 100644 (file)
index 0000000..79ac60d
--- /dev/null
@@ -0,0 +1,1509 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#include <linux/string.h>
+#include "rtl_core.h"
+#ifdef ENABLE_DOT11D
+#include "dot11d.h"
+#endif
+
+#ifdef CONFIG_MP
+#include "r8192S_mp.h"
+#endif
+
+#define RATE_COUNT 12
+u32 rtl8192_rates[] = {1000000,2000000,5500000,11000000,
+       6000000,9000000,12000000,18000000,24000000,36000000,48000000,54000000};
+
+
+#ifndef ENETDOWN
+#define ENETDOWN 1
+#endif
+extern int  hwwep;
+
+static int r8192_wx_get_freq(struct net_device *dev,
+                            struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       return rtllib_wx_get_freq(priv->rtllib,a,wrqu,b);
+}
+
+
+static int r8192_wx_get_mode(struct net_device *dev, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       struct r8192_priv *priv=rtllib_priv(dev);
+
+       return rtllib_wx_get_mode(priv->rtllib,a,wrqu,b);
+}
+
+static int r8192_wx_get_rate(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       return rtllib_wx_get_rate(priv->rtllib,info,wrqu,extra);
+}
+
+
+
+static int r8192_wx_set_rate(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_set_rate(priv->rtllib,info,wrqu,extra);
+
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+
+static int r8192_wx_set_rts(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_set_rts(priv->rtllib,info,wrqu,extra);
+
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+static int r8192_wx_get_rts(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       return rtllib_wx_get_rts(priv->rtllib,info,wrqu,extra);
+}
+
+static int r8192_wx_set_power(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true){
+               RT_TRACE(COMP_ERR,"%s():Hw is Radio Off, we can't set Power,return\n",__func__);
+               return 0;
+       }
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_set_power(priv->rtllib,info,wrqu,extra);
+
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+static int r8192_wx_get_power(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       return rtllib_wx_get_power(priv->rtllib,info,wrqu,extra);
+}
+
+static int r8192_wx_set_rawtx(struct net_device *dev,
+                              struct iw_request_info *info,
+                              union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int ret;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_set_rawtx(priv->rtllib, info, wrqu, extra);
+
+       up(&priv->wx_sem);
+
+       return ret;
+
+}
+
+static int r8192_wx_force_reset(struct net_device *dev,
+               struct iw_request_info *info,
+               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       down(&priv->wx_sem);
+
+       RT_TRACE(COMP_DBG, "%s(): force reset ! extra is %d\n", __func__, *extra);
+       priv->force_reset = *extra;
+       up(&priv->wx_sem);
+       return 0;
+
+}
+
+static int r8192_wx_force_mic_error(struct net_device *dev,
+               struct iw_request_info *info,
+               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       down(&priv->wx_sem);
+
+       RT_TRACE(COMP_DBG, "%s(): force mic error ! \n", __func__);
+       ieee->force_mic_error = true;
+       up(&priv->wx_sem);
+       return 0;
+
+}
+
+#define MAX_ADHOC_PEER_NUM 64
+typedef struct
+{
+       unsigned char MacAddr[ETH_ALEN];
+       unsigned char WirelessMode;
+       unsigned char bCurTxBW40MHz;
+} adhoc_peer_entry_t, *p_adhoc_peer_entry_t;
+typedef struct
+{
+       adhoc_peer_entry_t Entry[MAX_ADHOC_PEER_NUM];
+       unsigned char num;
+} adhoc_peers_info_t, *p_adhoc_peers_info_t;
+int r8192_wx_get_adhoc_peers(struct net_device *dev,
+                              struct iw_request_info *info,
+                              union iwreq_data *wrqu, char *extra)
+{
+#ifndef RTL8192SE
+       return 0;
+#else
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct sta_info * psta = NULL;
+       adhoc_peers_info_t adhoc_peers_info;
+       p_adhoc_peers_info_t  padhoc_peers_info = &adhoc_peers_info;
+       p_adhoc_peer_entry_t padhoc_peer_entry = NULL;
+       int k=0;
+
+
+       memset(extra, 0, 2047);
+       padhoc_peers_info->num = 0;
+
+       down(&priv->wx_sem);
+
+       for (k=0; k<PEER_MAX_ASSOC; k++)
+       {
+               psta = priv->rtllib->peer_assoc_list[k];
+               if (NULL != psta)
+               {
+                       padhoc_peer_entry = &padhoc_peers_info->Entry[padhoc_peers_info->num];
+                       memset(padhoc_peer_entry,0, sizeof(adhoc_peer_entry_t));
+                       memcpy(padhoc_peer_entry->MacAddr, psta->macaddr, ETH_ALEN);
+                       padhoc_peer_entry->WirelessMode = psta->wireless_mode;
+                       padhoc_peer_entry->bCurTxBW40MHz = psta->htinfo.bCurTxBW40MHz;
+                       padhoc_peers_info->num ++;
+                       printk("[%d] MacAddr:"MAC_FMT" \tWirelessMode:%d \tBW40MHz:%d \n", \
+                               k, MAC_ARG(padhoc_peer_entry->MacAddr), padhoc_peer_entry->WirelessMode, padhoc_peer_entry->bCurTxBW40MHz);
+                       sprintf(extra, "[%d] MacAddr:"MAC_FMT" \tWirelessMode:%d \tBW40MHz:%d \n",  \
+                               k, MAC_ARG(padhoc_peer_entry->MacAddr), padhoc_peer_entry->WirelessMode, padhoc_peer_entry->bCurTxBW40MHz);
+               }
+       }
+
+       up(&priv->wx_sem);
+
+       wrqu->data.length = strlen(extra);
+       wrqu->data.flags = 0;
+       return 0;
+
+#endif
+}
+
+
+static int r8191se_wx_get_firm_version(struct net_device *dev,
+               struct iw_request_info *info,
+               struct iw_param *wrqu, char *extra)
+{
+       return 0;
+}
+
+static int r8192_wx_adapter_power_status(struct net_device *dev,
+               struct iw_request_info *info,
+               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+       struct rtllib_device* ieee = priv->rtllib;
+
+       down(&priv->wx_sem);
+
+       RT_TRACE(COMP_POWER, "%s(): %s\n",__func__, (*extra ==  6)?"DC power":"AC power");
+       if (*extra || priv->force_lps) {
+               priv->ps_force = false;
+               pPSC->bLeisurePs = true;
+       } else {
+               if (priv->rtllib->state == RTLLIB_LINKED)
+                       LeisurePSLeave(dev);
+
+               priv->ps_force = true;
+               pPSC->bLeisurePs = false;
+               ieee->ps = *extra;
+       }
+
+       up(&priv->wx_sem);
+
+       return 0;
+}
+
+static int r8192se_wx_set_radio(struct net_device *dev,
+        struct iw_request_info *info,
+        union iwreq_data *wrqu, char *extra)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+
+    down(&priv->wx_sem);
+
+    printk("%s(): set radio ! extra is %d\n",__func__, *extra);
+    if ((*extra != 0) && (*extra != 1))
+    {
+        RT_TRACE(COMP_ERR, "%s(): set radio an err value,must 0(radio off) or 1(radio on)\n",__func__);
+        return -1;
+    }
+    priv->sw_radio_on = *extra;
+    up(&priv->wx_sem);
+    return 0;
+
+}
+
+static int r8192se_wx_set_lps_awake_interval(struct net_device *dev,
+        struct iw_request_info *info,
+        union iwreq_data *wrqu, char *extra)
+{
+    struct r8192_priv *priv = rtllib_priv(dev);
+    PRT_POWER_SAVE_CONTROL     pPSC = (PRT_POWER_SAVE_CONTROL)(&(priv->rtllib->PowerSaveControl));
+
+    down(&priv->wx_sem);
+
+    printk("%s(): set lps awake interval ! extra is %d\n",__func__, *extra);
+
+    pPSC->RegMaxLPSAwakeIntvl = *extra;
+    up(&priv->wx_sem);
+    return 0;
+
+}
+
+static int r8192se_wx_set_force_lps(struct net_device *dev,
+               struct iw_request_info *info,
+               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       down(&priv->wx_sem);
+
+       printk("%s(): force LPS ! extra is %d (1 is open 0 is close)\n",__func__, *extra);
+       priv->force_lps = *extra;
+       up(&priv->wx_sem);
+       return 0;
+
+}
+
+static int r8192_wx_set_debugflag(struct net_device *dev,
+                              struct iw_request_info *info,
+                              union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u8 c = *extra;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       printk("=====>%s(), *extra:%x, debugflag:%x\n", __func__, *extra, rt_global_debug_component);
+       if (c > 0)  {
+               rt_global_debug_component |= (1<<c);
+       } else {
+               rt_global_debug_component &= BIT31;
+       }
+       return 0;
+}
+
+static int r8192_wx_set_mode(struct net_device *dev, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = netdev_priv_rsl(dev);
+
+       RT_RF_POWER_STATE       rtState;
+       int ret;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+       rtState = priv->rtllib->eRFPowerState;
+       down(&priv->wx_sem);
+       if (wrqu->mode == IW_MODE_ADHOC || wrqu->mode == IW_MODE_MONITOR
+               || ieee->bNetPromiscuousMode )
+       {
+               if (priv->rtllib->PowerSaveControl.bInactivePs){
+                       if (rtState == eRfOff){
+                               if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS)
+                               {
+                                       RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__func__);
+                                       up(&priv->wx_sem);
+                                       return -1;
+                               } else {
+                                       printk("=========>%s(): IPSLeave\n",__func__);
+                                       down(&priv->rtllib->ips_sem);
+                                       IPSLeave(dev);
+                                       up(&priv->rtllib->ips_sem);
+                               }
+                       }
+               }
+       }
+       ret = rtllib_wx_set_mode(priv->rtllib,a,wrqu,b);
+
+       up(&priv->wx_sem);
+       return ret;
+}
+
+struct  iw_range_with_scan_capa
+{
+        /* Informative stuff (to choose between different interface) */
+        __u32           throughput;     /* To give an idea... */
+        /* In theory this value should be the maximum benchmarked
+         * TCP/IP throughput, because with most of these devices the
+         * bit rate is meaningless (overhead an co) to estimate how
+         * fast the connection will go and pick the fastest one.
+         * I suggest people to play with Netperf or any benchmark...
+         */
+
+        /* NWID (or domain id) */
+        __u32           min_nwid;       /* Minimal NWID we are able to set */
+        __u32           max_nwid;       /* Maximal NWID we are able to set */
+
+        /* Old Frequency (backward compat - moved lower ) */
+        __u16           old_num_channels;
+        __u8            old_num_frequency;
+
+        /* Scan capabilities */
+        __u8            scan_capa;
+};
+
+static int rtl8192_wx_get_range(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       struct iw_range *range = (struct iw_range *)extra;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       u16 val;
+       int i;
+
+       wrqu->data.length = sizeof(*range);
+       memset(range, 0, sizeof(*range));
+
+       /* ~130 Mb/s real (802.11n) */
+       range->throughput = 130 * 1000 * 1000;
+
+       if (priv->rf_set_sens != NULL)
+               range->sensitivity = priv->max_sens;    /* signal level threshold range */
+
+       range->max_qual.qual = 100;
+       range->max_qual.level = 0;
+       range->max_qual.noise = 0;
+       range->max_qual.updated = 7; /* Updated all three */
+
+       range->avg_qual.qual = 70; /* > 8% missed beacons is 'bad' */
+       range->avg_qual.level = 0;
+       range->avg_qual.noise = 0;
+       range->avg_qual.updated = 7; /* Updated all three */
+
+       range->num_bitrates = min(RATE_COUNT, IW_MAX_BITRATES);
+
+       for (i = 0; i < range->num_bitrates; i++) {
+               range->bitrate[i] = rtl8192_rates[i];
+       }
+
+       range->max_rts = DEFAULT_RTS_THRESHOLD;
+       range->min_frag = MIN_FRAG_THRESHOLD;
+       range->max_frag = MAX_FRAG_THRESHOLD;
+
+       range->min_pmp = 0;
+       range->max_pmp = 5000000;
+       range->min_pmt = 0;
+       range->max_pmt = 65535*1000;
+       range->pmp_flags = IW_POWER_PERIOD;
+       range->pmt_flags = IW_POWER_TIMEOUT;
+       range->pm_capa = IW_POWER_PERIOD | IW_POWER_TIMEOUT | IW_POWER_ALL_R;
+       range->we_version_compiled = WIRELESS_EXT;
+       range->we_version_source = 18;
+
+       for (i = 0, val = 0; i < 14; i++) {
+               if ((priv->rtllib->active_channel_map)[i+1]) {
+                       range->freq[val].i = i + 1;
+                       range->freq[val].m = rtllib_wlan_frequencies[i] * 100000;
+                       range->freq[val].e = 1;
+                       val++;
+               } else {
+               }
+
+               if (val == IW_MAX_FREQUENCIES)
+               break;
+       }
+       range->num_frequency = val;
+       range->num_channels = val;
+#if WIRELESS_EXT > 17
+       range->enc_capa = IW_ENC_CAPA_WPA|IW_ENC_CAPA_WPA2|
+                         IW_ENC_CAPA_CIPHER_TKIP|IW_ENC_CAPA_CIPHER_CCMP;
+#endif
+       range->scan_capa = IW_SCAN_CAPA_ESSID | IW_SCAN_CAPA_TYPE;
+
+        /* Event capability (kernel + driver) */
+
+       return 0;
+}
+
+static int r8192_wx_set_scan(struct net_device *dev, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+       RT_RF_POWER_STATE       rtState;
+       int ret;
+
+#ifdef CONFIG_MP
+       printk("######################%s(): In MP Test Can not Scan\n",__func__);
+       return 0;
+#endif
+       if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)){
+               if ((ieee->state >= RTLLIB_ASSOCIATING) && (ieee->state <= RTLLIB_ASSOCIATING_AUTHENTICATED)){
+                       return 0;
+               }
+               if ((priv->rtllib->state == RTLLIB_LINKED) && (priv->rtllib->CntAfterLink<2)){
+                       return 0;
+               }
+       }
+
+       if (priv->bHwRadioOff == true){
+               printk("================>%s(): hwradio off\n",__func__);
+               return 0;
+       }
+       rtState = priv->rtllib->eRFPowerState;
+       if (!priv->up) return -ENETDOWN;
+       if (priv->rtllib->LinkDetectInfo.bBusyTraffic == true)
+               return -EAGAIN;
+
+#if WIRELESS_EXT > 17
+       if (wrqu->data.flags & IW_SCAN_THIS_ESSID)
+       {
+               struct iw_scan_req* req = (struct iw_scan_req*)b;
+               if (req->essid_len)
+               {
+                       ieee->current_network.ssid_len = req->essid_len;
+                       memcpy(ieee->current_network.ssid, req->essid, req->essid_len);
+               }
+       }
+#endif
+
+       down(&priv->wx_sem);
+
+       priv->rtllib->FirstIe_InScan = true;
+
+       if (priv->rtllib->state != RTLLIB_LINKED){
+               if (priv->rtllib->PowerSaveControl.bInactivePs){
+                       if (rtState == eRfOff){
+                               if (priv->rtllib->RfOffReason > RF_CHANGE_BY_IPS){
+                                       RT_TRACE(COMP_ERR, "%s(): RF is OFF.\n",__func__);
+                                       up(&priv->wx_sem);
+                                       return -1;
+                               }else{
+                                       RT_TRACE(COMP_PS, "=========>%s(): IPSLeave\n",__func__);
+                                       down(&priv->rtllib->ips_sem);
+                                       IPSLeave(dev);
+                                       up(&priv->rtllib->ips_sem);
+                               }
+                       }
+               }
+               rtllib_stop_scan(priv->rtllib);
+               if (priv->rtllib->LedControlHandler)
+                       priv->rtllib->LedControlHandler(dev, LED_CTL_SITE_SURVEY);
+
+                if (priv->rtllib->eRFPowerState != eRfOff){
+                       priv->rtllib->actscanning = true;
+
+                       if (ieee->ScanOperationBackupHandler)
+                               ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_BACKUP);
+
+                       rtllib_start_scan_syncro(priv->rtllib, 0);
+
+                       if (ieee->ScanOperationBackupHandler)
+                               ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_RESTORE);
+                }
+               ret = 0;
+       } else {
+               priv->rtllib->actscanning = true;
+               ret = rtllib_wx_set_scan(priv->rtllib,a,wrqu,b);
+       }
+
+       up(&priv->wx_sem);
+       return ret;
+}
+
+
+static int r8192_wx_get_scan(struct net_device *dev, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (!priv->up) return -ENETDOWN;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_get_scan(priv->rtllib,a,wrqu,b);
+
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+static int r8192_wx_set_essid(struct net_device *dev,
+                             struct iw_request_info *a,
+                             union iwreq_data *wrqu, char *b)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int ret;
+
+       if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
+               ;
+       }
+#ifdef CONFIG_MP
+       printk("######################%s(): In MP Test Can not Set Essid\n",__func__);
+       return 0;
+#endif
+       if (priv->bHwRadioOff == true){
+               printk("=========>%s():hw radio off,or Rf state is eRfOff, return\n",__func__);
+               return 0;
+       }
+       down(&priv->wx_sem);
+       ret = rtllib_wx_set_essid(priv->rtllib,a,wrqu,b);
+
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+static int r8192_wx_get_essid(struct net_device *dev,
+                             struct iw_request_info *a,
+                             union iwreq_data *wrqu, char *b)
+{
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_get_essid(priv->rtllib, a, wrqu, b);
+
+       up(&priv->wx_sem);
+
+       return ret;
+}
+
+static int r8192_wx_set_nick(struct net_device *dev,
+                          struct iw_request_info *info,
+                          union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (wrqu->data.length > IW_ESSID_MAX_SIZE)
+               return -E2BIG;
+       down(&priv->wx_sem);
+       wrqu->data.length = min((size_t) wrqu->data.length, sizeof(priv->nick));
+       memset(priv->nick, 0, sizeof(priv->nick));
+       memcpy(priv->nick, extra, wrqu->data.length);
+       up(&priv->wx_sem);
+       return 0;
+
+}
+
+static int r8192_wx_get_nick(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       down(&priv->wx_sem);
+       wrqu->data.length = strlen(priv->nick);
+       memcpy(extra, priv->nick, wrqu->data.length);
+       wrqu->data.flags = 1;   /* active */
+       up(&priv->wx_sem);
+       return 0;
+}
+
+static int r8192_wx_set_freq(struct net_device *dev, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_set_freq(priv->rtllib, a, wrqu, b);
+
+       up(&priv->wx_sem);
+       return ret;
+}
+
+static int r8192_wx_get_name(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       return rtllib_wx_get_name(priv->rtllib, info, wrqu, extra);
+}
+
+
+static int r8192_wx_set_frag(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       if (wrqu->frag.disabled)
+               priv->rtllib->fts = DEFAULT_FRAG_THRESHOLD;
+       else {
+               if (wrqu->frag.value < MIN_FRAG_THRESHOLD ||
+                   wrqu->frag.value > MAX_FRAG_THRESHOLD)
+                       return -EINVAL;
+
+               priv->rtllib->fts = wrqu->frag.value & ~0x1;
+       }
+
+       return 0;
+}
+
+
+static int r8192_wx_get_frag(struct net_device *dev,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       wrqu->frag.value = priv->rtllib->fts;
+       wrqu->frag.fixed = 0;   /* no auto select */
+       wrqu->frag.disabled = (wrqu->frag.value == DEFAULT_FRAG_THRESHOLD);
+
+       return 0;
+}
+
+
+static int r8192_wx_set_wap(struct net_device *dev,
+                        struct iw_request_info *info,
+                        union iwreq_data *awrq,
+                        char *extra)
+{
+
+       int ret;
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
+               ;
+       }
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+       ret = rtllib_wx_set_wap(priv->rtllib,info,awrq,extra);
+
+       up(&priv->wx_sem);
+
+       return ret;
+
+}
+
+
+static int r8192_wx_get_wap(struct net_device *dev,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       return rtllib_wx_get_wap(priv->rtllib,info,wrqu,extra);
+}
+
+
+static int r8192_wx_get_enc(struct net_device *dev,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *key)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       return rtllib_wx_get_encode(priv->rtllib, info, wrqu, key);
+}
+
+static int r8192_wx_set_enc(struct net_device *dev,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *key)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int ret;
+
+       struct rtllib_device *ieee = priv->rtllib;
+       u32 hwkey[4]={0,0,0,0};
+       u8 mask=0xff;
+       u32 key_idx=0;
+       u8 zero_addr[4][6] ={   {0x00,0x00,0x00,0x00,0x00,0x00},
+                               {0x00,0x00,0x00,0x00,0x00,0x01},
+                               {0x00,0x00,0x00,0x00,0x00,0x02},
+                               {0x00,0x00,0x00,0x00,0x00,0x03} };
+       int i;
+
+       if ((rtllib_act_scanning(priv->rtllib, false)) && !(priv->rtllib->softmac_features & IEEE_SOFTMAC_SCAN)){
+               ;
+       }
+#ifdef CONFIG_MP
+       printk("######################%s(): In MP Test Can not Set Enc\n",__func__);
+       return 0;
+#endif
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       if (!priv->up) return -ENETDOWN;
+
+        priv->rtllib->wx_set_enc = 1;
+        down(&priv->rtllib->ips_sem);
+        IPSLeave(dev);
+        up(&priv->rtllib->ips_sem);
+       down(&priv->wx_sem);
+
+       RT_TRACE(COMP_SEC, "Setting SW wep key");
+       ret = rtllib_wx_set_encode(priv->rtllib,info,wrqu,key);
+       up(&priv->wx_sem);
+
+
+       if (wrqu->encoding.flags & IW_ENCODE_DISABLED) {
+               ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA;
+               CamResetAllEntry(dev);
+               memset(priv->rtllib->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
+               goto end_hw_sec;
+       }
+       if (wrqu->encoding.length!=0){
+
+               for (i=0 ; i<4 ; i++){
+                       hwkey[i] |=  key[4*i+0]&mask;
+                       if (i==1&&(4*i+1)==wrqu->encoding.length) mask=0x00;
+                       if (i==3&&(4*i+1)==wrqu->encoding.length) mask=0x00;
+                       hwkey[i] |= (key[4*i+1]&mask)<<8;
+                       hwkey[i] |= (key[4*i+2]&mask)<<16;
+                       hwkey[i] |= (key[4*i+3]&mask)<<24;
+               }
+
+               #define CONF_WEP40  0x4
+               #define CONF_WEP104 0x14
+
+               switch (wrqu->encoding.flags & IW_ENCODE_INDEX){
+                       case 0: key_idx = ieee->tx_keyidx; break;
+                       case 1: key_idx = 0; break;
+                       case 2: key_idx = 1; break;
+                       case 3: key_idx = 2; break;
+                       case 4: key_idx = 3; break;
+                       default: break;
+               }
+               if (wrqu->encoding.length==0x5){
+                       ieee->pairwise_key_type = KEY_TYPE_WEP40;
+                       EnableHWSecurityConfig8192(dev);
+               }
+
+               else if (wrqu->encoding.length==0xd){
+                       ieee->pairwise_key_type = KEY_TYPE_WEP104;
+                               EnableHWSecurityConfig8192(dev);
+                       setKey( dev,
+                               key_idx,
+                               key_idx,
+                               KEY_TYPE_WEP104,
+                               zero_addr[key_idx],
+                               0,
+                               hwkey);
+                       set_swcam( dev,
+                               key_idx,
+                               key_idx,
+                               KEY_TYPE_WEP104,
+                               zero_addr[key_idx],
+                               0,
+                               hwkey,
+                               0);
+               } else {
+                        printk("wrong type in WEP, not WEP40 and WEP104\n");
+               }
+       }
+
+end_hw_sec:
+       priv->rtllib->wx_set_enc = 0;
+       return ret;
+}
+
+
+static int r8192_wx_set_scan_type(struct net_device *dev, struct iw_request_info *aa, union
+ iwreq_data *wrqu, char *p){
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int *parms=(int*)p;
+       int mode=parms[0];
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       priv->rtllib->active_scan = mode;
+
+       return 1;
+}
+
+
+
+#define R8192_MAX_RETRY 255
+static int r8192_wx_set_retry(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       int err = 0;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+       if (wrqu->retry.flags & IW_RETRY_LIFETIME ||
+           wrqu->retry.disabled){
+               err = -EINVAL;
+               goto exit;
+       }
+       if (!(wrqu->retry.flags & IW_RETRY_LIMIT)){
+               err = -EINVAL;
+               goto exit;
+       }
+
+       if (wrqu->retry.value > R8192_MAX_RETRY){
+               err= -EINVAL;
+               goto exit;
+       }
+       if (wrqu->retry.flags & IW_RETRY_MAX) {
+               priv->retry_rts = wrqu->retry.value;
+               DMESG("Setting retry for RTS/CTS data to %d", wrqu->retry.value);
+
+       }else {
+               priv->retry_data = wrqu->retry.value;
+               DMESG("Setting retry for non RTS/CTS data to %d", wrqu->retry.value);
+       }
+
+
+       rtl8192_commit(dev);
+       /*
+       if (priv->up){
+               rtl8180_halt_adapter(dev);
+               rtl8180_rx_enable(dev);
+               rtl8180_tx_enable(dev);
+
+       }
+       */
+exit:
+       up(&priv->wx_sem);
+
+       return err;
+}
+
+static int r8192_wx_get_retry(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+
+       wrqu->retry.disabled = 0; /* can't be disabled */
+
+       if ((wrqu->retry.flags & IW_RETRY_TYPE) ==
+           IW_RETRY_LIFETIME)
+               return -EINVAL;
+
+       if (wrqu->retry.flags & IW_RETRY_MAX) {
+               wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MAX;
+               wrqu->retry.value = priv->retry_rts;
+       } else {
+               wrqu->retry.flags = IW_RETRY_LIMIT & IW_RETRY_MIN;
+               wrqu->retry.value = priv->retry_data;
+       }
+
+
+       return 0;
+}
+
+static int r8192_wx_get_sens(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       if (priv->rf_set_sens == NULL)
+               return -1; /* we have not this support for this radio */
+       wrqu->sens.value = priv->sens;
+       return 0;
+}
+
+
+static int r8192_wx_set_sens(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       short err = 0;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+       if (priv->rf_set_sens == NULL) {
+               err= -1; /* we have not this support for this radio */
+               goto exit;
+       }
+       if (priv->rf_set_sens(dev, wrqu->sens.value) == 0)
+               priv->sens = wrqu->sens.value;
+       else
+               err= -EINVAL;
+
+exit:
+       up(&priv->wx_sem);
+
+       return err;
+}
+
+#if (WIRELESS_EXT >= 18)
+
+static int r8192_wx_set_enc_ext(struct net_device *dev,
+                                        struct iw_request_info *info,
+                                        union iwreq_data *wrqu, char *extra)
+{
+       int ret=0;
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+
+        priv->rtllib->wx_set_enc = 1;
+        down(&priv->rtllib->ips_sem);
+        IPSLeave(dev);
+        up(&priv->rtllib->ips_sem);
+
+       ret = rtllib_wx_set_encode_ext(ieee, info, wrqu, extra);
+
+       {
+               u8 broadcast_addr[6] = {0xff,0xff,0xff,0xff,0xff,0xff};
+               u8 zero[6] = {0};
+               u32 key[4] = {0};
+               struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+               struct iw_point *encoding = &wrqu->encoding;
+               u8 idx = 0, alg = 0, group = 0;
+               if ((encoding->flags & IW_ENCODE_DISABLED) ||
+               ext->alg == IW_ENCODE_ALG_NONE)
+               {
+                       ieee->pairwise_key_type = ieee->group_key_type = KEY_TYPE_NA;
+                       CamResetAllEntry(dev);
+                       memset(priv->rtllib->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
+                       goto end_hw_sec;
+               }
+               alg =  (ext->alg == IW_ENCODE_ALG_CCMP)?KEY_TYPE_CCMP:ext->alg;
+               idx = encoding->flags & IW_ENCODE_INDEX;
+               if (idx)
+                       idx --;
+               group = ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY;
+
+               if ((!group) || (IW_MODE_ADHOC == ieee->iw_mode) || (alg ==  KEY_TYPE_WEP40))
+               {
+                       if ((ext->key_len == 13) && (alg == KEY_TYPE_WEP40) )
+                               alg = KEY_TYPE_WEP104;
+                       ieee->pairwise_key_type = alg;
+                       EnableHWSecurityConfig8192(dev);
+               }
+               memcpy((u8*)key, ext->key, 16);
+
+               if ((alg & KEY_TYPE_WEP40) && (ieee->auth_mode !=2) )
+               {
+                       if (ext->key_len == 13)
+                               ieee->pairwise_key_type = alg = KEY_TYPE_WEP104;
+                       setKey( dev,
+                                       idx,
+                                       idx,
+                                       alg,
+                                       zero,
+                                       0,
+                                       key);
+                       set_swcam( dev,
+                                       idx,
+                                       idx,
+                                       alg,
+                                       zero,
+                                       0,
+                                       key,
+                                       0);
+               }
+               else if (group)
+               {
+                       ieee->group_key_type = alg;
+                       setKey( dev,
+                                       idx,
+                                       idx,
+                                       alg,
+                                       broadcast_addr,
+                                       0,
+                                       key);
+                       set_swcam( dev,
+                                       idx,
+                                       idx,
+                                       alg,
+                                       broadcast_addr,
+                                       0,
+                                       key,
+                                       0);
+               }
+               else
+               {
+                       #ifdef RTL8192E
+                       if ((ieee->pairwise_key_type == KEY_TYPE_CCMP) && ieee->pHTInfo->bCurrentHTSupport){
+                                                       write_nic_byte(dev, 0x173, 1);
+                       }
+                       #endif
+                       setKey( dev,
+                                       4,
+                                       idx,
+                                       alg,
+                                       (u8*)ieee->ap_mac_addr,
+                                       0,
+                                       key);
+                       set_swcam( dev,
+                                       4,
+                                       idx,
+                                       alg,
+                                       (u8*)ieee->ap_mac_addr,
+                                       0,
+                                       key,
+                                       0);
+               }
+
+
+       }
+
+end_hw_sec:
+        priv->rtllib->wx_set_enc = 0;
+       up(&priv->wx_sem);
+       return ret;
+
+}
+static int r8192_wx_set_auth(struct net_device *dev,
+                                        struct iw_request_info *info,
+                                        union iwreq_data *data, char *extra)
+{
+       int ret=0;
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+       ret = rtllib_wx_set_auth(priv->rtllib, info, &(data->param), extra);
+       up(&priv->wx_sem);
+       return ret;
+}
+
+static int r8192_wx_set_mlme(struct net_device *dev,
+                                        struct iw_request_info *info,
+                                        union iwreq_data *wrqu, char *extra)
+{
+
+       int ret=0;
+
+       struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+       down(&priv->wx_sem);
+       ret = rtllib_wx_set_mlme(priv->rtllib, info, wrqu, extra);
+       up(&priv->wx_sem);
+       return ret;
+}
+#endif
+
+static int r8192_wx_set_gen_ie(struct net_device *dev,
+                                        struct iw_request_info *info,
+                                        union iwreq_data *data, char *extra)
+{
+       int ret = 0;
+
+        struct r8192_priv *priv = rtllib_priv(dev);
+
+       if (priv->bHwRadioOff == true)
+               return 0;
+
+        down(&priv->wx_sem);
+        ret = rtllib_wx_set_gen_ie(priv->rtllib, extra, data->data.length);
+        up(&priv->wx_sem);
+        return ret;
+}
+
+static int r8192_wx_get_gen_ie(struct net_device *dev,
+                               struct iw_request_info *info,
+                              union iwreq_data *data, char *extra)
+{
+       int ret = 0;
+        struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       if (ieee->wpa_ie_len == 0 || ieee->wpa_ie == NULL) {
+               data->data.length = 0;
+               return 0;
+       }
+
+       if (data->data.length < ieee->wpa_ie_len) {
+               return -E2BIG;
+       }
+
+       data->data.length = ieee->wpa_ie_len;
+       memcpy(extra, ieee->wpa_ie, ieee->wpa_ie_len);
+        return ret;
+}
+
+#define OID_RT_INTEL_PROMISCUOUS_MODE  0xFF0101F6
+
+static int r8192_wx_set_PromiscuousMode(struct net_device *dev,
+                struct iw_request_info *info,
+                union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+       u32 *info_buf = (u32*)(wrqu->data.pointer);
+
+       u32 oid = info_buf[0];
+       u32 bPromiscuousOn = info_buf[1];
+       u32 bFilterSourceStationFrame = info_buf[2];
+
+       if (OID_RT_INTEL_PROMISCUOUS_MODE == oid)
+       {
+               ieee->IntelPromiscuousModeInfo.bPromiscuousOn =
+                                       (bPromiscuousOn)? (true) : (false);
+               ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame =
+                                       (bFilterSourceStationFrame)? (true) : (false);
+
+               (bPromiscuousOn) ? (rtllib_EnableIntelPromiscuousMode(dev, false)) :
+                               (rtllib_DisableIntelPromiscuousMode(dev, false));
+
+               printk("=======>%s(), on = %d, filter src sta = %d\n", __func__,
+                       bPromiscuousOn, bFilterSourceStationFrame);
+       } else {
+               return -1;
+       }
+
+       return 0;
+}
+
+
+static int r8192_wx_get_PromiscuousMode(struct net_device *dev,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+
+        down(&priv->wx_sem);
+
+        snprintf(extra, 45, "PromiscuousMode:%d, FilterSrcSTAFrame:%d",\
+                       ieee->IntelPromiscuousModeInfo.bPromiscuousOn,\
+                       ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame);
+        wrqu->data.length = strlen(extra) + 1;
+
+        up(&priv->wx_sem);
+
+       return 0;
+}
+
+
+#define IW_IOCTL(x) [(x)-SIOCSIWCOMMIT]
+static iw_handler r8192_wx_handlers[] =
+{
+        IW_IOCTL(SIOCGIWNAME) = r8192_wx_get_name,
+        IW_IOCTL(SIOCSIWFREQ) = r8192_wx_set_freq,
+        IW_IOCTL(SIOCGIWFREQ) = r8192_wx_get_freq,
+        IW_IOCTL(SIOCSIWMODE) = r8192_wx_set_mode,
+        IW_IOCTL(SIOCGIWMODE) = r8192_wx_get_mode,
+        IW_IOCTL(SIOCSIWSENS) = r8192_wx_set_sens,
+        IW_IOCTL(SIOCGIWSENS) = r8192_wx_get_sens,
+        IW_IOCTL(SIOCGIWRANGE) = rtl8192_wx_get_range,
+        IW_IOCTL(SIOCSIWAP) = r8192_wx_set_wap,
+        IW_IOCTL(SIOCGIWAP) = r8192_wx_get_wap,
+        IW_IOCTL(SIOCSIWSCAN) = r8192_wx_set_scan,
+        IW_IOCTL(SIOCGIWSCAN) = r8192_wx_get_scan,
+        IW_IOCTL(SIOCSIWESSID) = r8192_wx_set_essid,
+        IW_IOCTL(SIOCGIWESSID) = r8192_wx_get_essid,
+        IW_IOCTL(SIOCSIWNICKN) = r8192_wx_set_nick,
+               IW_IOCTL(SIOCGIWNICKN) = r8192_wx_get_nick,
+        IW_IOCTL(SIOCSIWRATE) = r8192_wx_set_rate,
+        IW_IOCTL(SIOCGIWRATE) = r8192_wx_get_rate,
+        IW_IOCTL(SIOCSIWRTS) = r8192_wx_set_rts,
+        IW_IOCTL(SIOCGIWRTS) = r8192_wx_get_rts,
+        IW_IOCTL(SIOCSIWFRAG) = r8192_wx_set_frag,
+        IW_IOCTL(SIOCGIWFRAG) = r8192_wx_get_frag,
+        IW_IOCTL(SIOCSIWRETRY) = r8192_wx_set_retry,
+        IW_IOCTL(SIOCGIWRETRY) = r8192_wx_get_retry,
+        IW_IOCTL(SIOCSIWENCODE) = r8192_wx_set_enc,
+        IW_IOCTL(SIOCGIWENCODE) = r8192_wx_get_enc,
+        IW_IOCTL(SIOCSIWPOWER) = r8192_wx_set_power,
+        IW_IOCTL(SIOCGIWPOWER) = r8192_wx_get_power,
+#if (WIRELESS_EXT >= 18)
+               IW_IOCTL(SIOCSIWGENIE) = r8192_wx_set_gen_ie,
+               IW_IOCTL(SIOCGIWGENIE) = r8192_wx_get_gen_ie,
+               IW_IOCTL(SIOCSIWMLME) = r8192_wx_set_mlme,
+               IW_IOCTL(SIOCSIWAUTH) = r8192_wx_set_auth,
+               IW_IOCTL(SIOCSIWENCODEEXT) = r8192_wx_set_enc_ext,
+#endif
+};
+
+/*
+ * the following rule need to be follwing,
+ * Odd : get (world access),
+ * even : set (root access)
+ * */
+static const struct iw_priv_args r8192_private_args[] = {
+       {
+               SIOCIWFIRSTPRIV + 0x0,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "set_debugflag"
+       },
+       {
+               SIOCIWFIRSTPRIV + 0x1,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "activescan"
+       },
+       {
+               SIOCIWFIRSTPRIV + 0x2,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "rawtx"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x3,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "forcereset"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x4,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "force_mic_error"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x5,
+               IW_PRIV_TYPE_NONE, IW_PRIV_TYPE_INT|IW_PRIV_SIZE_FIXED|1,
+               "firm_ver"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x6,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
+               "set_power"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x9,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
+               "radio"
+       }
+        ,
+       {
+               SIOCIWFIRSTPRIV + 0xa,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
+               "lps_interv"
+       }
+        ,
+       {
+               SIOCIWFIRSTPRIV + 0xb,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED|1, IW_PRIV_TYPE_NONE,
+               "lps_force"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0xc,
+               0, IW_PRIV_TYPE_CHAR|2047, "adhoc_peer_list"
+       }
+#ifdef CONFIG_MP
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0xe,
+                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetChan"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0xf,
+                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetRate"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x10,
+                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetTxPower"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x11,
+                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "SetBW"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x12,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1, 0, "TxStart"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x13,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 1,0, "SetSingleCarrier"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x14,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "WriteRF"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x15,
+               IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "WriteMAC"
+       }
+#endif
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x16,
+                IW_PRIV_TYPE_INT | IW_PRIV_SIZE_FIXED | 3, 0, "setpromisc"
+       }
+       ,
+       {
+               SIOCIWFIRSTPRIV + 0x17,
+               0,IW_PRIV_TYPE_CHAR | IW_PRIV_SIZE_FIXED | 45, "getpromisc"
+       }
+
+};
+
+static iw_handler r8192_private_handler[] = {
+       (iw_handler)r8192_wx_set_debugflag,   /*SIOCIWSECONDPRIV*/
+       (iw_handler)r8192_wx_set_scan_type,
+       (iw_handler)r8192_wx_set_rawtx,
+       (iw_handler)r8192_wx_force_reset,
+       (iw_handler)r8192_wx_force_mic_error,
+       (iw_handler)r8191se_wx_get_firm_version,
+       (iw_handler)r8192_wx_adapter_power_status,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)r8192se_wx_set_radio,
+       (iw_handler)r8192se_wx_set_lps_awake_interval,
+       (iw_handler)r8192se_wx_set_force_lps,
+       (iw_handler)r8192_wx_get_adhoc_peers,
+       (iw_handler)NULL,
+#ifdef CONFIG_MP
+       (iw_handler)r8192_wx_mp_set_chan,
+       (iw_handler)r8192_wx_mp_set_txrate,
+       (iw_handler)r8192_wx_mp_set_txpower,
+       (iw_handler)r8192_wx_mp_set_bw,
+        (iw_handler)r8192_wx_mp_set_txstart,
+        (iw_handler)r8192_wx_mp_set_singlecarrier,
+        (iw_handler)r8192_wx_mp_write_rf,
+       (iw_handler)r8192_wx_mp_write_mac,
+#else
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+       (iw_handler)NULL,
+#endif
+       (iw_handler)r8192_wx_set_PromiscuousMode,
+       (iw_handler)r8192_wx_get_PromiscuousMode,
+};
+
+struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev)
+{
+       struct r8192_priv *priv = rtllib_priv(dev);
+       struct rtllib_device* ieee = priv->rtllib;
+       struct iw_statistics* wstats = &priv->wstats;
+       int tmp_level = 0;
+       int tmp_qual = 0;
+       int tmp_noise = 0;
+       if (ieee->state < RTLLIB_LINKED)
+       {
+               wstats->qual.qual = 10;
+               wstats->qual.level = 0;
+               wstats->qual.noise = -100;
+               wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
+               return wstats;
+       }
+
+       tmp_level = (&ieee->current_network)->stats.rssi;
+       tmp_qual = (&ieee->current_network)->stats.signal;
+       tmp_noise = (&ieee->current_network)->stats.noise;
+
+       wstats->qual.level = tmp_level;
+       wstats->qual.qual = tmp_qual;
+       wstats->qual.noise = tmp_noise;
+       wstats->qual.updated = IW_QUAL_ALL_UPDATED | IW_QUAL_DBM;
+       return wstats;
+}
+
+struct iw_handler_def  r8192_wx_handlers_def={
+       .standard = r8192_wx_handlers,
+       .num_standard = sizeof(r8192_wx_handlers) / sizeof(iw_handler),
+       .private = r8192_private_handler,
+       .num_private = sizeof(r8192_private_handler) / sizeof(iw_handler),
+       .num_private_args = sizeof(r8192_private_args) / sizeof(struct iw_priv_args),
+#if WIRELESS_EXT >= 17
+       .get_wireless_stats = r8192_get_wireless_stats,
+#endif
+       .private_args = (struct iw_priv_args *)r8192_private_args,
+};
diff --git a/drivers/staging/rtl8192e/rtl_wx.h b/drivers/staging/rtl8192e/rtl_wx.h
new file mode 100644 (file)
index 0000000..94d42a8
--- /dev/null
@@ -0,0 +1,31 @@
+/******************************************************************************
+ * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
+ *
+ * The full GNU General Public License is included in this distribution in the
+ * file called LICENSE.
+ *
+ * Contact Information:
+ * wlanfae <wlanfae@realtek.com>
+******************************************************************************/
+
+#ifndef R819x_WX_H
+#define R819x_WX_H
+
+struct net_device;
+struct iw_handler_def;
+struct iw_statistics;
+
+extern struct iw_handler_def r8192_wx_handlers_def;
+struct iw_statistics *r8192_get_wireless_stats(struct net_device *dev);
+u16 rtl8192_11n_user_show_rates(struct net_device* dev);
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtllib.h b/drivers/staging/rtl8192e/rtllib.h
new file mode 100644 (file)
index 0000000..61780a2
--- /dev/null
@@ -0,0 +1,3452 @@
+/*
+ * Merged with mainline rtllib.h in Aug 2004.  Original ieee802_11
+ * remains copyright by the original authors
+ *
+ * Portions of the merged code are based on Host AP (software wireless
+ * LAN access point) driver for Intersil Prism2/2.5/3.
+ *
+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+ * <jkmaline@cc.hut.fi>
+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
+ *
+ * Adaption to a generic IEEE 802.11 stack by James Ketrenos
+ * <jketreno@linux.intel.com>
+ * Copyright (c) 2004, Intel Corporation
+ *
+ * Modified for Realtek's wi-fi cards by Andrea Merello
+ * <andreamrl@tiscali.it>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+#ifndef RTLLIB_H
+#define RTLLIB_H
+#include <linux/if_ether.h> /* ETH_ALEN */
+#include <linux/kernel.h>   /* ARRAY_SIZE */
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/interrupt.h>
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+#include <linux/jiffies.h>
+#else
+#include <linux/jffs.h>
+#include <linux/tqueue.h>
+#endif
+#include <linux/timer.h>
+#include <linux/sched.h>
+
+#include <linux/delay.h>
+#include <linux/wireless.h>
+
+#ifdef CONFIG_CFG_80211
+#include <net/cfg80211.h>
+#endif
+
+#include "rtl819x_HT.h"
+#include "rtl819x_BA.h"
+#include "rtl819x_TS.h"
+
+#include <linux/netdevice.h>
+#include <linux/if_arp.h> /* ARPHRD_ETHER */
+
+#ifndef WIRELESS_SPY
+#define WIRELESS_SPY
+#endif
+#include <net/iw_handler.h>
+
+#ifndef IEEE80211_RADIOTAP_F_BADFCS
+#define IEEE80211_RADIOTAP_F_BADFCS    0x40    /* bad FCS */
+#endif
+
+#ifndef IW_MODE_MONITOR
+#define IW_MODE_MONITOR 6
+#endif
+
+#ifndef IWEVCUSTOM
+#define IWEVCUSTOM 0x8c02
+#endif
+
+#ifndef IW_CUSTOM_MAX
+/* Max number of char in custom event - use multiple of them if needed */
+#define IW_CUSTOM_MAX  256     /* In bytes */
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#define jiffies_to_msecs(t)  ((t) * 1000 / HZ)
+#ifndef __bitwise
+#define __bitwise __attribute__((bitwise))
+#endif
+typedef __u16  __le16;
+
+#if (WIRELESS_EXT < 16)
+struct iw_spy_data{
+       /* --- Standard spy support --- */
+       int                     spy_number;
+       u_char                  spy_address[IW_MAX_SPY][ETH_ALEN];
+       struct iw_quality       spy_stat[IW_MAX_SPY];
+       /* --- Enhanced spy support (event) */
+       struct iw_quality       spy_thr_low; /* Low threshold */
+       struct iw_quality       spy_thr_high; /* High threshold */
+       u_char                  spy_thr_under[IW_MAX_SPY];
+};
+#endif
+#endif
+
+#ifndef container_of
+/**
+ * container_of - cast a member of a structure out to the containing structure
+ *
+ * @ptr:        the pointer to the member.
+ * @type:       the type of the container struct this is embedded in.
+ * @member:     the name of the member within the struct.
+ *
+ */
+#define container_of(ptr, type, member) ({                      \
+        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \
+        (type *)( (char *)__mptr - offsetof(type,member) );})
+#endif
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,18))
+#define skb_tail_pointer_rsl(skb) skb_tail_pointer(skb)
+#else
+#define skb_tail_pointer_rsl(skb) skb->tail
+#endif
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+       #define EXPORT_SYMBOL_RSL(x) EXPORT_SYMBOL(x)
+#else
+       #define EXPORT_SYMBOL_RSL(x) EXPORT_SYMBOL_NOVERS(x)
+#endif
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+static inline void tq_init(struct tq_struct * task, void(*func)(void *), void *data)
+{
+       task->routine = func;
+       task->data      = data;
+       INIT_LIST_HEAD(&task->list);
+       task->sync = 0;
+}
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+static inline void setup_timer(struct timer_list * timer, void(*function)(unsigned long), unsigned long data)
+{
+       timer->function = function;
+       timer->data     = data;
+}
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+       typedef struct delayed_work delayed_work_struct_rsl;
+       #define queue_delayed_work_rsl(x,y,z) queue_delayed_work(x,y,z)
+       #define INIT_DELAYED_WORK_RSL(x,y,z) INIT_DELAYED_WORK(x,y)
+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,40)
+       typedef struct tq_struct delayed_work_struct_rsl;
+       #define queue_delayed_work_rsl(x,y,z) schedule_task(y)
+       #define INIT_DELAYED_WORK_RSL(x,y,z) tq_init(x,y,z)
+#else
+       typedef struct work_struct delayed_work_struct_rsl;
+       #define queue_delayed_work_rsl(x,y,z) queue_delayed_work(x,y,z)
+       #define INIT_DELAYED_WORK_RSL(x,y,z) INIT_WORK(x,y,z)
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+       typedef struct work_struct work_struct_rsl;
+       #define queue_work_rsl(x,y) queue_work(x,y)
+       #define INIT_WORK_RSL(x,y,z) INIT_WORK(x,y)
+#elif LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,40)
+       typedef struct tq_struct work_struct_rsl;
+       #define queue_work_rsl(x,y) schedule_task(y)
+       #define INIT_WORK_RSL(x,y,z) tq_init(x,y,z)
+#else
+       typedef struct work_struct work_struct_rsl;
+       #define queue_work_rsl(x,y) queue_work(x,y)
+       #define INIT_WORK_RSL(x,y,z) INIT_WORK(x,y,z)
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20)
+       #define container_of_work_rsl(x,y,z) container_of(x,y,z)
+       #define container_of_dwork_rsl(x,y,z) container_of(container_of(x, struct delayed_work, work), y, z)
+#else
+       #define container_of_work_rsl(x,y,z) (x)
+       #define container_of_dwork_rsl(x,y,z) (x)
+#endif
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,4,20)) && (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+static inline char *
+iwe_stream_add_event_rsl(struct iw_request_info *info,
+                       char *     stream,         /* Stream of events */
+                       char *     ends,           /* End of stream */
+                       struct iw_event *iwe,      /* Payload */
+                       int        event_len)      /* Real size of payload */
+{
+        /* Check if it's possible */
+        if ((stream + event_len) < ends) {
+                iwe->len = event_len;
+               ndelay(1);
+                memcpy(stream, (char *) iwe, event_len);
+                stream += event_len;
+        }
+        return stream;
+}
+#elif LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+       #define iwe_stream_add_event_rsl(info,start,stop,iwe,len) iwe_stream_add_event(info,start,stop,iwe,len)
+#else
+       #define iwe_stream_add_event_rsl(info,start,stop,iwe,len) iwe_stream_add_event(start,stop,iwe,len)
+#endif
+
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,27)
+       #define iwe_stream_add_point_rsl(info,start,stop,iwe,p) iwe_stream_add_point(info,start,stop,iwe,p)
+#else
+       #define iwe_stream_add_point_rsl(info,start,stop,iwe,p) iwe_stream_add_point(start,stop,iwe,p)
+#endif
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       #define usb_alloc_urb_rsl(x,y) usb_alloc_urb(x,y)
+       #define usb_submit_urb_rsl(x,y) usb_submit_urb(x,y)
+#else
+       #define usb_alloc_urb_rsl(x,y) usb_alloc_urb(x)
+       #define usb_submit_urb_rsl(x,y) usb_submit_urb(x)
+#endif
+
+static inline void *netdev_priv_rsl(struct net_device *dev)
+{
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       return netdev_priv(dev);
+#else
+       return dev->priv;
+#endif
+}
+
+#define KEY_TYPE_NA            0x0
+#define KEY_TYPE_WEP40         0x1
+#define KEY_TYPE_TKIP          0x2
+#define KEY_TYPE_CCMP          0x4
+#define KEY_TYPE_WEP104                0x5
+/* added for rtl819x tx procedure */
+#define MAX_QUEUE_SIZE         0x10
+
+#if defined(RTL8192SU) || defined(RTL8190P) ||defined(RTL8192U) ||defined(RTL8192E)
+#define BK_QUEUE                               0
+#define BE_QUEUE                               1
+#define VI_QUEUE                               2
+#define VO_QUEUE                               3
+#define HCCA_QUEUE                             4
+#define TXCMD_QUEUE                            5
+#define MGNT_QUEUE                             6
+#define HIGH_QUEUE                             7
+#define BEACON_QUEUE                           8
+#elif defined(RTL8192SE)
+#define BK_QUEUE                               0
+#define BE_QUEUE                               1
+#define VI_QUEUE                               2
+#define VO_QUEUE                               3
+#define BEACON_QUEUE                          4
+#define TXCMD_QUEUE                            5
+#define MGNT_QUEUE                             6
+#define HIGH_QUEUE                             7
+#define HCCA_QUEUE                             8
+
+#endif
+
+#define LOW_QUEUE                              BE_QUEUE
+#define NORMAL_QUEUE                           MGNT_QUEUE
+
+#ifndef IW_MODE_MESH
+#define IW_MODE_MESH                   7
+#endif
+#define AMSDU_SUBHEADER_LEN 14
+#define SWRF_TIMEOUT                           50
+
+#define IE_CISCO_FLAG_POSITION         0x08
+#define SUPPORT_CKIP_MIC                       0x08
+#define SUPPORT_CKIP_PK                        0x10
+#define        RT_RF_OFF_LEVL_ASPM                     BIT0
+#define        RT_RF_OFF_LEVL_CLK_REQ          BIT1
+#define        RT_RF_OFF_LEVL_PCI_D3                   BIT2
+#define        RT_RF_OFF_LEVL_HALT_NIC         BIT3
+#define        RT_RF_OFF_LEVL_FREE_FW          BIT4
+#define        RT_RF_OFF_LEVL_FW_32K           BIT5
+#define        RT_RF_PS_LEVEL_ALWAYS_ASPM      BIT6
+#define        RT_RF_LPS_DISALBE_2R                    BIT30
+#define        RT_RF_LPS_LEVEL_ASPM                    BIT31
+#define        RT_IN_PS_LEVEL(pPSC, _PS_FLAG)  ((pPSC->CurPsLevel & _PS_FLAG) ? true : false)
+#define        RT_CLEAR_PS_LEVEL(pPSC, _PS_FLAG)       (pPSC->CurPsLevel &= (~(_PS_FLAG)))
+#define        RT_SET_PS_LEVEL(pPSC, _PS_FLAG) (pPSC->CurPsLevel |= _PS_FLAG)
+
+/* defined for skb cb field */
+/* At most 28 byte */
+typedef struct cb_desc {
+       /* Tx Desc Related flags (8-9) */
+       u8 bLastIniPkt:1;
+       u8 bCmdOrInit:1;
+       u8 bFirstSeg:1;
+       u8 bLastSeg:1;
+       u8 bEncrypt:1;
+       u8 bTxDisableRateFallBack:1;
+       u8 bTxUseDriverAssingedRate:1;
+       u8 bHwSec:1;
+
+       u8 nStuckCount;
+
+       /* Tx Firmware Relaged flags (10-11)*/
+       u8 bCTSEnable:1;
+       u8 bRTSEnable:1;
+       u8 bUseShortGI:1;
+       u8 bUseShortPreamble:1;
+       u8 bTxEnableFwCalcDur:1;
+       u8 bAMPDUEnable:1;
+       u8 bRTSSTBC:1;
+       u8 RTSSC:1;
+
+       u8 bRTSBW:1;
+       u8 bPacketBW:1;
+       u8 bRTSUseShortPreamble:1;
+       u8 bRTSUseShortGI:1;
+       u8 bMulticast:1;
+       u8 bBroadcast:1;
+       u8 drv_agg_enable:1;
+       u8 reserved2:1;
+
+       /* Tx Desc related element(12-19) */
+       u8 rata_index;
+       u8 queue_index;
+       u16 txbuf_size;
+       u8 RATRIndex;
+       u8 bAMSDU:1;
+       u8 bFromAggrQ:1;
+       u8 reserved6:6;
+       u8 macId;
+       u8 priority;
+
+       /* Tx firmware related element(20-27) */
+       u8 data_rate;
+       u8 rts_rate;
+       u8 ampdu_factor;
+       u8 ampdu_density;
+       u8 DrvAggrNum;
+       u8 bdhcp;
+       u16 pkt_size;
+       u8 bIsSpecialDataFrame;
+
+       u8 bBTTxPacket;
+       u8 bIsBTProbRsp;
+}cb_desc, *pcb_desc;
+
+/*--------------------------Define -------------------------------------------*/
+#define MGN_1M                  0x02
+#define MGN_2M                  0x04
+#define MGN_5_5M                0x0b
+#define MGN_11M                 0x16
+
+#define MGN_6M                  0x0c
+#define MGN_9M                  0x12
+#define MGN_12M                 0x18
+#define MGN_18M                 0x24
+#define MGN_24M                 0x30
+#define MGN_36M                 0x48
+#define MGN_48M                 0x60
+#define MGN_54M                 0x6c
+
+#define MGN_MCS0                0x80
+#define MGN_MCS1                0x81
+#define MGN_MCS2                0x82
+#define MGN_MCS3                0x83
+#define MGN_MCS4                0x84
+#define MGN_MCS5                0x85
+#define MGN_MCS6                0x86
+#define MGN_MCS7                0x87
+#define MGN_MCS8                0x88
+#define MGN_MCS9                0x89
+#define MGN_MCS10               0x8a
+#define MGN_MCS11               0x8b
+#define MGN_MCS12               0x8c
+#define MGN_MCS13               0x8d
+#define MGN_MCS14               0x8e
+#define MGN_MCS15               0x8f
+#define        MGN_MCS0_SG                     0x90
+#define        MGN_MCS1_SG                     0x91
+#define        MGN_MCS2_SG                     0x92
+#define        MGN_MCS3_SG                     0x93
+#define        MGN_MCS4_SG                     0x94
+#define        MGN_MCS5_SG                     0x95
+#define        MGN_MCS6_SG                     0x96
+#define        MGN_MCS7_SG                     0x97
+#define        MGN_MCS8_SG                     0x98
+#define        MGN_MCS9_SG                     0x99
+#define        MGN_MCS10_SG            0x9a
+#define        MGN_MCS11_SG            0x9b
+#define        MGN_MCS12_SG            0x9c
+#define        MGN_MCS13_SG            0x9d
+#define        MGN_MCS14_SG            0x9e
+#define        MGN_MCS15_SG            0x9f
+
+
+enum   _ReasonCode{
+       unspec_reason   = 0x1,
+       auth_not_valid  = 0x2,
+       deauth_lv_ss    = 0x3,
+       inactivity              = 0x4,
+       ap_overload     = 0x5,
+       class2_err              = 0x6,
+       class3_err              = 0x7,
+       disas_lv_ss     = 0x8,
+       asoc_not_auth   = 0x9,
+
+       mic_failure     = 0xe,
+
+       invalid_IE              = 0x0d,
+       four_way_tmout  = 0x0f,
+       two_way_tmout   = 0x10,
+       IE_dismatch     = 0x11,
+       invalid_Gcipher = 0x12,
+       invalid_Pcipher = 0x13,
+       invalid_AKMP    = 0x14,
+       unsup_RSNIEver = 0x15,
+       invalid_RSNIE   = 0x16,
+       auth_802_1x_fail= 0x17,
+       ciper_reject            = 0x18,
+
+       QoS_unspec              = 0x20,
+       QAP_bandwidth   = 0x21,
+       poor_condition  = 0x22,
+       no_facility     = 0x23,
+       req_declined    = 0x25,
+       invalid_param   = 0x26,
+       req_not_honored= 0x27,
+       TS_not_created  = 0x2F,
+       DL_not_allowed  = 0x30,
+       dest_not_exist  = 0x31,
+       dest_not_QSTA   = 0x32,
+};
+
+typedef enum _HAL_DEF_VARIABLE{
+       HAL_DEF_TPC_ENABLE,
+       HAL_DEF_INIT_GAIN,
+       HAL_DEF_PROT_IMP_MODE,
+       HAL_DEF_HIGH_POWER_MECHANISM,
+       HAL_DEF_RATE_ADAPTIVE_MECHANISM,
+       HAL_DEF_ANTENNA_DIVERSITY_MECHANISM,
+       HAL_DEF_LED,
+       HAL_DEF_CW_MAX_MIN,
+
+       HAL_DEF_WOWLAN,
+       HAL_DEF_ENDPOINTS,
+       HAL_DEF_MIN_TX_POWER_DBM,
+       HAL_DEF_MAX_TX_POWER_DBM,
+       HW_DEF_EFUSE_REPG_SECTION1_FLAG,
+       HW_DEF_EFUSE_REPG_DATA,
+       HW_DEF_GPIO,
+       HAL_DEF_PCI_SUPPORT_ASPM,
+       HAL_DEF_THERMAL_VALUE,
+      HAL_DEF_USB_IN_TOKEN_REV,
+}HAL_DEF_VARIABLE;
+
+
+typedef enum _HW_VARIABLES{
+       HW_VAR_ETHER_ADDR,
+       HW_VAR_MULTICAST_REG,
+       HW_VAR_BASIC_RATE,
+       HW_VAR_BSSID,
+       HW_VAR_MEDIA_STATUS,
+       HW_VAR_SECURITY_CONF,
+       HW_VAR_BEACON_INTERVAL,
+       HW_VAR_ATIM_WINDOW,
+       HW_VAR_LISTEN_INTERVAL,
+       HW_VAR_CS_COUNTER,
+       HW_VAR_DEFAULTKEY0,
+       HW_VAR_DEFAULTKEY1,
+       HW_VAR_DEFAULTKEY2,
+       HW_VAR_DEFAULTKEY3,
+       HW_VAR_SIFS,
+       HW_VAR_DIFS,
+       HW_VAR_EIFS,
+       HW_VAR_SLOT_TIME,
+       HW_VAR_ACK_PREAMBLE,
+       HW_VAR_CW_CONFIG,
+       HW_VAR_CW_VALUES,
+       HW_VAR_RATE_FALLBACK_CONTROL,
+       HW_VAR_CONTENTION_WINDOW,
+       HW_VAR_RETRY_COUNT,
+       HW_VAR_TR_SWITCH,
+       HW_VAR_COMMAND,
+       HW_VAR_WPA_CONFIG,
+       HW_VAR_AMPDU_MIN_SPACE,
+       HW_VAR_SHORTGI_DENSITY,
+       HW_VAR_AMPDU_FACTOR,
+       HW_VAR_MCS_RATE_AVAILABLE,
+       HW_VAR_AC_PARAM,
+       HW_VAR_ACM_CTRL,
+       HW_VAR_DIS_Req_Qsize,
+       HW_VAR_CCX_CHNL_LOAD,
+       HW_VAR_CCX_NOISE_HISTOGRAM,
+       HW_VAR_CCX_CLM_NHM,
+       HW_VAR_TxOPLimit,
+       HW_VAR_TURBO_MODE,
+       HW_VAR_RF_STATE,
+       HW_VAR_RF_OFF_BY_HW,
+       HW_VAR_BUS_SPEED,
+        HW_VAR_SET_DEV_POWER,
+
+       HW_VAR_RCR,
+       HW_VAR_RATR_0,
+       HW_VAR_RRSR,
+       HW_VAR_CPU_RST,
+       HW_VAR_CECHK_BSSID,
+        HW_VAR_LBK_MODE,
+       HW_VAR_AES_11N_FIX,
+       HW_VAR_USB_RX_AGGR,
+       HW_VAR_USER_CONTROL_TURBO_MODE,
+       HW_VAR_RETRY_LIMIT,
+       HW_VAR_INIT_TX_RATE,
+       HW_VAR_TX_RATE_REG,
+       HW_VAR_EFUSE_USAGE,
+       HW_VAR_EFUSE_BYTES,
+       HW_VAR_AUTOLOAD_STATUS,
+       HW_VAR_RF_2R_DISABLE,
+       HW_VAR_SET_RPWM,
+       HW_VAR_H2C_FW_PWRMODE,
+       HW_VAR_H2C_FW_JOINBSSRPT,
+       HW_VAR_1X1_RECV_COMBINE,
+       HW_VAR_STOP_SEND_BEACON,
+       HW_VAR_TSF_TIMER,
+       HW_VAR_IO_CMD,
+
+       HW_VAR_RF_RECOVERY,
+       HW_VAR_H2C_FW_UPDATE_GTK,
+       HW_VAR_WF_MASK,
+       HW_VAR_WF_CRC,
+       HW_VAR_WF_IS_MAC_ADDR,
+       HW_VAR_H2C_FW_OFFLOAD,
+       HW_VAR_RESET_WFCRC,
+
+       HW_VAR_HANDLE_FW_C2H,
+       HW_VAR_DL_FW_RSVD_PAGE,
+       HW_VAR_AID,
+       HW_VAR_HW_SEQ_ENABLE,
+       HW_VAR_CORRECT_TSF,
+       HW_VAR_BCN_VALID,
+       HW_VAR_FWLPS_RF_ON,
+       HW_VAR_DUAL_TSF_RST,
+       HW_VAR_SWITCH_EPHY_WoWLAN,
+       HW_VAR_INT_MIGRATION,
+       HW_VAR_INT_AC,
+        HW_VAR_RF_TIMING,
+}HW_VARIABLES;
+
+typedef enum _RT_OP_MODE{
+       RT_OP_MODE_AP,
+       RT_OP_MODE_INFRASTRUCTURE,
+       RT_OP_MODE_IBSS,
+       RT_OP_MODE_NO_LINK,
+}RT_OP_MODE, *PRT_OP_MODE;
+
+
+#define aSifsTime       (((priv->rtllib->current_network.mode == IEEE_A)||(priv->rtllib->current_network.mode == IEEE_N_24G)||(priv->rtllib->current_network.mode == IEEE_N_5G))? 16 : 10)
+
+#define MGMT_QUEUE_NUM 5
+
+#define IEEE_CMD_SET_WPA_PARAM                 1
+#define        IEEE_CMD_SET_WPA_IE                     2
+#define IEEE_CMD_SET_ENCRYPTION                        3
+#define IEEE_CMD_MLME                          4
+
+#define IEEE_PARAM_WPA_ENABLED                 1
+#define IEEE_PARAM_TKIP_COUNTERMEASURES                2
+#define IEEE_PARAM_DROP_UNENCRYPTED            3
+#define IEEE_PARAM_PRIVACY_INVOKED             4
+#define IEEE_PARAM_AUTH_ALGS                   5
+#define IEEE_PARAM_IEEE_802_1X                 6
+#define IEEE_PARAM_WPAX_SELECT                 7
+#define IEEE_PROTO_WPA                         1
+#define IEEE_PROTO_RSN                         2
+#define IEEE_WPAX_USEGROUP                     0
+#define IEEE_WPAX_WEP40                                1
+#define IEEE_WPAX_TKIP                         2
+#define IEEE_WPAX_WRAP                         3
+#define IEEE_WPAX_CCMP                         4
+#define IEEE_WPAX_WEP104                       5
+
+#define IEEE_KEY_MGMT_IEEE8021X                        1
+#define IEEE_KEY_MGMT_PSK                      2
+
+#define IEEE_MLME_STA_DEAUTH                   1
+#define IEEE_MLME_STA_DISASSOC                 2
+
+
+#define IEEE_CRYPT_ERR_UNKNOWN_ALG             2
+#define IEEE_CRYPT_ERR_UNKNOWN_ADDR            3
+#define IEEE_CRYPT_ERR_CRYPT_INIT_FAILED       4
+#define IEEE_CRYPT_ERR_KEY_SET_FAILED          5
+#define IEEE_CRYPT_ERR_TX_KEY_SET_FAILED       6
+#define IEEE_CRYPT_ERR_CARD_CONF_FAILED                7
+#define        IEEE_CRYPT_ALG_NAME_LEN                 16
+
+#define MAX_IE_LEN  0xff
+#ifdef ENABLE_NULL_PT_DEBUG
+#define RT_ASSERT_RET(_Exp)                                                            \
+               if (!(_Exp))                                                                    \
+               {                                                                                       \
+                       printk("Rtl819x: ");                                    \
+                       printk( "Assertion failed! %s,%s,line=%d\n", \
+                       #_Exp,__func__,__LINE__);          \
+                       return;                                         \
+               }
+#define RT_ASSERT_RET_VALUE(_Exp,Ret)                                                          \
+               if (!(_Exp))                                                                    \
+               {                                                                                       \
+                       printk("Rtl819x: ");                                    \
+                       printk( "Assertion failed! %s,%s,line=%d\n", \
+                       #_Exp,__func__,__LINE__);          \
+                       return (Ret);                                           \
+               }
+#else
+#define RT_ASSERT_RET(_Exp) do {} while(0)
+#define RT_ASSERT_RET_VALUE(_Exp,Ret) do {} while(0)
+#endif
+
+typedef struct ieee_param {
+       u32 cmd;
+       u8 sta_addr[ETH_ALEN];
+        union {
+               struct {
+                       u8 name;
+                       u32 value;
+               } wpa_param;
+               struct {
+                       u32 len;
+                       u8 reserved[32];
+                       u8 data[0];
+               } wpa_ie;
+               struct{
+                       int command;
+                       int reason_code;
+               } mlme;
+               struct {
+                       u8 alg[IEEE_CRYPT_ALG_NAME_LEN];
+                       u8 set_tx;
+                       u32 err;
+                       u8 idx;
+                       u8 seq[8]; /* sequence counter (set: RX, get: TX) */
+                       u16 key_len;
+                       u8 key[0];
+               } crypt;
+       } u;
+}ieee_param;
+
+
+#if WIRELESS_EXT < 17
+#define IW_QUAL_QUAL_INVALID   0x10
+#define IW_QUAL_LEVEL_INVALID  0x20
+#define IW_QUAL_NOISE_INVALID  0x40
+#define IW_QUAL_QUAL_UPDATED   0x1
+#define IW_QUAL_LEVEL_UPDATED  0x2
+#define IW_QUAL_NOISE_UPDATED  0x4
+#endif
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,9))
+#define MSECS(t)       (HZ * ((t) / 1000) + (HZ * ((t) % 1000)) / 1000)
+static inline unsigned long msleep_interruptible_rsl(unsigned int msecs)
+{
+         unsigned long timeout = MSECS(msecs) + 1;
+
+         while (timeout) {
+                 set_current_state(TASK_INTERRUPTIBLE);
+                 timeout = schedule_timeout(timeout);
+         }
+         return timeout;
+}
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,31))
+static inline void msleep(unsigned int msecs)
+{
+         unsigned long timeout = MSECS(msecs) + 1;
+
+         while (timeout) {
+                 set_current_state(TASK_UNINTERRUPTIBLE);
+                 timeout = schedule_timeout(timeout);
+         }
+}
+#endif
+#else
+#define MSECS(t) msecs_to_jiffies(t)
+#define msleep_interruptible_rsl  msleep_interruptible
+#endif
+
+#define RTLLIB_DATA_LEN                2304
+/* Maximum size for the MA-UNITDATA primitive, 802.11 standard section
+   6.2.1.1.2.
+
+   The figure in section 7.1.2 suggests a body size of up to 2312
+   bytes is allowed, which is a bit confusing, I suspect this
+   represents the 2304 bytes of real data, plus a possible 8 bytes of
+   WEP IV and ICV. (this interpretation suggested by Ramiro Barreiro) */
+#define RTLLIB_1ADDR_LEN 10
+#define RTLLIB_2ADDR_LEN 16
+#define RTLLIB_3ADDR_LEN 24
+#define RTLLIB_4ADDR_LEN 30
+#define RTLLIB_FCS_LEN    4
+#define RTLLIB_HLEN                  (RTLLIB_4ADDR_LEN)
+#define RTLLIB_FRAME_LEN             (RTLLIB_DATA_LEN + RTLLIB_HLEN)
+#define RTLLIB_MGMT_HDR_LEN 24
+#define RTLLIB_DATA_HDR3_LEN 24
+#define RTLLIB_DATA_HDR4_LEN 30
+
+#define RTLLIB_SKBBUFFER_SIZE 2500
+
+#define MIN_FRAG_THRESHOLD     256U
+#define MAX_FRAG_THRESHOLD     2346U
+#define MAX_HT_DATA_FRAG_THRESHOLD 0x2000
+
+#define HT_AMSDU_SIZE_4K 3839
+#define HT_AMSDU_SIZE_8K 7935
+
+/* Frame control field constants */
+#define RTLLIB_FCTL_VERS               0x0003
+#define RTLLIB_FCTL_FTYPE              0x000c
+#define RTLLIB_FCTL_STYPE              0x00f0
+#define RTLLIB_FCTL_FRAMETYPE  0x00fc
+#define RTLLIB_FCTL_TODS               0x0100
+#define RTLLIB_FCTL_FROMDS             0x0200
+#define RTLLIB_FCTL_DSTODS             0x0300
+#define RTLLIB_FCTL_MOREFRAGS  0x0400
+#define RTLLIB_FCTL_RETRY              0x0800
+#define RTLLIB_FCTL_PM         0x1000
+#define RTLLIB_FCTL_MOREDATA           0x2000
+#define RTLLIB_FCTL_WEP                0x4000
+#define RTLLIB_FCTL_ORDER              0x8000
+
+#define RTLLIB_FTYPE_MGMT              0x0000
+#define RTLLIB_FTYPE_CTL               0x0004
+#define RTLLIB_FTYPE_DATA              0x0008
+
+/* management */
+#define RTLLIB_STYPE_ASSOC_REQ 0x0000
+#define RTLLIB_STYPE_ASSOC_RESP                0x0010
+#define RTLLIB_STYPE_REASSOC_REQ       0x0020
+#define RTLLIB_STYPE_REASSOC_RESP      0x0030
+#define RTLLIB_STYPE_PROBE_REQ 0x0040
+#define RTLLIB_STYPE_PROBE_RESP        0x0050
+#define RTLLIB_STYPE_BEACON            0x0080
+#define RTLLIB_STYPE_ATIM              0x0090
+#define RTLLIB_STYPE_DISASSOC  0x00A0
+#define RTLLIB_STYPE_AUTH              0x00B0
+#define RTLLIB_STYPE_DEAUTH            0x00C0
+#define RTLLIB_STYPE_MANAGE_ACT        0x00D0
+
+/* control */
+#define RTLLIB_STYPE_PSPOLL            0x00A0
+#define RTLLIB_STYPE_RTS               0x00B0
+#define RTLLIB_STYPE_CTS               0x00C0
+#define RTLLIB_STYPE_ACK               0x00D0
+#define RTLLIB_STYPE_CFEND             0x00E0
+#define RTLLIB_STYPE_CFENDACK  0x00F0
+#define RTLLIB_STYPE_BLOCKACK   0x0094
+
+/* data */
+#define RTLLIB_STYPE_DATA              0x0000
+#define RTLLIB_STYPE_DATA_CFACK        0x0010
+#define RTLLIB_STYPE_DATA_CFPOLL       0x0020
+#define RTLLIB_STYPE_DATA_CFACKPOLL    0x0030
+#define RTLLIB_STYPE_NULLFUNC  0x0040
+#define RTLLIB_STYPE_CFACK             0x0050
+#define RTLLIB_STYPE_CFPOLL            0x0060
+#define RTLLIB_STYPE_CFACKPOLL 0x0070
+#define RTLLIB_STYPE_QOS_DATA  0x0080
+#define RTLLIB_STYPE_QOS_NULL  0x00C0
+
+#define RTLLIB_SCTL_FRAG               0x000F
+#define RTLLIB_SCTL_SEQ                0xFFF0
+
+/* QOS control */
+#define RTLLIB_QCTL_TID              0x000F
+
+#define        FC_QOS_BIT                                      BIT7
+#define IsDataFrame(pdu)                       ( ((pdu[0] & 0x0C)==0x08) ? true : false )
+#define        IsLegacyDataFrame(pdu)  (IsDataFrame(pdu) && (!(pdu[0]&FC_QOS_BIT)) )
+#define IsQoSDataFrame(pframe)  ((*(u16*)pframe&(RTLLIB_STYPE_QOS_DATA|RTLLIB_FTYPE_DATA)) == (RTLLIB_STYPE_QOS_DATA|RTLLIB_FTYPE_DATA))
+#define Frame_Order(pframe)     (*(u16*)pframe&RTLLIB_FCTL_ORDER)
+#define SN_LESS(a, b)          (((a-b)&0x800)!=0)
+#define SN_EQUAL(a, b) (a == b)
+#define MAX_DEV_ADDR_SIZE 8
+
+typedef enum _ACT_CATEGORY{
+        ACT_CAT_QOS = 1,
+        ACT_CAT_DLS = 2,
+        ACT_CAT_BA  = 3,
+        ACT_CAT_HT  = 7,
+        ACT_CAT_WMM = 17,
+} ACT_CATEGORY, *PACT_CATEGORY;
+
+typedef enum _TS_ACTION{
+        ACT_ADDTSREQ = 0,
+        ACT_ADDTSRSP = 1,
+        ACT_DELTS    = 2,
+        ACT_SCHEDULE = 3,
+} TS_ACTION, *PTS_ACTION;
+
+typedef enum _BA_ACTION{
+        ACT_ADDBAREQ = 0,
+        ACT_ADDBARSP = 1,
+        ACT_DELBA    = 2,
+} BA_ACTION, *PBA_ACTION;
+
+typedef enum _InitialGainOpType{
+       IG_Backup=0,
+       IG_Restore,
+       IG_Max
+}InitialGainOpType;
+typedef enum _LED_CTL_MODE{
+        LED_CTL_POWER_ON = 1,
+        LED_CTL_LINK = 2,
+        LED_CTL_NO_LINK = 3,
+        LED_CTL_TX = 4,
+        LED_CTL_RX = 5,
+        LED_CTL_SITE_SURVEY = 6,
+        LED_CTL_POWER_OFF = 7,
+        LED_CTL_START_TO_LINK = 8,
+        LED_CTL_START_WPS = 9,
+        LED_CTL_STOP_WPS = 10,
+        LED_CTL_START_WPS_BOTTON = 11,
+        LED_CTL_STOP_WPS_FAIL = 12,
+        LED_CTL_STOP_WPS_FAIL_OVERLAP = 13,
+}LED_CTL_MODE;
+
+typedef enum _RT_RF_TYPE_DEF
+{
+       RF_1T2R = 0,
+       RF_2T4R,
+       RF_2T2R,
+       RF_1T1R,
+       RF_2T2R_GREEN,
+       RF_819X_MAX_TYPE
+}RT_RF_TYPE_DEF;
+
+typedef enum _WIRELESS_MODE {
+       WIRELESS_MODE_UNKNOWN = 0x00,
+       WIRELESS_MODE_A = 0x01,
+       WIRELESS_MODE_B = 0x02,
+       WIRELESS_MODE_G = 0x04,
+       WIRELESS_MODE_AUTO = 0x08,
+       WIRELESS_MODE_N_24G = 0x10,
+       WIRELESS_MODE_N_5G = 0x20
+} WIRELESS_MODE;
+
+typedef enum _NETWORK_TYPE{
+       WIRELESS_11B = 1,
+       WIRELESS_11G = 2,
+       WIRELESS_11A = 4,
+       WIRELESS_11N = 8
+} WIRELESS_NETWORK_TYPE;
+
+#define OUI_SUBTYPE_WMM_INFO           0
+#define OUI_SUBTYPE_WMM_PARAM  1
+#define OUI_SUBTYPE_QOS_CAPABI 5
+
+/* debug macros */
+#define CONFIG_RTLLIB_DEBUG
+#ifdef CONFIG_RTLLIB_DEBUG
+extern u32 rtllib_debug_level;
+#define RTLLIB_DEBUG(level, fmt, args...) \
+do { if (rtllib_debug_level & (level)) \
+  printk(KERN_DEBUG "rtllib: " fmt, ## args); } while (0)
+#define RTLLIB_DEBUG_DATA(level, data, datalen)        \
+       do{ if ((rtllib_debug_level & (level)) == (level))      \
+               {       \
+                       int i;                                  \
+                       u8* pdata = (u8*) data;                 \
+                       printk(KERN_DEBUG "rtllib: %s()\n", __func__);  \
+                       for (i=0; i<(int)(datalen); i++)                        \
+                       {                                               \
+                               printk("%2.2x ", pdata[i]);             \
+                               if ((i+1)%16 == 0) printk("\n");        \
+                       }                               \
+                       printk("\n");                   \
+               }                                       \
+       } while (0)
+#else
+#define RTLLIB_DEBUG(level, fmt, args...) do {} while (0)
+#define RTLLIB_DEBUG_DATA(level, data, datalen) do {} while(0)
+#endif /* CONFIG_RTLLIB_DEBUG */
+
+/* debug macros not dependent on CONFIG_RTLLIB_DEBUG */
+
+#define MAC_FMT "%02x:%02x:%02x:%02x:%02x:%02x"
+#define MAC_ARG(x) ((u8*)(x))[0],((u8*)(x))[1],((u8*)(x))[2],((u8*)(x))[3],((u8*)(x))[4],((u8*)(x))[5]
+
+/*
+ * To use the debug system;
+ *
+ * If you are defining a new debug classification, simply add it to the #define
+ * list here in the form of:
+ *
+ * #define RTLLIB_DL_xxxx VALUE
+ *
+ * shifting value to the left one bit from the previous entry.  xxxx should be
+ * the name of the classification (for example, WEP)
+ *
+ * You then need to either add a RTLLIB_xxxx_DEBUG() macro definition for your
+ * classification, or use RTLLIB_DEBUG(RTLLIB_DL_xxxx, ...) whenever you want
+ * to send output to that classification.
+ *
+ * To add your debug level to the list of levels seen when you perform
+ *
+ * % cat /proc/net/ipw/debug_level
+ *
+ * you simply need to add your entry to the ipw_debug_levels array.
+ *
+ * If you do not see debug_level in /proc/net/ipw then you do not have
+ * CONFIG_RTLLIB_DEBUG defined in your kernel configuration
+ *
+ */
+
+#define RTLLIB_DL_INFO          (1<<0)
+#define RTLLIB_DL_WX            (1<<1)
+#define RTLLIB_DL_SCAN          (1<<2)
+#define RTLLIB_DL_STATE         (1<<3)
+#define RTLLIB_DL_MGMT          (1<<4)
+#define RTLLIB_DL_FRAG          (1<<5)
+#define RTLLIB_DL_EAP           (1<<6)
+#define RTLLIB_DL_DROP          (1<<7)
+
+#define RTLLIB_DL_TX            (1<<8)
+#define RTLLIB_DL_RX            (1<<9)
+
+#define RTLLIB_DL_HT              (1<<10)
+#define RTLLIB_DL_BA              (1<<11)
+#define RTLLIB_DL_TS              (1<<12)
+#define RTLLIB_DL_QOS           (1<<13)
+#define RTLLIB_DL_REORDER         (1<<14)
+#define RTLLIB_DL_IOT     (1<<15)
+#define RTLLIB_DL_IPS     (1<<16)
+#define RTLLIB_DL_TRACE           (1<<29)
+#define RTLLIB_DL_DATA    (1<<30)
+#define RTLLIB_DL_ERR     (1<<31)
+#define RTLLIB_ERROR(f, a...) printk(KERN_ERR "rtllib: " f, ## a)
+#define RTLLIB_WARNING(f, a...) printk(KERN_WARNING "rtllib: " f, ## a)
+#define RTLLIB_DEBUG_INFO(f, a...)   RTLLIB_DEBUG(RTLLIB_DL_INFO, f, ## a)
+
+#define RTLLIB_DEBUG_WX(f, a...)     RTLLIB_DEBUG(RTLLIB_DL_WX, f, ## a)
+#define RTLLIB_DEBUG_SCAN(f, a...)   RTLLIB_DEBUG(RTLLIB_DL_SCAN, f, ## a)
+#define RTLLIB_DEBUG_STATE(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_STATE, f, ## a)
+#define RTLLIB_DEBUG_MGMT(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_MGMT, f, ## a)
+#define RTLLIB_DEBUG_FRAG(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_FRAG, f, ## a)
+#define RTLLIB_DEBUG_EAP(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_EAP, f, ## a)
+#define RTLLIB_DEBUG_DROP(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_DROP, f, ## a)
+#define RTLLIB_DEBUG_TX(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_TX, f, ## a)
+#define RTLLIB_DEBUG_RX(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_RX, f, ## a)
+#define RTLLIB_DEBUG_QOS(f, a...)  RTLLIB_DEBUG(RTLLIB_DL_QOS, f, ## a)
+
+#ifdef CONFIG_RTLLIB_DEBUG
+/* Added by Annie, 2005-11-22. */
+#define MAX_STR_LEN     64
+/* I want to see ASCII 33 to 126 only. Otherwise, I print '?'. Annie, 2005-11-22.*/
+#define PRINTABLE(_ch)  (_ch>'!' && _ch<'~')
+#define RTLLIB_PRINT_STR(_Comp, _TitleString, _Ptr, _Len)                              \
+                        if ((_Comp) & level)                                                   \
+                        {                                                                       \
+                                int             __i;                                            \
+                                u8  buffer[MAX_STR_LEN];                                       \
+                                int length = (_Len<MAX_STR_LEN)? _Len : (MAX_STR_LEN-1) ;      \
+                                memset(buffer, 0, MAX_STR_LEN);                                        \
+                                memcpy(buffer, (u8 *)_Ptr, length );                           \
+                                for ( __i=0; __i<MAX_STR_LEN; __i++ )                            \
+                                {                                                               \
+                                     if ( !PRINTABLE(buffer[__i]) )   buffer[__i] = '?';               \
+                                }                                                               \
+                                buffer[length] = '\0';                                          \
+                                printk("Rtl819x: ");                                           \
+                                printk(_TitleString);                                         \
+                                printk(": %d, <%s>\n", _Len, buffer);                         \
+                        }
+#else
+#define RTLLIB_PRINT_STR(_Comp, _TitleString, _Ptr, _Len)  do {} while (0)
+#endif
+
+#ifndef ETH_P_PAE
+#define ETH_P_PAE 0x888E /* Port Access Entity (IEEE 802.1X) */
+#define ETH_P_IP       0x0800          /* Internet Protocol packet     */
+#define ETH_P_ARP      0x0806          /* Address Resolution packet    */
+#endif /* ETH_P_PAE */
+
+#define ETH_P_PREAUTH 0x88C7 /* IEEE 802.11i pre-authentication */
+
+#ifndef ETH_P_80211_RAW
+#define ETH_P_80211_RAW (ETH_P_ECONET + 1)
+#endif
+
+/* IEEE 802.11 defines */
+
+#define P80211_OUI_LEN 3
+
+struct rtllib_snap_hdr {
+
+        u8    dsap;   /* always 0xAA */
+        u8    ssap;   /* always 0xAA */
+        u8    ctrl;   /* always 0x03 */
+        u8    oui[P80211_OUI_LEN];    /* organizational universal id */
+
+} __attribute__ ((packed));
+
+enum _REG_PREAMBLE_MODE{
+       PREAMBLE_LONG = 1,
+       PREAMBLE_AUTO = 2,
+       PREAMBLE_SHORT= 3,
+};
+
+#define SNAP_SIZE sizeof(struct rtllib_snap_hdr)
+
+#define WLAN_FC_GET_VERS(fc) ((fc) & RTLLIB_FCTL_VERS)
+#define WLAN_FC_GET_TYPE(fc) ((fc) & RTLLIB_FCTL_FTYPE)
+#define WLAN_FC_GET_STYPE(fc) ((fc) & RTLLIB_FCTL_STYPE)
+#define WLAN_FC_MORE_DATA(fc) ((fc) & RTLLIB_FCTL_MOREDATA)
+
+#define WLAN_FC_GET_FRAMETYPE(fc) ((fc) & RTLLIB_FCTL_FRAMETYPE)
+#define WLAN_GET_SEQ_FRAG(seq) ((seq) & RTLLIB_SCTL_FRAG)
+#define WLAN_GET_SEQ_SEQ(seq)  (((seq) & RTLLIB_SCTL_SEQ) >> 4)
+
+#ifndef CONFIG_CFG_80211
+/* Authentication algorithms */
+#define WLAN_AUTH_OPEN 0
+#define WLAN_AUTH_SHARED_KEY 1
+#define WLAN_AUTH_LEAP 128
+
+#define WLAN_AUTH_CHALLENGE_LEN 128
+
+#define WLAN_CAPABILITY_ESS (1<<0)
+#define WLAN_CAPABILITY_IBSS (1<<1)
+#define WLAN_CAPABILITY_CF_POLLABLE (1<<2)
+#define WLAN_CAPABILITY_CF_POLL_REQUEST (1<<3)
+#define WLAN_CAPABILITY_PRIVACY (1<<4)
+#define WLAN_CAPABILITY_SHORT_PREAMBLE (1<<5)
+#define WLAN_CAPABILITY_PBCC (1<<6)
+#define WLAN_CAPABILITY_CHANNEL_AGILITY (1<<7)
+#define WLAN_CAPABILITY_SPECTRUM_MGMT (1<<8)
+#define WLAN_CAPABILITY_QOS (1<<9)
+#define WLAN_CAPABILITY_SHORT_SLOT_TIME (1<<10)
+#define WLAN_CAPABILITY_DSSS_OFDM (1<<13)
+
+/* 802.11g ERP information element */
+#define WLAN_ERP_NON_ERP_PRESENT (1<<0)
+#define WLAN_ERP_USE_PROTECTION (1<<1)
+#define WLAN_ERP_BARKER_PREAMBLE (1<<2)
+
+/* Status codes */
+enum rtllib_statuscode {
+        WLAN_STATUS_SUCCESS = 0,
+        WLAN_STATUS_UNSPECIFIED_FAILURE = 1,
+        WLAN_STATUS_CAPS_UNSUPPORTED = 10,
+        WLAN_STATUS_REASSOC_NO_ASSOC = 11,
+        WLAN_STATUS_ASSOC_DENIED_UNSPEC = 12,
+        WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG = 13,
+        WLAN_STATUS_UNKNOWN_AUTH_TRANSACTION = 14,
+        WLAN_STATUS_CHALLENGE_FAIL = 15,
+        WLAN_STATUS_AUTH_TIMEOUT = 16,
+        WLAN_STATUS_AP_UNABLE_TO_HANDLE_NEW_STA = 17,
+        WLAN_STATUS_ASSOC_DENIED_RATES = 18,
+        /* 802.11b */
+        WLAN_STATUS_ASSOC_DENIED_NOSHORTPREAMBLE = 19,
+        WLAN_STATUS_ASSOC_DENIED_NOPBCC = 20,
+        WLAN_STATUS_ASSOC_DENIED_NOAGILITY = 21,
+        /* 802.11h */
+        WLAN_STATUS_ASSOC_DENIED_NOSPECTRUM = 22,
+        WLAN_STATUS_ASSOC_REJECTED_BAD_POWER = 23,
+        WLAN_STATUS_ASSOC_REJECTED_BAD_SUPP_CHAN = 24,
+        /* 802.11g */
+        WLAN_STATUS_ASSOC_DENIED_NOSHORTTIME = 25,
+        WLAN_STATUS_ASSOC_DENIED_NODSSSOFDM = 26,
+        /* 802.11i */
+        WLAN_STATUS_INVALID_IE = 40,
+        WLAN_STATUS_INVALID_GROUP_CIPHER = 41,
+        WLAN_STATUS_INVALID_PAIRWISE_CIPHER = 42,
+        WLAN_STATUS_INVALID_AKMP = 43,
+        WLAN_STATUS_UNSUPP_RSN_VERSION = 44,
+        WLAN_STATUS_INVALID_RSN_IE_CAP = 45,
+        WLAN_STATUS_CIPHER_SUITE_REJECTED = 46,
+};
+
+/* Reason codes */
+enum rtllib_reasoncode {
+        WLAN_REASON_UNSPECIFIED = 1,
+        WLAN_REASON_PREV_AUTH_NOT_VALID = 2,
+        WLAN_REASON_DEAUTH_LEAVING = 3,
+        WLAN_REASON_DISASSOC_DUE_TO_INACTIVITY = 4,
+        WLAN_REASON_DISASSOC_AP_BUSY = 5,
+        WLAN_REASON_CLASS2_FRAME_FROM_NONAUTH_STA = 6,
+        WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA = 7,
+        WLAN_REASON_DISASSOC_STA_HAS_LEFT = 8,
+        WLAN_REASON_STA_REQ_ASSOC_WITHOUT_AUTH = 9,
+        /* 802.11h */
+        WLAN_REASON_DISASSOC_BAD_POWER = 10,
+        WLAN_REASON_DISASSOC_BAD_SUPP_CHAN = 11,
+        /* 802.11i */
+        WLAN_REASON_INVALID_IE = 13,
+        WLAN_REASON_MIC_FAILURE = 14,
+        WLAN_REASON_4WAY_HANDSHAKE_TIMEOUT = 15,
+        WLAN_REASON_GROUP_KEY_HANDSHAKE_TIMEOUT = 16,
+        WLAN_REASON_IE_DIFFERENT = 17,
+        WLAN_REASON_INVALID_GROUP_CIPHER = 18,
+        WLAN_REASON_INVALID_PAIRWISE_CIPHER = 19,
+        WLAN_REASON_INVALID_AKMP = 20,
+        WLAN_REASON_UNSUPP_RSN_VERSION = 21,
+        WLAN_REASON_INVALID_RSN_IE_CAP = 22,
+        WLAN_REASON_IEEE8021X_FAILED = 23,
+        WLAN_REASON_CIPHER_SUITE_REJECTED = 24,
+};
+#endif
+
+#define RTLLIB_STATMASK_SIGNAL (1<<0)
+#define RTLLIB_STATMASK_RSSI (1<<1)
+#define RTLLIB_STATMASK_NOISE (1<<2)
+#define RTLLIB_STATMASK_RATE (1<<3)
+#define RTLLIB_STATMASK_WEMASK 0x7
+
+#define RTLLIB_CCK_MODULATION    (1<<0)
+#define RTLLIB_OFDM_MODULATION   (1<<1)
+
+#define RTLLIB_24GHZ_BAND     (1<<0)
+#define RTLLIB_52GHZ_BAND     (1<<1)
+
+#define RTLLIB_CCK_RATE_LEN            4
+#define RTLLIB_CCK_RATE_1MB                    0x02
+#define RTLLIB_CCK_RATE_2MB                    0x04
+#define RTLLIB_CCK_RATE_5MB                    0x0B
+#define RTLLIB_CCK_RATE_11MB                   0x16
+#define RTLLIB_OFDM_RATE_LEN           8
+#define RTLLIB_OFDM_RATE_6MB                   0x0C
+#define RTLLIB_OFDM_RATE_9MB                   0x12
+#define RTLLIB_OFDM_RATE_12MB          0x18
+#define RTLLIB_OFDM_RATE_18MB          0x24
+#define RTLLIB_OFDM_RATE_24MB          0x30
+#define RTLLIB_OFDM_RATE_36MB          0x48
+#define RTLLIB_OFDM_RATE_48MB          0x60
+#define RTLLIB_OFDM_RATE_54MB          0x6C
+#define RTLLIB_BASIC_RATE_MASK         0x80
+
+#define RTLLIB_CCK_RATE_1MB_MASK               (1<<0)
+#define RTLLIB_CCK_RATE_2MB_MASK               (1<<1)
+#define RTLLIB_CCK_RATE_5MB_MASK               (1<<2)
+#define RTLLIB_CCK_RATE_11MB_MASK              (1<<3)
+#define RTLLIB_OFDM_RATE_6MB_MASK              (1<<4)
+#define RTLLIB_OFDM_RATE_9MB_MASK              (1<<5)
+#define RTLLIB_OFDM_RATE_12MB_MASK             (1<<6)
+#define RTLLIB_OFDM_RATE_18MB_MASK             (1<<7)
+#define RTLLIB_OFDM_RATE_24MB_MASK             (1<<8)
+#define RTLLIB_OFDM_RATE_36MB_MASK             (1<<9)
+#define RTLLIB_OFDM_RATE_48MB_MASK             (1<<10)
+#define RTLLIB_OFDM_RATE_54MB_MASK             (1<<11)
+
+#define RTLLIB_CCK_RATES_MASK          0x0000000F
+#define RTLLIB_CCK_BASIC_RATES_MASK    (RTLLIB_CCK_RATE_1MB_MASK | \
+       RTLLIB_CCK_RATE_2MB_MASK)
+#define RTLLIB_CCK_DEFAULT_RATES_MASK  (RTLLIB_CCK_BASIC_RATES_MASK | \
+        RTLLIB_CCK_RATE_5MB_MASK | \
+        RTLLIB_CCK_RATE_11MB_MASK)
+
+#define RTLLIB_OFDM_RATES_MASK         0x00000FF0
+#define RTLLIB_OFDM_BASIC_RATES_MASK   (RTLLIB_OFDM_RATE_6MB_MASK | \
+       RTLLIB_OFDM_RATE_12MB_MASK | \
+       RTLLIB_OFDM_RATE_24MB_MASK)
+#define RTLLIB_OFDM_DEFAULT_RATES_MASK (RTLLIB_OFDM_BASIC_RATES_MASK | \
+       RTLLIB_OFDM_RATE_9MB_MASK  | \
+       RTLLIB_OFDM_RATE_18MB_MASK | \
+       RTLLIB_OFDM_RATE_36MB_MASK | \
+       RTLLIB_OFDM_RATE_48MB_MASK | \
+       RTLLIB_OFDM_RATE_54MB_MASK)
+#define RTLLIB_DEFAULT_RATES_MASK (RTLLIB_OFDM_DEFAULT_RATES_MASK | \
+                                RTLLIB_CCK_DEFAULT_RATES_MASK)
+
+#define RTLLIB_NUM_OFDM_RATES      8
+#define RTLLIB_NUM_CCK_RATES               4
+#define RTLLIB_OFDM_SHIFT_MASK_A         4
+
+
+/* this is stolen and modified from the madwifi driver*/
+#define RTLLIB_FC0_TYPE_MASK           0x0c
+#define RTLLIB_FC0_TYPE_DATA           0x08
+#define RTLLIB_FC0_SUBTYPE_MASK        0xB0
+#define RTLLIB_FC0_SUBTYPE_QOS 0x80
+
+#define RTLLIB_QOS_HAS_SEQ(fc) \
+       (((fc) & (RTLLIB_FC0_TYPE_MASK | RTLLIB_FC0_SUBTYPE_MASK)) == \
+        (RTLLIB_FC0_TYPE_DATA | RTLLIB_FC0_SUBTYPE_QOS))
+
+/* this is stolen from ipw2200 driver */
+#define IEEE_IBSS_MAC_HASH_SIZE 31
+struct ieee_ibss_seq {
+       u8 mac[ETH_ALEN];
+       u16 seq_num[17];
+       u16 frag_num[17];
+       unsigned long packet_time[17];
+       struct list_head list;
+};
+
+/* NOTE: This data is for statistical purposes; not all hardware provides this
+ *       information for frames received.  Not setting these will not cause
+ *       any adverse affects. */
+struct rtllib_rx_stats {
+#if 1
+       u32 mac_time[2];
+       s8  rssi;
+       u8  signal;
+       u8  noise;
+       u16 rate; /* in 100 kbps */
+       u8  received_channel;
+       u8  control;
+       u8  mask;
+       u8  freq;
+       u16 len;
+       u64 tsf;
+       u32 beacon_time;
+       u8  nic_type;
+       u16 Length;
+       u8  SignalQuality;
+       s32 RecvSignalPower;
+       s8  RxPower;
+       u8  SignalStrength;
+       u16 bHwError:1;
+       u16 bCRC:1;
+       u16 bICV:1;
+       u16 bShortPreamble:1;
+       u16 Antenna:1;
+       u16 Decrypted:1;
+       u16 Wakeup:1;
+       u16 Reserved0:1;
+       u8  AGC;
+       u32 TimeStampLow;
+       u32 TimeStampHigh;
+       bool bShift;
+       bool bIsQosData;
+       u8   UserPriority;
+
+       u8    RxDrvInfoSize;
+       u8    RxBufShift;
+       bool  bIsAMPDU;
+       bool  bFirstMPDU;
+       bool  bContainHTC;
+       bool  RxIs40MHzPacket;
+       u32   RxPWDBAll;
+       u8    RxMIMOSignalStrength[4];
+       s8    RxMIMOSignalQuality[2];
+       bool  bPacketMatchBSSID;
+       bool  bIsCCK;
+       bool  bPacketToSelf;
+       u8*    virtual_address;
+       u16    packetlength;
+       u16    fraglength;
+       u16    fragoffset;
+       u16    ntotalfrag;
+       bool   bisrxaggrsubframe;
+       bool   bPacketBeacon;
+       bool   bToSelfBA;
+       char   cck_adc_pwdb[4];
+       u16    Seq_Num;
+       u8     nTotalAggPkt;
+#ifdef TCP_CSUM_OFFLOAD_RX
+       u8      tcp_csum_valid;
+#endif
+#endif
+
+};
+
+/* IEEE 802.11 requires that STA supports concurrent reception of at least
+ * three fragmented frames. This define can be increased to support more
+ * concurrent frames, but it should be noted that each entry can consume about
+ * 2 kB of RAM and increasing cache size will slow down frame reassembly. */
+#define RTLLIB_FRAG_CACHE_LEN 4
+
+struct rtllib_frag_entry {
+       unsigned long first_frag_time;
+       unsigned int seq;
+       unsigned int last_frag;
+       struct sk_buff *skb;
+       u8 src_addr[ETH_ALEN];
+       u8 dst_addr[ETH_ALEN];
+};
+
+struct rtllib_stats {
+       unsigned int tx_unicast_frames;
+       unsigned int tx_multicast_frames;
+       unsigned int tx_fragments;
+       unsigned int tx_unicast_octets;
+       unsigned int tx_multicast_octets;
+       unsigned int tx_deferred_transmissions;
+       unsigned int tx_single_retry_frames;
+       unsigned int tx_multiple_retry_frames;
+       unsigned int tx_retry_limit_exceeded;
+       unsigned int tx_discards;
+       unsigned int rx_unicast_frames;
+       unsigned int rx_multicast_frames;
+       unsigned int rx_fragments;
+       unsigned int rx_unicast_octets;
+       unsigned int rx_multicast_octets;
+       unsigned int rx_fcs_errors;
+       unsigned int rx_discards_no_buffer;
+       unsigned int tx_discards_wrong_sa;
+       unsigned int rx_discards_undecryptable;
+       unsigned int rx_message_in_msg_fragments;
+       unsigned int rx_message_in_bad_msg_fragments;
+};
+
+struct rtllib_device;
+
+#include "rtllib_crypt.h"
+
+#define SEC_KEY_1         (1<<0)
+#define SEC_KEY_2         (1<<1)
+#define SEC_KEY_3         (1<<2)
+#define SEC_KEY_4         (1<<3)
+#define SEC_ACTIVE_KEY    (1<<4)
+#define SEC_AUTH_MODE     (1<<5)
+#define SEC_UNICAST_GROUP (1<<6)
+#define SEC_LEVEL         (1<<7)
+#define SEC_ENABLED       (1<<8)
+#define SEC_ENCRYPT       (1<<9)
+
+#define SEC_LEVEL_0      0 /* None */
+#define SEC_LEVEL_1      1 /* WEP 40 and 104 bit */
+#define SEC_LEVEL_2      2 /* Level 1 + TKIP */
+#define SEC_LEVEL_2_CKIP 3 /* Level 1 + CKIP */
+#define SEC_LEVEL_3      4 /* Level 2 + CCMP */
+
+#define SEC_ALG_NONE            0
+#define SEC_ALG_WEP             1
+#define SEC_ALG_TKIP            2
+#define SEC_ALG_CCMP            4
+
+#define WEP_KEYS               4
+#define WEP_KEY_LEN            13
+#define SCM_KEY_LEN             32
+#define SCM_TEMPORAL_KEY_LENGTH 16
+
+struct rtllib_security {
+       u16 active_key:2,
+            enabled:1,
+           auth_mode:2,
+            auth_algo:4,
+            unicast_uses_group:1,
+           encrypt:1;
+       u8 key_sizes[WEP_KEYS];
+       u8 keys[WEP_KEYS][SCM_KEY_LEN];
+       u8 level;
+       u16 flags;
+} __attribute__ ((packed));
+
+
+/*
+ 802.11 data frame from AP
+      ,-------------------------------------------------------------------.
+Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
+      |------|------|---------|---------|---------|------|---------|------|
+Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  frame  |  fcs |
+      |      | tion | (BSSID) |         |         | ence |  data   |      |
+      `-------------------------------------------------------------------'
+Total: 28-2340 bytes
+*/
+
+/* Management Frame Information Element Types */
+enum rtllib_mfie {
+        MFIE_TYPE_SSID = 0,
+        MFIE_TYPE_RATES = 1,
+        MFIE_TYPE_FH_SET = 2,
+        MFIE_TYPE_DS_SET = 3,
+        MFIE_TYPE_CF_SET = 4,
+        MFIE_TYPE_TIM = 5,
+        MFIE_TYPE_IBSS_SET = 6,
+        MFIE_TYPE_COUNTRY = 7,
+        MFIE_TYPE_HOP_PARAMS = 8,
+        MFIE_TYPE_HOP_TABLE = 9,
+        MFIE_TYPE_REQUEST = 10,
+        MFIE_TYPE_CHALLENGE = 16,
+        MFIE_TYPE_POWER_CONSTRAINT = 32,
+        MFIE_TYPE_POWER_CAPABILITY = 33,
+        MFIE_TYPE_TPC_REQUEST = 34,
+        MFIE_TYPE_TPC_REPORT = 35,
+        MFIE_TYPE_SUPP_CHANNELS = 36,
+        MFIE_TYPE_CSA = 37,
+        MFIE_TYPE_MEASURE_REQUEST = 38,
+        MFIE_TYPE_MEASURE_REPORT = 39,
+        MFIE_TYPE_QUIET = 40,
+        MFIE_TYPE_IBSS_DFS = 41,
+        MFIE_TYPE_ERP = 42,
+       MFIE_TYPE_HT_CAP= 45,
+       MFIE_TYPE_RSN = 48,
+       MFIE_TYPE_RATES_EX = 50,
+       MFIE_TYPE_HT_INFO= 61,
+       MFIE_TYPE_AIRONET=133,
+       MFIE_TYPE_GENERIC = 221,
+        MFIE_TYPE_QOS_PARAMETER = 222,
+};
+
+/* Minimal header; can be used for passing 802.11 frames with sufficient
+ * information to determine what type of underlying data type is actually
+ * stored in the data. */
+struct rtllib_pspoll_hdr {
+        __le16 frame_ctl;
+        __le16 aid;
+       u8 bssid[ETH_ALEN];
+        u8 ta[ETH_ALEN];
+} __attribute__ ((packed));
+
+struct rtllib_hdr {
+        __le16 frame_ctl;
+        __le16 duration_id;
+        u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_hdr_1addr {
+        __le16 frame_ctl;
+        __le16 duration_id;
+        u8 addr1[ETH_ALEN];
+        u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_hdr_2addr {
+        __le16 frame_ctl;
+        __le16 duration_id;
+        u8 addr1[ETH_ALEN];
+        u8 addr2[ETH_ALEN];
+        u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_hdr_3addr {
+       __le16 frame_ctl;
+       __le16 duration_id;
+       u8 addr1[ETH_ALEN];
+       u8 addr2[ETH_ALEN];
+       u8 addr3[ETH_ALEN];
+       __le16 seq_ctl;
+        u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_hdr_4addr {
+       __le16 frame_ctl;
+       __le16 duration_id;
+       u8 addr1[ETH_ALEN];
+       u8 addr2[ETH_ALEN];
+       u8 addr3[ETH_ALEN];
+       __le16 seq_ctl;
+       u8 addr4[ETH_ALEN];
+        u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_hdr_3addrqos {
+       __le16 frame_ctl;
+       __le16 duration_id;
+       u8 addr1[ETH_ALEN];
+       u8 addr2[ETH_ALEN];
+       u8 addr3[ETH_ALEN];
+       __le16 seq_ctl;
+       __le16 qos_ctl;
+       u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_hdr_4addrqos {
+       __le16 frame_ctl;
+       __le16 duration_id;
+       u8 addr1[ETH_ALEN];
+       u8 addr2[ETH_ALEN];
+       u8 addr3[ETH_ALEN];
+       __le16 seq_ctl;
+       u8 addr4[ETH_ALEN];
+       __le16 qos_ctl;
+       u8 payload[0];
+} __attribute__ ((packed));
+
+struct rtllib_info_element {
+       u8 id;
+       u8 len;
+       u8 data[0];
+} __attribute__ ((packed));
+
+struct rtllib_authentication {
+       struct rtllib_hdr_3addr header;
+       __le16 algorithm;
+       __le16 transaction;
+       __le16 status;
+       /*challenge*/
+       struct rtllib_info_element info_element[0];
+} __attribute__ ((packed));
+
+struct rtllib_disauth {
+        struct rtllib_hdr_3addr header;
+        __le16 reason;
+} __attribute__ ((packed));
+
+struct rtllib_disassoc {
+        struct rtllib_hdr_3addr header;
+        __le16 reason;
+} __attribute__ ((packed));
+
+struct rtllib_probe_request {
+       struct rtllib_hdr_3addr header;
+       /* SSID, supported rates */
+        struct rtllib_info_element info_element[0];
+} __attribute__ ((packed));
+
+struct rtllib_probe_response {
+       struct rtllib_hdr_3addr header;
+       u32 time_stamp[2];
+       __le16 beacon_interval;
+       __le16 capability;
+        /* SSID, supported rates, FH params, DS params,
+         * CF params, IBSS params, TIM (if beacon), RSN */
+        struct rtllib_info_element info_element[0];
+} __attribute__ ((packed));
+
+/* Alias beacon for probe_response */
+#define rtllib_beacon rtllib_probe_response
+
+struct rtllib_assoc_request_frame {
+       struct rtllib_hdr_3addr header;
+       __le16 capability;
+       __le16 listen_interval;
+       /* SSID, supported rates, RSN */
+        struct rtllib_info_element info_element[0];
+} __attribute__ ((packed));
+
+struct rtllib_reassoc_request_frame {
+       struct rtllib_hdr_3addr header;
+       __le16 capability;
+       __le16 listen_interval;
+       u8 current_ap[ETH_ALEN];
+       /* SSID, supported rates, RSN */
+        struct rtllib_info_element info_element[0];
+} __attribute__ ((packed));
+
+struct rtllib_assoc_response_frame {
+       struct rtllib_hdr_3addr header;
+       __le16 capability;
+       __le16 status;
+       __le16 aid;
+       struct rtllib_info_element info_element[0]; /* supported rates */
+} __attribute__ ((packed));
+
+struct rtllib_txb {
+       u8 nr_frags;
+       u8 encrypted;
+       u8 queue_index;
+       u8 rts_included;
+       u16 reserved;
+       __le16 frag_size;
+       __le16 payload_size;
+       struct sk_buff *fragments[0];
+};
+
+#define MAX_TX_AGG_COUNT                 16
+struct rtllib_drv_agg_txb {
+       u8 nr_drv_agg_frames;
+       struct sk_buff *tx_agg_frames[MAX_TX_AGG_COUNT];
+}__attribute__((packed));
+
+#define MAX_SUBFRAME_COUNT               64
+struct rtllib_rxb {
+       u8 nr_subframes;
+       struct sk_buff *subframes[MAX_SUBFRAME_COUNT];
+       u8 dst[ETH_ALEN];
+       u8 src[ETH_ALEN];
+#ifdef TCP_CSUM_OFFLOAD_RX
+       u8 tcp_csum_valid;
+#endif
+}__attribute__((packed));
+
+typedef union _frameqos {
+       u16 shortdata;
+       u8  chardata[2];
+       struct {
+               u16 tid:4;
+               u16 eosp:1;
+               u16 ack_policy:2;
+               u16 reserved:1;
+               u16 txop:8;
+       }field;
+}frameqos,*pframeqos;
+
+/* SWEEP TABLE ENTRIES NUMBER*/
+#define MAX_SWEEP_TAB_ENTRIES            42
+#define MAX_SWEEP_TAB_ENTRIES_PER_PACKET  7
+/* MAX_RATES_LENGTH needs to be 12.  The spec says 8, and many APs
+ * only use 8, and then use extended rates for the remaining supported
+ * rates.  Other APs, however, stick all of their supported rates on the
+ * main rates information element... */
+#define MAX_RATES_LENGTH                  ((u8)12)
+#define MAX_RATES_EX_LENGTH               ((u8)16)
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#define MAX_NETWORK_COUNT                  16
+#else
+#define MAX_NETWORK_COUNT                  96
+#endif
+
+#define MAX_CHANNEL_NUMBER                 161
+#define RTLLIB_SOFTMAC_SCAN_TIME          100
+#define RTLLIB_SOFTMAC_ASSOC_RETRY_TIME (HZ * 2)
+
+#define CRC_LENGTH                 4U
+
+#define MAX_WPA_IE_LEN 64
+#define MAX_WZC_IE_LEN 256
+
+#define NETWORK_EMPTY_ESSID (1<<0)
+#define NETWORK_HAS_OFDM    (1<<1)
+#define NETWORK_HAS_CCK     (1<<2)
+
+/* QoS structure */
+#define NETWORK_HAS_QOS_PARAMETERS      (1<<3)
+#define NETWORK_HAS_QOS_INFORMATION     (1<<4)
+#define NETWORK_HAS_QOS_MASK            (NETWORK_HAS_QOS_PARAMETERS | \
+                                         NETWORK_HAS_QOS_INFORMATION)
+/* 802.11h */
+#define NETWORK_HAS_POWER_CONSTRAINT    (1<<5)
+#define NETWORK_HAS_CSA                 (1<<6)
+#define NETWORK_HAS_QUIET               (1<<7)
+#define NETWORK_HAS_IBSS_DFS            (1<<8)
+#define NETWORK_HAS_TPC_REPORT          (1<<9)
+
+#define NETWORK_HAS_ERP_VALUE           (1<<10)
+
+#define QOS_QUEUE_NUM                   4
+#define QOS_OUI_LEN                     3
+#define QOS_OUI_TYPE                    2
+#define QOS_ELEMENT_ID                  221
+#define QOS_OUI_INFO_SUB_TYPE           0
+#define QOS_OUI_PARAM_SUB_TYPE          1
+#define QOS_VERSION_1                   1
+#define QOS_AIFSN_MIN_VALUE             2
+#if 1
+struct rtllib_qos_information_element {
+        u8 elementID;
+        u8 length;
+        u8 qui[QOS_OUI_LEN];
+        u8 qui_type;
+        u8 qui_subtype;
+        u8 version;
+        u8 ac_info;
+} __attribute__ ((packed));
+
+struct rtllib_qos_ac_parameter {
+        u8 aci_aifsn;
+        u8 ecw_min_max;
+        __le16 tx_op_limit;
+} __attribute__ ((packed));
+
+struct rtllib_qos_parameter_info {
+        struct rtllib_qos_information_element info_element;
+        u8 reserved;
+        struct rtllib_qos_ac_parameter ac_params_record[QOS_QUEUE_NUM];
+} __attribute__ ((packed));
+
+struct rtllib_qos_parameters {
+        __le16 cw_min[QOS_QUEUE_NUM];
+        __le16 cw_max[QOS_QUEUE_NUM];
+        u8 aifs[QOS_QUEUE_NUM];
+        u8 flag[QOS_QUEUE_NUM];
+        __le16 tx_op_limit[QOS_QUEUE_NUM];
+} __attribute__ ((packed));
+
+struct rtllib_qos_data {
+        struct rtllib_qos_parameters parameters;
+       unsigned int wmm_acm;
+        int active;
+        int supported;
+        u8 param_count;
+        u8 old_param_count;
+};
+
+struct rtllib_tim_parameters {
+        u8 tim_count;
+        u8 tim_period;
+} __attribute__ ((packed));
+
+struct rtllib_wmm_ac_param {
+       u8 ac_aci_acm_aifsn;
+       u8 ac_ecwmin_ecwmax;
+       u16 ac_txop_limit;
+};
+
+struct rtllib_wmm_ts_info {
+       u8 ac_dir_tid;
+       u8 ac_up_psb;
+       u8 reserved;
+} __attribute__ ((packed));
+
+struct rtllib_wmm_tspec_elem {
+       struct rtllib_wmm_ts_info ts_info;
+       u16 norm_msdu_size;
+       u16 max_msdu_size;
+       u32 min_serv_inter;
+       u32 max_serv_inter;
+       u32 inact_inter;
+       u32 suspen_inter;
+       u32 serv_start_time;
+       u32 min_data_rate;
+       u32 mean_data_rate;
+       u32 peak_data_rate;
+       u32 max_burst_size;
+       u32 delay_bound;
+       u32 min_phy_rate;
+       u16 surp_band_allow;
+       u16 medium_time;
+}__attribute__((packed));
+#endif
+enum eap_type {
+       EAP_PACKET = 0,
+       EAPOL_START,
+       EAPOL_LOGOFF,
+       EAPOL_KEY,
+       EAPOL_ENCAP_ASF_ALERT
+};
+
+static const char *eap_types[] = {
+       [EAP_PACKET]            = "EAP-Packet",
+       [EAPOL_START]           = "EAPOL-Start",
+       [EAPOL_LOGOFF]          = "EAPOL-Logoff",
+       [EAPOL_KEY]             = "EAPOL-Key",
+       [EAPOL_ENCAP_ASF_ALERT] = "EAPOL-Encap-ASF-Alert"
+};
+
+static inline const char *eap_get_type(int type)
+{
+       return ((u32)type >= ARRAY_SIZE(eap_types)) ? "Unknown" : eap_types[type];
+}
+static inline u8 Frame_QoSTID(u8* buf)
+{
+       struct rtllib_hdr_3addr *hdr;
+       u16 fc;
+       hdr = (struct rtllib_hdr_3addr *)buf;
+       fc = le16_to_cpu(hdr->frame_ctl);
+       return (u8)((frameqos*)(buf + (((fc & RTLLIB_FCTL_TODS)&&(fc & RTLLIB_FCTL_FROMDS))? 30 : 24)))->field.tid;
+}
+
+
+struct eapol {
+       u8 snap[6];
+       u16 ethertype;
+       u8 version;
+       u8 type;
+       u16 length;
+} __attribute__ ((packed));
+
+struct rtllib_softmac_stats{
+       unsigned int rx_ass_ok;
+       unsigned int rx_ass_err;
+       unsigned int rx_probe_rq;
+       unsigned int tx_probe_rs;
+       unsigned int tx_beacons;
+       unsigned int rx_auth_rq;
+       unsigned int rx_auth_rs_ok;
+       unsigned int rx_auth_rs_err;
+       unsigned int tx_auth_rq;
+       unsigned int no_auth_rs;
+       unsigned int no_ass_rs;
+       unsigned int tx_ass_rq;
+       unsigned int rx_ass_rq;
+       unsigned int tx_probe_rq;
+       unsigned int reassoc;
+       unsigned int swtxstop;
+       unsigned int swtxawake;
+       unsigned char CurrentShowTxate;
+       unsigned char last_packet_rate;
+       unsigned int txretrycount;
+};
+
+#define BEACON_PROBE_SSID_ID_POSITION 12
+
+struct rtllib_info_element_hdr {
+       u8 id;
+       u8 len;
+} __attribute__ ((packed));
+
+/*
+ * These are the data types that can make up management packets
+ *
+       u16 auth_algorithm;
+       u16 auth_sequence;
+       u16 beacon_interval;
+       u16 capability;
+       u8 current_ap[ETH_ALEN];
+       u16 listen_interval;
+       struct {
+               u16 association_id:14, reserved:2;
+       } __attribute__ ((packed));
+       u32 time_stamp[2];
+       u16 reason;
+       u16 status;
+*/
+
+#define RTLLIB_DEFAULT_TX_ESSID "Penguin"
+#define RTLLIB_DEFAULT_BASIC_RATE 2
+
+enum {WMM_all_frame, WMM_two_frame, WMM_four_frame, WMM_six_frame};
+#define MAX_SP_Len  (WMM_all_frame << 4)
+#define RTLLIB_QOS_TID 0x0f
+#define QOS_CTL_NOTCONTAIN_ACK (0x01 << 5)
+
+#define RTLLIB_DTIM_MBCAST 4
+#define RTLLIB_DTIM_UCAST 2
+#define RTLLIB_DTIM_VALID 1
+#define RTLLIB_DTIM_INVALID 0
+
+#define RTLLIB_PS_DISABLED 0
+#define RTLLIB_PS_UNICAST RTLLIB_DTIM_UCAST
+#define RTLLIB_PS_MBCAST RTLLIB_DTIM_MBCAST
+
+#ifdef WMM_Hang_8187
+#undef WMM_Hang_8187
+#endif
+
+#define WME_AC_BK   0x00
+#define WME_AC_BE   0x01
+#define WME_AC_VI   0x02
+#define WME_AC_VO   0x03
+#define WME_ACI_MASK 0x03
+#define WME_AIFSN_MASK 0x03
+#define WME_AC_PRAM_LEN 16
+
+#define MAX_RECEIVE_BUFFER_SIZE 9100
+
+#if 1
+#define UP2AC(up) (               \
+       ((up) < 1) ? WME_AC_BE : \
+       ((up) < 3) ? WME_AC_BK : \
+       ((up) < 4) ? WME_AC_BE : \
+       ((up) < 6) ? WME_AC_VI : \
+       WME_AC_VO)
+#endif
+#define AC2UP(_ac)     (       \
+       ((_ac) == WME_AC_VO) ? 6 : \
+       ((_ac) == WME_AC_VI) ? 5 : \
+       ((_ac) == WME_AC_BK) ? 1 : \
+       0)
+
+#define        ETHER_ADDR_LEN          6       /* length of an Ethernet address */
+#define ETHERNET_HEADER_SIZE    14      /* length of two Ethernet address plus ether type*/
+
+struct ether_header {
+       u8 ether_dhost[ETHER_ADDR_LEN];
+       u8 ether_shost[ETHER_ADDR_LEN];
+       u16 ether_type;
+} __attribute__((packed));
+
+#ifndef ETHERTYPE_PAE
+#define        ETHERTYPE_PAE   0x888e          /* EAPOL PAE/802.1x */
+#endif
+#ifndef ETHERTYPE_IP
+#define        ETHERTYPE_IP    0x0800          /* IP protocol */
+#endif
+
+
+typedef enum _erp_t{
+       ERP_NonERPpresent       = 0x01,
+       ERP_UseProtection       = 0x02,
+       ERP_BarkerPreambleMode = 0x04,
+} erp_t;
+
+struct rtllib_network {
+       /* These entries are used to identify a unique network */
+       u8 bssid[ETH_ALEN];
+       u8 channel;
+       /* Ensure null-terminated for any debug msgs */
+       u8 ssid[IW_ESSID_MAX_SIZE + 1];
+       u8 ssid_len;
+       u8 hidden_ssid[IW_ESSID_MAX_SIZE + 1];
+       u8 hidden_ssid_len;
+       struct rtllib_qos_data qos_data;
+
+       bool    bWithAironetIE;
+       bool    bCkipSupported;
+       bool    bCcxRmEnable;
+       u16     CcxRmState[2];
+       bool    bMBssidValid;
+       u8      MBssidMask;
+       u8      MBssid[6];
+       bool    bWithCcxVerNum;
+       u8      BssCcxVerNumber;
+       /* These are network statistics */
+       struct rtllib_rx_stats stats;
+       u16 capability;
+       u8  rates[MAX_RATES_LENGTH];
+       u8  rates_len;
+       u8  rates_ex[MAX_RATES_EX_LENGTH];
+       u8  rates_ex_len;
+       unsigned long last_scanned;
+       u8  mode;
+       u32 flags;
+       u32 last_associate;
+       u32 time_stamp[2];
+       u16 beacon_interval;
+       u16 listen_interval;
+       u16 atim_window;
+       u8  erp_value;
+       u8  wpa_ie[MAX_WPA_IE_LEN];
+       size_t wpa_ie_len;
+       u8  rsn_ie[MAX_WPA_IE_LEN];
+       size_t rsn_ie_len;
+       u8  wzc_ie[MAX_WZC_IE_LEN];
+       size_t wzc_ie_len;
+
+        struct rtllib_tim_parameters tim;
+       u8  dtim_period;
+       u8  dtim_data;
+       u32 last_dtim_sta_time[2];
+
+        u8 wmm_info;
+        struct rtllib_wmm_ac_param wmm_param[4];
+       u8 Turbo_Enable;
+#ifdef ENABLE_DOT11D
+       u16 CountryIeLen;
+       u8 CountryIeBuf[MAX_IE_LEN];
+#endif
+       BSS_HT  bssht;
+       bool broadcom_cap_exist;
+       bool realtek_cap_exit;
+       bool marvell_cap_exist;
+       bool ralink_cap_exist;
+       bool atheros_cap_exist;
+       bool cisco_cap_exist;
+       bool airgo_cap_exist;
+       bool unknown_cap_exist;
+       bool    berp_info_valid;
+       bool buseprotection;
+       bool bIsNetgear854T;
+       u8 SignalStrength;
+       u8 RSSI;
+       struct list_head list;
+};
+
+#if 1
+enum rtllib_state {
+
+       /* the card is not linked at all */
+       RTLLIB_NOLINK = 0,
+
+       /* RTLLIB_ASSOCIATING* are for BSS client mode
+        * the driver shall not perform RX filtering unless
+        * the state is LINKED.
+        * The driver shall just check for the state LINKED and
+        * defaults to NOLINK for ALL the other states (including
+        * LINKED_SCANNING)
+        */
+
+       /* the association procedure will start (wq scheduling)*/
+       RTLLIB_ASSOCIATING,
+       RTLLIB_ASSOCIATING_RETRY,
+
+       /* the association procedure is sending AUTH request*/
+       RTLLIB_ASSOCIATING_AUTHENTICATING,
+
+       /* the association procedure has successfully authentcated
+        * and is sending association request
+        */
+       RTLLIB_ASSOCIATING_AUTHENTICATED,
+
+       /* the link is ok. the card associated to a BSS or linked
+        * to a ibss cell or acting as an AP and creating the bss
+        */
+       RTLLIB_LINKED,
+
+       /* same as LINKED, but the driver shall apply RX filter
+        * rules as we are in NO_LINK mode. As the card is still
+        * logically linked, but it is doing a syncro site survey
+        * then it will be back to LINKED state.
+        */
+       RTLLIB_LINKED_SCANNING,
+};
+#else
+enum rtllib_state {
+        RTLLIB_UNINITIALIZED = 0,
+        RTLLIB_INITIALIZED,
+        RTLLIB_ASSOCIATING,
+        RTLLIB_ASSOCIATED,
+        RTLLIB_AUTHENTICATING,
+        RTLLIB_AUTHENTICATED,
+        RTLLIB_SHUTDOWN
+};
+#endif
+
+#define DEFAULT_MAX_SCAN_AGE (15 * HZ)
+#define DEFAULT_FTS 2346
+
+#define CFG_RTLLIB_RESERVE_FCS (1<<0)
+#define CFG_RTLLIB_COMPUTE_FCS (1<<1)
+#define CFG_RTLLIB_RTS (1<<2)
+
+#define RTLLIB_24GHZ_MIN_CHANNEL 1
+#define RTLLIB_24GHZ_MAX_CHANNEL 14
+#define RTLLIB_24GHZ_CHANNELS (RTLLIB_24GHZ_MAX_CHANNEL - \
+                                  RTLLIB_24GHZ_MIN_CHANNEL + 1)
+
+#define RTLLIB_52GHZ_MIN_CHANNEL 34
+#define RTLLIB_52GHZ_MAX_CHANNEL 165
+#define RTLLIB_52GHZ_CHANNELS (RTLLIB_52GHZ_MAX_CHANNEL - \
+                                  RTLLIB_52GHZ_MIN_CHANNEL + 1)
+
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,11))
+extern inline int is_multicast_ether_addr(const u8 *addr)
+{
+        return ((addr[0] != 0xff) && (0x01 & addr[0]));
+}
+#endif
+
+#if (LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,13))
+extern inline int is_broadcast_ether_addr(const u8 *addr)
+{
+       return ((addr[0] == 0xff) && (addr[1] == 0xff) && (addr[2] == 0xff) &&   \
+               (addr[3] == 0xff) && (addr[4] == 0xff) && (addr[5] == 0xff));
+}
+#endif
+#ifndef eqMacAddr
+#define eqMacAddr(a,b)         ( ((a)[0]==(b)[0] && (a)[1]==(b)[1] && (a)[2]==(b)[2] && (a)[3]==(b)[3] && (a)[4]==(b)[4] && (a)[5]==(b)[5]) ? 1:0 )
+#endif
+typedef struct tx_pending_t{
+       int frag;
+       struct rtllib_txb *txb;
+}tx_pending_t;
+
+typedef struct _bandwidth_autoswitch
+{
+       long threshold_20Mhzto40Mhz;
+       long    threshold_40Mhzto20Mhz;
+       bool bforced_tx20Mhz;
+       bool bautoswitch_enable;
+}bandwidth_autoswitch,*pbandwidth_autoswitch;
+
+
+
+#define REORDER_WIN_SIZE       128
+#define REORDER_ENTRY_NUM      128
+typedef struct _RX_REORDER_ENTRY
+{
+       struct list_head        List;
+       u16                     SeqNum;
+       struct rtllib_rxb* prxb;
+} RX_REORDER_ENTRY, *PRX_REORDER_ENTRY;
+typedef enum _Fsync_State{
+       Default_Fsync,
+       HW_Fsync,
+       SW_Fsync
+}Fsync_State;
+
+typedef        enum _RT_PS_MODE
+{
+       eActive,
+       eMaxPs,
+       eFastPs,
+       eAutoPs,
+}RT_PS_MODE;
+
+typedef enum _IPS_CALLBACK_FUNCION
+{
+       IPS_CALLBACK_NONE = 0,
+       IPS_CALLBACK_MGNT_LINK_REQUEST = 1,
+       IPS_CALLBACK_JOIN_REQUEST = 2,
+}IPS_CALLBACK_FUNCION;
+
+typedef enum _RT_JOIN_ACTION{
+       RT_JOIN_INFRA   = 1,
+       RT_JOIN_IBSS  = 2,
+       RT_START_IBSS = 3,
+       RT_NO_ACTION  = 4,
+}RT_JOIN_ACTION;
+
+typedef struct _IbssParms{
+       u16   atimWin;
+}IbssParms, *PIbssParms;
+#define MAX_NUM_RATES  264
+
+typedef        enum _RT_RF_POWER_STATE
+{
+       eRfOn,
+       eRfSleep,
+       eRfOff
+}RT_RF_POWER_STATE;
+
+#define        MAX_SUPPORT_WOL_PATTERN_NUM             8
+
+#define        MAX_WOL_BIT_MASK_SIZE           16
+#define        MAX_WOL_PATTERN_SIZE            128
+
+typedef enum _WOLPATTERN_TYPE
+{
+       eNetBIOS = 0,
+       eIPv4IPv6ARP,
+       eIPv4IPv6TCPSYN,
+       eMACIDOnly,
+       eNoDefined,
+}WOLPATTERN_TYPE;
+
+typedef struct _RT_PM_WOL_PATTERN_INFO
+{
+       u32     PatternId;
+       u32     Mask[4];
+       u16     CrcRemainder;
+       u8      WFMIndex;
+       WOLPATTERN_TYPE PatternType;
+}RT_PM_WOL_PATTERN_INFO, *PRT_PM_WOL_PATTERN_INFO;
+
+typedef struct _RT_POWER_SAVE_CONTROL
+{
+
+       bool                            bInactivePs;
+       bool                            bIPSModeBackup;
+       bool                            bHaltAdapterClkRQ;
+       bool                            bSwRfProcessing;
+       RT_RF_POWER_STATE       eInactivePowerState;
+       work_struct_rsl         InactivePsWorkItem;
+       struct timer_list       InactivePsTimer;
+
+       IPS_CALLBACK_FUNCION    ReturnPoint;
+
+       bool                            bTmpBssDesc;
+       RT_JOIN_ACTION          tmpJoinAction;
+       struct rtllib_network tmpBssDesc;
+
+       bool                            bTmpScanOnly;
+       bool                            bTmpActiveScan;
+       bool                            bTmpFilterHiddenAP;
+       bool                            bTmpUpdateParms;
+       u8                              tmpSsidBuf[33];
+       OCTET_STRING                    tmpSsid2Scan;
+       bool                            bTmpSsid2Scan;
+       u8                              tmpNetworkType;
+       u8                              tmpChannelNumber;
+       u16                             tmpBcnPeriod;
+       u8                              tmpDtimPeriod;
+       u16                             tmpmCap;
+       OCTET_STRING                    tmpSuppRateSet;
+       u8                              tmpSuppRateBuf[MAX_NUM_RATES];
+       bool                            bTmpSuppRate;
+       IbssParms                               tmpIbpm;
+       bool                            bTmpIbpm;
+
+       bool                            bLeisurePs;
+       u32                             PowerProfile;
+       u8                              LpsIdleCount;
+       u8                              RegMaxLPSAwakeIntvl;
+       u8                              LPSAwakeIntvl;
+
+       u32                             CurPsLevel;
+       u32                             RegRfPsLevel;
+
+       bool                            bFwCtrlLPS;
+       u8                              FWCtrlPSMode;
+
+       bool                            LinkReqInIPSRFOffPgs;
+       bool                            BufConnectinfoBefore;
+
+
+       bool                            bGpioRfSw;
+
+       u8                              RegAMDPciASPM;
+
+       u8                              oWLANMode;
+       RT_PM_WOL_PATTERN_INFO          PmWoLPatternInfo[MAX_SUPPORT_WOL_PATTERN_NUM];
+
+}RT_POWER_SAVE_CONTROL,*PRT_POWER_SAVE_CONTROL;
+
+typedef u32 RT_RF_CHANGE_SOURCE;
+#define RF_CHANGE_BY_SW BIT31
+#define RF_CHANGE_BY_HW BIT30
+#define RF_CHANGE_BY_PS BIT29
+#define RF_CHANGE_BY_IPS BIT28
+#define RF_CHANGE_BY_INIT      0
+
+typedef enum
+{
+       COUNTRY_CODE_FCC = 0,
+       COUNTRY_CODE_IC = 1,
+       COUNTRY_CODE_ETSI = 2,
+       COUNTRY_CODE_SPAIN = 3,
+       COUNTRY_CODE_FRANCE = 4,
+       COUNTRY_CODE_MKK = 5,
+       COUNTRY_CODE_MKK1 = 6,
+       COUNTRY_CODE_ISRAEL = 7,
+       COUNTRY_CODE_TELEC = 8,
+       COUNTRY_CODE_MIC = 9,
+       COUNTRY_CODE_GLOBAL_DOMAIN = 10,
+       COUNTRY_CODE_WORLD_WIDE_13 = 11,
+       COUNTRY_CODE_TELEC_NETGEAR = 12,
+       COUNTRY_CODE_MAX
+}country_code_type_t;
+
+typedef enum _SCAN_OPERATION_BACKUP_OPT{
+       SCAN_OPT_BACKUP=0,
+       SCAN_OPT_RESTORE,
+       SCAN_OPT_MAX
+}SCAN_OPERATION_BACKUP_OPT;
+
+typedef        enum _FW_CMD_IO_TYPE{
+       FW_CMD_DIG_ENABLE = 0,
+       FW_CMD_DIG_DISABLE = 1,
+       FW_CMD_DIG_HALT = 2,
+       FW_CMD_DIG_RESUME = 3,
+       FW_CMD_HIGH_PWR_ENABLE = 4,
+       FW_CMD_HIGH_PWR_DISABLE = 5,
+       FW_CMD_RA_RESET = 6,
+       FW_CMD_RA_ACTIVE= 7,
+       FW_CMD_RA_REFRESH_N= 8,
+       FW_CMD_RA_REFRESH_BG= 9,
+       FW_CMD_RA_INIT= 10,
+       FW_CMD_IQK_ENABLE = 11,
+       FW_CMD_TXPWR_TRACK_ENABLE = 12,
+       FW_CMD_TXPWR_TRACK_DISABLE = 13,
+       FW_CMD_TXPWR_TRACK_THERMAL = 14,
+       FW_CMD_PAUSE_DM_BY_SCAN = 15,
+       FW_CMD_RESUME_DM_BY_SCAN = 16,
+       FW_CMD_RA_REFRESH_N_COMB = 17,
+       FW_CMD_RA_REFRESH_BG_COMB = 18,
+       FW_CMD_ANTENNA_SW_ENABLE = 19,
+       FW_CMD_ANTENNA_SW_DISABLE = 20,
+       FW_CMD_TX_FEEDBACK_CCX_ENABLE = 21,
+       FW_CMD_LPS_ENTER = 22,
+       FW_CMD_LPS_LEAVE = 23,
+       FW_CMD_DIG_MODE_SS = 24,
+       FW_CMD_DIG_MODE_FA = 25,
+       FW_CMD_ADD_A2_ENTRY = 26,
+       FW_CMD_CTRL_DM_BY_DRIVER = 27,
+       FW_CMD_CTRL_DM_BY_DRIVER_NEW = 28,
+       FW_CMD_PAPE_CONTROL = 29,
+       FW_CMD_CHAN_SET = 30,
+}FW_CMD_IO_TYPE,*PFW_CMD_IO_TYPE;
+
+#define RT_MAX_LD_SLOT_NUM     10
+typedef struct _RT_LINK_DETECT_T{
+
+       u32                             NumRecvBcnInPeriod;
+       u32                             NumRecvDataInPeriod;
+
+       u32                             RxBcnNum[RT_MAX_LD_SLOT_NUM];
+       u32                             RxDataNum[RT_MAX_LD_SLOT_NUM];
+       u16                             SlotNum;
+       u16                             SlotIndex;
+
+       u32                             NumTxOkInPeriod;
+       u32                             NumRxOkInPeriod;
+       u32                             NumRxUnicastOkInPeriod;
+       bool                            bBusyTraffic;
+       bool                            bHigherBusyTraffic;
+       bool                            bHigherBusyRxTraffic;
+       u8                              IdleCount;
+       u32                             NumTxUnicastOkInPeriod;
+       u32                             LastNumTxUnicast;
+       u32                             LastNumRxUnicast;
+}RT_LINK_DETECT_T, *PRT_LINK_DETECT_T;
+
+typedef struct _SW_CAM_TABLE{
+
+       u8                              macaddr[6];
+       bool                            bused;
+       u8                              key_buf[16];
+       u16                             key_type;
+       u8                              useDK;
+       u8                              key_index;
+
+}SW_CAM_TABLE,*PSW_CAM_TABLE;
+#define   TOTAL_CAM_ENTRY                              32
+typedef struct _rate_adaptive
+{
+       u8                              rate_adaptive_disabled;
+       u8                              ratr_state;
+       u16                             reserve;
+
+       u32                             high_rssi_thresh_for_ra;
+       u32                             high2low_rssi_thresh_for_ra;
+       u8                              low2high_rssi_thresh_for_ra40M;
+       u32                             low_rssi_thresh_for_ra40M;
+       u8                              low2high_rssi_thresh_for_ra20M;
+       u32                             low_rssi_thresh_for_ra20M;
+       u32                             upper_rssi_threshold_ratr;
+       u32                             middle_rssi_threshold_ratr;
+       u32                             low_rssi_threshold_ratr;
+       u32                             low_rssi_threshold_ratr_40M;
+       u32                             low_rssi_threshold_ratr_20M;
+       u8                              ping_rssi_enable;
+       u32                             ping_rssi_ratr;
+       u32                             ping_rssi_thresh_for_ra;
+       u32                             last_ratr;
+       u8                              PreRATRState;
+
+} rate_adaptive, *prate_adaptive;
+typedef enum _RATR_TABLE_MODE_8192S{
+       RATR_INX_WIRELESS_NGB = 0,
+       RATR_INX_WIRELESS_NG = 1,
+       RATR_INX_WIRELESS_NB = 2,
+       RATR_INX_WIRELESS_N = 3,
+       RATR_INX_WIRELESS_GB = 4,
+       RATR_INX_WIRELESS_G = 5,
+       RATR_INX_WIRELESS_B = 6,
+       RATR_INX_WIRELESS_MC = 7,
+       RATR_INX_WIRELESS_A = 8,
+}RATR_TABLE_MODE_8192S, *PRATR_TABLE_MODE_8192S;
+
+#define        NUM_PMKID_CACHE         16
+typedef struct _RT_PMKID_LIST
+{
+       u8                                              bUsed;
+       u8                                              Bssid[6];
+       u8                                              PMKID[16];
+       u8                                              SsidBuf[33];
+       u8*                                             ssid_octet;
+       u16                                     ssid_length;
+} RT_PMKID_LIST, *PRT_PMKID_LIST;
+
+#ifdef CONFIG_CFG_80211
+enum {
+       LIBIPW_CH_PASSIVE_ONLY          = (1 << 0),
+       LIBIPW_CH_80211H_RULES          = (1 << 1),
+       LIBIPW_CH_B_ONLY                = (1 << 2),
+       LIBIPW_CH_NO_IBSS               = (1 << 3),
+       LIBIPW_CH_UNIFORM_SPREADING     = (1 << 4),
+       LIBIPW_CH_RADAR_DETECT          = (1 << 5),
+       LIBIPW_CH_INVALID               = (1 << 6),
+};
+struct rtllib_channel {
+       u32 freq;
+       u8 channel;
+       u8 flags;
+       u8 max_power;
+};
+
+#define RTLLIB_24GHZ_MIN_CHANNEL 1
+#define RTLLIB_24GHZ_MAX_CHANNEL 14
+#define RTLLIB_24GHZ_CHANNELS (RTLLIB_24GHZ_MAX_CHANNEL - \
+               RTLLIB_24GHZ_MIN_CHANNEL + 1)
+
+struct reg_dmn_pair_mapping {
+       u16 regDmnEnum;
+       u16 reg_5ghz_ctl;
+       u16 reg_2ghz_ctl;
+};
+
+struct rtl_regulatory {
+       char alpha2[2];
+       u16 country_code;
+       u16 max_power_level;
+       u32 tp_scale;
+       u16 current_rd;
+       u16 current_rd_ext;
+       int16_t power_limit;
+       struct reg_dmn_pair_mapping *regpair;
+};
+
+struct ieee80211_bss {
+       /* Yes, this is a hack */
+       struct cfg80211_bss cbss;
+
+       /* don't want to look up all the time */
+       size_t ssid_len;
+       u8 ssid[IEEE80211_MAX_SSID_LEN];
+
+       u8 dtim_period;
+
+       bool wmm_used;
+
+       unsigned long last_probe_resp;
+
+#ifdef CONFIG_MAC80211_MESH
+       u8 *mesh_id;
+       size_t mesh_id_len;
+       u8 *mesh_cfg;
+#endif
+
+       #define IEEE80211_MAX_SUPP_RATES 32
+       u8 supp_rates[IEEE80211_MAX_SUPP_RATES];
+       size_t supp_rates_len;
+
+       /*
+        * During assocation, we save an ERP value from a probe response so
+        * that we can feed ERP info to the driver when handling the
+        * association completes. these fields probably won't be up-to-date
+        * otherwise, you probably don't want to use them.
+        */
+       bool has_erp_value;
+       u8 erp_value;
+};
+
+/* Parsed Information Elements */
+struct ieee802_11_elems {
+       u8 *ie_start;
+       size_t total_len;
+
+       /* pointers to IEs */
+       u8 *ssid;
+       u8 *supp_rates;
+       u8 *fh_params;
+       u8 *ds_params;
+       u8 *cf_params;
+       struct ieee80211_tim_ie *tim;
+       u8 *ibss_params;
+       u8 *challenge;
+       u8 *wpa;
+       u8 *rsn;
+       u8 *erp_info;
+       u8 *ext_supp_rates;
+       u8 *wmm_info;
+       u8 *wmm_param;
+       struct ieee80211_ht_cap *ht_cap_elem;
+       struct ieee80211_ht_info *ht_info_elem;
+       u8 *mesh_config;
+       u8 *mesh_id;
+       u8 *peer_link;
+       u8 *preq;
+       u8 *prep;
+       u8 *perr;
+       u8 *ch_switch_elem;
+       u8 *country_elem;
+       u8 *pwr_constr_elem;
+       u8 *quiet_elem;         /* first quite element */
+       u8 *timeout_int;
+
+       /* length of them, respectively */
+       u8 ssid_len;
+       u8 supp_rates_len;
+       u8 fh_params_len;
+       u8 ds_params_len;
+       u8 cf_params_len;
+       u8 tim_len;
+       u8 ibss_params_len;
+       u8 challenge_len;
+       u8 wpa_len;
+       u8 rsn_len;
+       u8 erp_info_len;
+       u8 ext_supp_rates_len;
+       u8 wmm_info_len;
+       u8 wmm_param_len;
+       u8 mesh_config_len;
+       u8 mesh_id_len;
+       u8 peer_link_len;
+       u8 preq_len;
+       u8 prep_len;
+       u8 perr_len;
+       u8 ch_switch_elem_len;
+       u8 country_elem_len;
+       u8 pwr_constr_elem_len;
+       u8 quiet_elem_len;
+       u8 num_of_quiet_elem;   /* can be more the one */
+       u8 timeout_int_len;
+};
+
+#endif
+
+
+typedef struct _RT_INTEL_PROMISCUOUS_MODE_INFO {
+     bool bPromiscuousOn;
+     bool bFilterSourceStationFrame;
+} RT_INTEL_PROMISCUOUS_MODE_INFO, *PRT_INTEL_PROMISCUOUS_MODE_INFO;
+
+
+/*************** DRIVER STATUS   *****/
+#define STATUS_SCANNING                        0
+#define STATUS_SCAN_HW                 1
+#define STATUS_SCAN_ABORTING   2
+#define STATUS_SETTING_CHAN            3
+/*************** DRIVER STATUS   *****/
+
+enum {
+       NO_USE          = 0,
+       USED            = 1,
+       HW_SEC  = 2,
+       SW_SEC          = 3,
+};
+
+enum {
+       LPS_IS_WAKE = 0,
+       LPS_IS_SLEEP = 1,
+       LPS_WAIT_NULL_DATA_SEND =2,
+};
+
+struct rtllib_device {
+       struct pci_dev *pdev;
+       struct net_device *dev;
+       struct rtllib_security sec;
+
+       bool disable_mgnt_queue;
+
+       unsigned long status;
+       short hwscan_ch_bk;
+       HT_EXTCHNL_OFFSET chan_offset_bk;
+       HT_CHANNEL_WIDTH bandwidth_bk;
+       u8 hwscan_sem_up;
+#ifdef CONFIG_CFG_80211
+       struct wireless_dev wdev;
+       struct rtl_regulatory regulatory;
+#endif
+       u8      CntAfterLink;
+
+       RT_OP_MODE      OpMode;
+
+       u8 VersionID;
+       /* The last AssocReq/Resp IEs */
+       u8 *assocreq_ies, *assocresp_ies;
+       size_t assocreq_ies_len, assocresp_ies_len;
+
+       bool b_customer_lenovo_id;
+       bool    bForcedShowRxRate;
+       bool    bForcedShowRateStill;
+       u8      SystemQueryDataRateCount;
+       bool    bForcedBgMode;
+       bool bUseRAMask;
+       bool b1x1RecvCombine;
+       u8 RF_Type;
+       bool b1SSSupport;
+
+       u8 hwsec_active;
+       bool is_silent_reset;
+      bool force_mic_error;
+       bool is_roaming;
+       bool ieee_up;
+       bool cannot_notify;
+       bool bSupportRemoteWakeUp;
+       RT_PS_MODE      dot11PowerSaveMode;
+       bool actscanning;
+       bool FirstIe_InScan;
+       bool be_scan_inprogress;
+       bool beinretry;
+       RT_RF_POWER_STATE               eRFPowerState;
+       RT_RF_CHANGE_SOURCE     RfOffReason;
+       bool is_set_key;
+       bool wx_set_enc;
+       PRT_HIGH_THROUGHPUT     pHTInfo;
+       spinlock_t bw_spinlock;
+
+       spinlock_t reorder_spinlock;
+       u8      Regdot11HTOperationalRateSet[16];
+       u8      Regdot11TxHTOperationalRateSet[16];
+       u8      dot11HTOperationalRateSet[16];
+       u8      RegHTSuppRateSet[16];
+       u8                              HTCurrentOperaRate;
+       u8                              HTHighestOperaRate;
+       u8              MinSpaceCfg;
+       u8              MaxMssDensity;
+       u8      bTxDisableRateFallBack;
+       u8      bTxUseDriverAssingedRate;
+       u8      bTxEnableFwCalcDur;
+       atomic_t        atm_chnlop;
+       atomic_t        atm_swbw;
+
+       struct list_head                Tx_TS_Admit_List;
+       struct list_head                Tx_TS_Pending_List;
+       struct list_head                Tx_TS_Unused_List;
+       TX_TS_RECORD            TxTsRecord[TOTAL_TS_NUM];
+       struct list_head                Rx_TS_Admit_List;
+       struct list_head                Rx_TS_Pending_List;
+       struct list_head                Rx_TS_Unused_List;
+       RX_TS_RECORD            RxTsRecord[TOTAL_TS_NUM];
+       RX_REORDER_ENTRY        RxReorderEntry[128];
+       struct list_head                RxReorder_Unused_List;
+       u8                              ForcedPriority;
+
+
+       /* Bookkeeping structures */
+       struct net_device_stats stats;
+       struct rtllib_stats ieee_stats;
+       struct rtllib_softmac_stats softmac_stats;
+
+       /* Probe / Beacon management */
+       struct list_head network_free_list;
+       struct list_head network_list;
+#ifdef RTL8192U
+       struct list_head network_bssid_free_list;
+       struct list_head network_bssid_list;
+#endif
+       struct rtllib_network *networks;
+       int scans;
+       int scan_age;
+
+       int iw_mode; /* operating mode (IW_MODE_*) */
+       bool bNetPromiscuousMode;
+       RT_INTEL_PROMISCUOUS_MODE_INFO IntelPromiscuousModeInfo;
+
+       struct iw_spy_data spy_data;
+
+       spinlock_t lock;
+       spinlock_t wpax_suitlist_lock;
+
+       int tx_headroom; /* Set to size of any additional room needed at front
+                         * of allocated Tx SKBs */
+       u32 config;
+
+       /* WEP and other encryption related settings at the device level */
+       int open_wep; /* Set to 1 to allow unencrypted frames */
+       int auth_mode;
+       int reset_on_keychange; /* Set to 1 if the HW needs to be reset on
+                                * WEP key changes */
+
+       /* If the host performs {en,de}cryption, then set to 1 */
+       int host_encrypt;
+       int host_encrypt_msdu;
+       int host_decrypt;
+        /* host performs multicast decryption */
+        int host_mc_decrypt;
+
+        /* host should strip IV and ICV from protected frames */
+        /* meaningful only when hardware decryption is being used */
+        int host_strip_iv_icv;
+
+        int host_open_frag;
+        int host_build_iv;
+       int ieee802_1x; /* is IEEE 802.1X used */
+
+       /* WPA data */
+       bool bHalfNMode;
+       bool bHalfWirelessN24GMode;
+       int wpa_enabled;
+       int drop_unencrypted;
+       int tkip_countermeasures;
+       int privacy_invoked;
+       size_t wpa_ie_len;
+       u8 *wpa_ie;
+       size_t wps_ie_len;
+       u8 *wps_ie;
+       u8 ap_mac_addr[6];
+       u16 pairwise_key_type;
+       u16 group_key_type;
+       struct list_head crypt_deinit_list;
+       struct rtllib_crypt_data *crypt[WEP_KEYS];
+
+       int tx_keyidx; /* default TX key index (crypt[tx_keyidx]) */
+       SW_CAM_TABLE swcamtable[TOTAL_CAM_ENTRY];
+       struct timer_list crypt_deinit_timer;
+        int crypt_quiesced;
+
+       int bcrx_sta_key; /* use individual keys to override default keys even
+                          * with RX of broad/multicast frames */
+
+       RT_PMKID_LIST           PMKIDList[NUM_PMKID_CACHE];
+
+       /* Fragmentation structures */
+       struct rtllib_frag_entry frag_cache[17][RTLLIB_FRAG_CACHE_LEN];
+       unsigned int frag_next_idx[17];
+       u16 fts; /* Fragmentation Threshold */
+#define DEFAULT_RTS_THRESHOLD 2346U
+#define MIN_RTS_THRESHOLD 1
+#define MAX_RTS_THRESHOLD 2346U
+        u16 rts; /* RTS threshold */
+
+        /* Association info */
+        u8 bssid[ETH_ALEN];
+
+       /* This stores infos for the current network.
+        * Either the network we are associated in INFRASTRUCTURE
+        * or the network that we are creating in MASTER mode.
+        * ad-hoc is a mixture ;-).
+        * Note that in infrastructure mode, even when not associated,
+        * fields bssid and essid may be valid (if wpa_set and essid_set
+        * are true) as thy carry the value set by the user via iwconfig
+        */
+       struct rtllib_network current_network;
+
+       enum rtllib_state state;
+
+       int short_slot;
+       int reg_mode;
+       int mode;       /* A, B, G */
+       int modulation; /* CCK, OFDM */
+       int freq_band;  /* 2.4Ghz, 5.2Ghz, Mixed */
+       int abg_true;   /* ABG flag              */
+
+       /* used for forcing the ibss workqueue to terminate
+        * without wait for the syncro scan to terminate
+        */
+       short sync_scan_hurryup;
+       u16 scan_watch_dog;
+        int perfect_rssi;
+        int worst_rssi;
+
+        u16 prev_seq_ctl;       /* used to drop duplicate frames */
+
+       /* map of allowed channels. 0 is dummy */
+#ifdef ENABLE_DOT11D
+       void* pDot11dInfo;
+       bool bGlobalDomain;
+#else
+       u8 channel_map[MAX_CHANNEL_NUMBER+1];
+#endif
+       u8 active_channel_map[MAX_CHANNEL_NUMBER+1];
+
+       u8   IbssStartChnl;
+       u8   ibss_maxjoin_chal;
+
+       int rate;       /* current rate */
+       int basic_rate;
+       u32     currentRate;
+
+       short active_scan;
+
+       /* this contains flags for selectively enable softmac support */
+       u16 softmac_features;
+
+       /* if the sequence control field is not filled by HW */
+       u16 seq_ctrl[5];
+
+       /* association procedure transaction sequence number */
+       u16 associate_seq;
+
+       /* AID for RTXed association responses */
+       u16 assoc_id;
+
+       /* power save mode related*/
+       u8 ack_tx_to_ieee;
+       short ps;
+       short sta_sleep;
+       int ps_timeout;
+       int ps_period;
+       struct tasklet_struct ps_task;
+       u32 ps_th;
+       u32 ps_tl;
+       bool polling;
+
+       short raw_tx;
+       /* used if IEEE_SOFTMAC_TX_QUEUE is set */
+       short queue_stop;
+       short scanning_continue ;
+       short proto_started;
+       short proto_stoppping;
+
+       struct semaphore wx_sem;
+       struct semaphore scan_sem;
+       struct semaphore ips_sem;
+
+       spinlock_t mgmt_tx_lock;
+       spinlock_t beacon_lock;
+
+       short beacon_txing;
+
+       short wap_set;
+       short ssid_set;
+
+       /* set on initialization */
+       u8  qos_support;
+       unsigned int wmm_acm;
+
+       /* for discarding duplicated packets in IBSS */
+       struct list_head ibss_mac_hash[IEEE_IBSS_MAC_HASH_SIZE];
+
+       /* for discarding duplicated packets in BSS */
+       u16 last_rxseq_num[17]; /* rx seq previous per-tid */
+       u16 last_rxfrag_num[17];/* tx frag previous per-tid */
+       unsigned long last_packet_time[17];
+
+       /* for PS mode */
+       unsigned long last_rx_ps_time;
+       bool                    bAwakePktSent;
+       u8                      LPSDelayCnt;
+
+       /* used if IEEE_SOFTMAC_SINGLE_QUEUE is set */
+       struct sk_buff *mgmt_queue_ring[MGMT_QUEUE_NUM];
+       int mgmt_queue_head;
+       int mgmt_queue_tail;
+#define RTLLIB_QUEUE_LIMIT 128
+       u8 AsocRetryCount;
+       unsigned int hw_header;
+       struct sk_buff_head skb_waitQ[MAX_QUEUE_SIZE];
+       struct sk_buff_head  skb_aggQ[MAX_QUEUE_SIZE];
+       struct sk_buff_head  skb_drv_aggQ[MAX_QUEUE_SIZE];
+       u32     sta_edca_param[4];
+       bool aggregation;
+       bool enable_rx_imm_BA;
+       bool bibsscoordinator;
+
+       bool    bdynamic_txpower_enable;
+
+       bool bCTSToSelfEnable;
+       u8      CTSToSelfTH;
+
+       u32     fsync_time_interval;
+       u32     fsync_rate_bitmap;
+       u8      fsync_rssi_threshold;
+       bool    bfsync_enable;
+
+       u8      fsync_multiple_timeinterval;
+       u32     fsync_firstdiff_ratethreshold;
+       u32     fsync_seconddiff_ratethreshold;
+       Fsync_State                     fsync_state;
+       bool            bis_any_nonbepkts;
+       bandwidth_autoswitch bandwidth_auto_switch;
+       bool FwRWRF;
+
+       RT_LINK_DETECT_T        LinkDetectInfo;
+       bool bIsAggregateFrame;
+       RT_POWER_SAVE_CONTROL   PowerSaveControl;
+       u8 amsdu_in_process;
+
+       /* used if IEEE_SOFTMAC_TX_QUEUE is set */
+       struct  tx_pending_t tx_pending;
+
+       /* used if IEEE_SOFTMAC_ASSOCIATE is set */
+       struct timer_list associate_timer;
+
+       /* used if IEEE_SOFTMAC_BEACONS is set */
+       struct timer_list beacon_timer;
+       u8 need_sw_enc;
+       work_struct_rsl associate_complete_wq;
+       work_struct_rsl ips_leave_wq;
+       delayed_work_struct_rsl associate_procedure_wq;
+       delayed_work_struct_rsl softmac_scan_wq;
+       delayed_work_struct_rsl softmac_hint11d_wq;
+       delayed_work_struct_rsl associate_retry_wq;
+       delayed_work_struct_rsl start_ibss_wq;
+       delayed_work_struct_rsl hw_wakeup_wq;
+       delayed_work_struct_rsl hw_sleep_wq;
+       delayed_work_struct_rsl link_change_wq;
+       work_struct_rsl wx_sync_scan_wq;
+
+       struct workqueue_struct *wq;
+
+       /* Callback functions */
+       void (*set_security)(struct net_device *dev,
+                            struct rtllib_security *sec);
+
+       /* Used to TX data frame by using txb structs.
+        * this is not used if in the softmac_features
+        * is set the flag IEEE_SOFTMAC_TX_QUEUE
+        */
+       int (*hard_start_xmit)(struct rtllib_txb *txb,
+                              struct net_device *dev);
+
+       int (*reset_port)(struct net_device *dev);
+        int (*is_queue_full) (struct net_device * dev, int pri);
+
+        int (*handle_management) (struct net_device * dev,
+                                  struct rtllib_network * network, u16 type);
+        int (*is_qos_active) (struct net_device *dev, struct sk_buff *skb);
+
+       /* Softmac-generated frames (mamagement) are TXed via this
+        * callback if the flag IEEE_SOFTMAC_SINGLE_QUEUE is
+        * not set. As some cards may have different HW queues that
+        * one might want to use for data and management frames
+        * the option to have two callbacks might be useful.
+        * This fucntion can't sleep.
+        */
+       int (*softmac_hard_start_xmit)(struct sk_buff *skb,
+                              struct net_device *dev);
+
+       /* used instead of hard_start_xmit (not softmac_hard_start_xmit)
+        * if the IEEE_SOFTMAC_TX_QUEUE feature is used to TX data
+        * frames. I the option IEEE_SOFTMAC_SINGLE_QUEUE is also set
+        * then also management frames are sent via this callback.
+        * This function can't sleep.
+        */
+       void (*softmac_data_hard_start_xmit)(struct sk_buff *skb,
+                              struct net_device *dev,int rate);
+
+       /* stops the HW queue for DATA frames. Useful to avoid
+        * waste time to TX data frame when we are reassociating
+        * This function can sleep.
+        */
+       void (*data_hard_stop)(struct net_device *dev);
+
+       /* OK this is complementar to data_poll_hard_stop */
+       void (*data_hard_resume)(struct net_device *dev);
+
+       /* ask to the driver to retune the radio .
+        * This function can sleep. the driver should ensure
+        * the radio has been swithced before return.
+        */
+       void (*set_chan)(struct net_device *dev,short ch);
+
+       /* These are not used if the ieee stack takes care of
+        * scanning (IEEE_SOFTMAC_SCAN feature set).
+        * In this case only the set_chan is used.
+        *
+        * The syncro version is similar to the start_scan but
+        * does not return until all channels has been scanned.
+        * this is called in user context and should sleep,
+        * it is called in a work_queue when swithcing to ad-hoc mode
+        * or in behalf of iwlist scan when the card is associated
+        * and root user ask for a scan.
+        * the fucntion stop_scan should stop both the syncro and
+        * background scanning and can sleep.
+        * The fucntion start_scan should initiate the background
+        * scanning and can't sleep.
+        */
+       void (*scan_syncro)(struct net_device *dev);
+       void (*start_scan)(struct net_device *dev);
+       void (*stop_scan)(struct net_device *dev);
+
+       void (*rtllib_start_hw_scan)(struct net_device *dev);
+       void (*rtllib_stop_hw_scan)(struct net_device *dev);
+
+       /* indicate the driver that the link state is changed
+        * for example it may indicate the card is associated now.
+        * Driver might be interested in this to apply RX filter
+        * rules or simply light the LINK led
+        */
+       void (*link_change)(struct net_device *dev);
+
+       /* these two function indicates to the HW when to start
+        * and stop to send beacons. This is used when the
+        * IEEE_SOFTMAC_BEACONS is not set. For now the
+        * stop_send_bacons is NOT guaranteed to be called only
+        * after start_send_beacons.
+        */
+       void (*start_send_beacons) (struct net_device *dev);
+       void (*stop_send_beacons) (struct net_device *dev);
+
+       /* power save mode related */
+       void (*sta_wake_up) (struct net_device *dev);
+       void (*enter_sleep_state) (struct net_device *dev, u32 th, u32 tl);
+       short (*ps_is_queue_empty) (struct net_device *dev);
+        int (*handle_beacon) (struct net_device * dev, struct rtllib_beacon * beacon, struct rtllib_network * network);
+        int (*handle_assoc_response) (struct net_device * dev, struct rtllib_assoc_response_frame * resp, struct rtllib_network * network);
+
+
+       /* check whether Tx hw resouce available */
+       short (*check_nic_enough_desc)(struct net_device *dev, int queue_index);
+       short (*get_nic_desc_num)(struct net_device *dev, int queue_index);
+       void (*SetBWModeHandler)(struct net_device *dev, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET Offset);
+       bool (*GetNmodeSupportBySecCfg)(struct net_device* dev);
+       void (*SetWirelessMode)(struct net_device* dev, u8 wireless_mode);
+       bool (*GetHalfNmodeSupportByAPsHandler)(struct net_device* dev);
+       u8   (*rtllib_ap_sec_type)(struct rtllib_device *ieee);
+       void (*HalUsbRxAggrHandler)(struct net_device *dev, bool Value);
+       void (*InitialGainHandler)(struct net_device *dev, u8 Operation);
+       bool (*SetFwCmdHandler)(struct net_device *dev, FW_CMD_IO_TYPE          FwCmdIO);
+       void (*UpdateHalRAMaskHandler)(struct net_device* dev, bool bMulticast, u8 macId, u8 MimoPs, u8 WirelessMode, u8 bCurTxBW40MHz, u8 rssi_level);
+       void (*UpdateBeaconInterruptHandler)(struct net_device* dev, bool start);
+       void (*UpdateInterruptMaskHandler)(struct net_device* dev, u32 AddMSR, u32 RemoveMSR);
+       u16  (*rtl_11n_user_show_rates)(struct net_device *dev);
+       void (*ScanOperationBackupHandler)(struct net_device *dev, u8 Operation);
+       void (*LedControlHandler)(struct net_device * dev, LED_CTL_MODE LedAction);
+       void (*SetHwRegHandler)(struct net_device *dev,u8 variable,u8* val);
+       void (*GetHwRegHandler)(struct net_device *dev,u8 variable,u8* val);
+
+       void (*AllowAllDestAddrHandler)(struct net_device *dev, bool bAllowAllDA, bool WriteIntoReg);
+
+        void (*rtllib_ips_leave_wq) (struct net_device *dev);
+        void (*rtllib_ips_leave)(struct net_device *dev);
+       void (*LeisurePSLeave)(struct net_device *dev);
+       void (*rtllib_rfkill_poll)(struct net_device *dev);
+
+       /* This must be the last item so that it points to the data
+        * allocated beyond this structure by alloc_rtllib */
+       u8 priv[0];
+};
+
+#define IEEE_A            (1<<0)
+#define IEEE_B            (1<<1)
+#define IEEE_G            (1<<2)
+#define IEEE_N_24G               (1<<4)
+#define        IEEE_N_5G                 (1<<5)
+#define IEEE_MODE_MASK    (IEEE_A|IEEE_B|IEEE_G)
+
+/* Generate a 802.11 header */
+
+/* Uses the channel change callback directly
+ * instead of [start/stop] scan callbacks
+ */
+#define IEEE_SOFTMAC_SCAN (1<<2)
+
+/* Perform authentication and association handshake */
+#define IEEE_SOFTMAC_ASSOCIATE (1<<3)
+
+/* Generate probe requests */
+#define IEEE_SOFTMAC_PROBERQ (1<<4)
+
+/* Generate respones to probe requests */
+#define IEEE_SOFTMAC_PROBERS (1<<5)
+
+/* The ieee802.11 stack will manages the netif queue
+ * wake/stop for the driver, taking care of 802.11
+ * fragmentation. See softmac.c for details. */
+#define IEEE_SOFTMAC_TX_QUEUE (1<<7)
+
+/* Uses only the softmac_data_hard_start_xmit
+ * even for TX management frames.
+ */
+#define IEEE_SOFTMAC_SINGLE_QUEUE (1<<8)
+
+/* Generate beacons.  The stack will enqueue beacons
+ * to the card
+ */
+#define IEEE_SOFTMAC_BEACONS (1<<6)
+
+
+static inline void *rtllib_priv(struct net_device *dev)
+{
+       return ((struct rtllib_device *)netdev_priv(dev))->priv;
+}
+
+extern inline int rtllib_is_empty_essid(const char *essid, int essid_len)
+{
+       /* Single white space is for Linksys APs */
+       if (essid_len == 1 && essid[0] == ' ')
+               return 1;
+
+       /* Otherwise, if the entire essid is 0, we assume it is hidden */
+       while (essid_len) {
+               essid_len--;
+               if (essid[essid_len] != '\0')
+                       return 0;
+       }
+
+       return 1;
+}
+
+extern inline int rtllib_is_valid_mode(struct rtllib_device *ieee, int mode)
+{
+       /*
+        * It is possible for both access points and our device to support
+        * combinations of modes, so as long as there is one valid combination
+        * of ap/device supported modes, then return success
+        *
+        */
+       if ((mode & IEEE_A) &&
+           (ieee->modulation & RTLLIB_OFDM_MODULATION) &&
+           (ieee->freq_band & RTLLIB_52GHZ_BAND))
+               return 1;
+
+       if ((mode & IEEE_G) &&
+           (ieee->modulation & RTLLIB_OFDM_MODULATION) &&
+           (ieee->freq_band & RTLLIB_24GHZ_BAND))
+               return 1;
+
+       if ((mode & IEEE_B) &&
+           (ieee->modulation & RTLLIB_CCK_MODULATION) &&
+           (ieee->freq_band & RTLLIB_24GHZ_BAND))
+               return 1;
+
+       return 0;
+}
+
+extern inline int rtllib_get_hdrlen(u16 fc)
+{
+       int hdrlen = RTLLIB_3ADDR_LEN;
+
+       switch (WLAN_FC_GET_TYPE(fc)) {
+       case RTLLIB_FTYPE_DATA:
+               if ((fc & RTLLIB_FCTL_FROMDS) && (fc & RTLLIB_FCTL_TODS))
+                       hdrlen = RTLLIB_4ADDR_LEN; /* Addr4 */
+               if (RTLLIB_QOS_HAS_SEQ(fc))
+                       hdrlen += 2; /* QOS ctrl*/
+               break;
+       case RTLLIB_FTYPE_CTL:
+               switch (WLAN_FC_GET_STYPE(fc)) {
+               case RTLLIB_STYPE_CTS:
+               case RTLLIB_STYPE_ACK:
+                       hdrlen = RTLLIB_1ADDR_LEN;
+                       break;
+               default:
+                       hdrlen = RTLLIB_2ADDR_LEN;
+                       break;
+               }
+               break;
+       }
+
+       return hdrlen;
+}
+
+static inline u8 *rtllib_get_payload(struct rtllib_hdr *hdr)
+{
+        switch (rtllib_get_hdrlen(le16_to_cpu(hdr->frame_ctl))) {
+        case RTLLIB_1ADDR_LEN:
+                return ((struct rtllib_hdr_1addr *)hdr)->payload;
+        case RTLLIB_2ADDR_LEN:
+                return ((struct rtllib_hdr_2addr *)hdr)->payload;
+        case RTLLIB_3ADDR_LEN:
+                return ((struct rtllib_hdr_3addr *)hdr)->payload;
+        case RTLLIB_4ADDR_LEN:
+                return ((struct rtllib_hdr_4addr *)hdr)->payload;
+        }
+        return NULL;
+}
+
+static inline int rtllib_is_ofdm_rate(u8 rate)
+{
+        switch (rate & ~RTLLIB_BASIC_RATE_MASK) {
+        case RTLLIB_OFDM_RATE_6MB:
+        case RTLLIB_OFDM_RATE_9MB:
+        case RTLLIB_OFDM_RATE_12MB:
+        case RTLLIB_OFDM_RATE_18MB:
+        case RTLLIB_OFDM_RATE_24MB:
+        case RTLLIB_OFDM_RATE_36MB:
+        case RTLLIB_OFDM_RATE_48MB:
+        case RTLLIB_OFDM_RATE_54MB:
+                return 1;
+        }
+        return 0;
+}
+
+static inline int rtllib_is_cck_rate(u8 rate)
+{
+        switch (rate & ~RTLLIB_BASIC_RATE_MASK) {
+        case RTLLIB_CCK_RATE_1MB:
+        case RTLLIB_CCK_RATE_2MB:
+        case RTLLIB_CCK_RATE_5MB:
+        case RTLLIB_CCK_RATE_11MB:
+                return 1;
+        }
+        return 0;
+}
+
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,10))
+static inline unsigned compare_ether_addr(const u8 *addr1, const u8 *addr2)
+{
+       const u16 *a = (const u16 *) addr1;
+       const u16 *b = (const u16 *) addr2;
+
+       BUILD_BUG_ON(ETH_ALEN != 6);
+       return ((a[0] ^ b[0]) | (a[1] ^ b[1]) | (a[2] ^ b[2])) != 0;
+}
+#endif
+
+/* rtllib.c */
+extern void free_rtllib(struct net_device *dev);
+extern struct net_device *alloc_rtllib(int sizeof_priv);
+
+extern int rtllib_set_encryption(struct rtllib_device *ieee);
+
+/* rtllib_tx.c */
+
+extern int rtllib_encrypt_fragment(
+       struct rtllib_device *ieee,
+       struct sk_buff *frag,
+       int hdr_len);
+
+extern int rtllib_xmit(struct sk_buff *skb,  struct net_device *dev);
+extern int rtllib_xmit_inter(struct sk_buff *skb, struct net_device *dev);
+extern void rtllib_txb_free(struct rtllib_txb *);
+
+/* rtllib_rx.c */
+extern int rtllib_rx(struct rtllib_device *ieee, struct sk_buff *skb,
+                       struct rtllib_rx_stats *rx_stats);
+extern void rtllib_rx_mgt(struct rtllib_device *ieee,
+                            struct sk_buff *skb,
+                            struct rtllib_rx_stats *stats);
+extern void rtllib_rx_probe_rq(struct rtllib_device *ieee,
+                           struct sk_buff *skb);
+extern int IsLegalChannel( struct rtllib_device *rtllib, u8 channel);
+
+/* rtllib_wx.c */
+extern int rtllib_wx_get_scan(struct rtllib_device *ieee,
+                                struct iw_request_info *info,
+                                union iwreq_data *wrqu, char *key);
+extern int rtllib_wx_set_encode(struct rtllib_device *ieee,
+                                  struct iw_request_info *info,
+                                  union iwreq_data *wrqu, char *key);
+extern int rtllib_wx_get_encode(struct rtllib_device *ieee,
+                                  struct iw_request_info *info,
+                                  union iwreq_data *wrqu, char *key);
+#if WIRELESS_EXT >= 18
+extern int rtllib_wx_get_encode_ext(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data* wrqu, char *extra);
+extern int rtllib_wx_set_encode_ext(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data* wrqu, char *extra);
+#endif
+extern int rtllib_wx_set_auth(struct rtllib_device *ieee,
+                               struct iw_request_info *info,
+                               struct iw_param *data, char *extra);
+extern int rtllib_wx_set_mlme(struct rtllib_device *ieee,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra);
+extern int rtllib_wx_set_gen_ie(struct rtllib_device *ieee, u8 *ie, size_t len);
+
+/* rtllib_softmac.c */
+extern short rtllib_is_54g(struct rtllib_network *net);
+extern short rtllib_is_shortslot(struct rtllib_network net);
+extern int rtllib_rx_frame_softmac(struct rtllib_device *ieee, struct sk_buff *skb,
+                       struct rtllib_rx_stats *rx_stats, u16 type,
+                       u16 stype);
+extern void rtllib_softmac_new_net(struct rtllib_device *ieee, struct rtllib_network *net);
+
+void SendDisassociation(struct rtllib_device *ieee, bool deauth, u16 asRsn);
+extern void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee);
+
+extern void rtllib_stop_send_beacons(struct rtllib_device *ieee);
+extern void notify_wx_assoc_event(struct rtllib_device *ieee);
+extern void rtllib_softmac_check_all_nets(struct rtllib_device *ieee);
+extern void rtllib_start_bss(struct rtllib_device *ieee);
+extern void rtllib_start_master_bss(struct rtllib_device *ieee);
+extern void rtllib_start_ibss(struct rtllib_device *ieee);
+extern void rtllib_softmac_init(struct rtllib_device *ieee);
+extern void rtllib_softmac_free(struct rtllib_device *ieee);
+extern void rtllib_associate_abort(struct rtllib_device *ieee);
+extern void rtllib_disassociate(struct rtllib_device *ieee);
+extern void rtllib_stop_scan(struct rtllib_device *ieee);
+extern bool rtllib_act_scanning(struct rtllib_device *ieee, bool sync_scan);
+extern void rtllib_stop_scan_syncro(struct rtllib_device *ieee);
+extern void rtllib_start_scan_syncro(struct rtllib_device *ieee, u8 is_mesh);
+extern inline struct sk_buff *rtllib_probe_req(struct rtllib_device *ieee);
+extern u8 MgntQuery_MgntFrameTxRate(struct rtllib_device *ieee);
+extern void rtllib_sta_ps_send_null_frame(struct rtllib_device *ieee, short pwr);
+extern void rtllib_sta_wakeup(struct rtllib_device *ieee, short nl);
+extern void rtllib_sta_ps_send_pspoll_frame(struct rtllib_device *ieee);
+extern void rtllib_check_all_nets(struct rtllib_device *ieee);
+extern void rtllib_start_protocol(struct rtllib_device *ieee);
+extern void rtllib_stop_protocol(struct rtllib_device *ieee, u8 shutdown);
+
+extern void rtllib_EnableNetMonitorMode(struct net_device* dev, bool bInitState);
+extern void rtllib_DisableNetMonitorMode(struct net_device* dev, bool bInitState);
+extern void rtllib_EnableIntelPromiscuousMode(struct net_device* dev, bool bInitState);
+extern void rtllib_DisableIntelPromiscuousMode(struct net_device* dev, bool bInitState);
+extern void rtllib_send_probe_requests(struct rtllib_device *ieee, u8 is_mesh);
+
+extern void rtllib_softmac_stop_protocol(struct rtllib_device *ieee, u8 mesh_flag, u8 shutdown);
+extern void rtllib_softmac_start_protocol(struct rtllib_device *ieee,u8 mesh_flag);
+
+extern void rtllib_reset_queue(struct rtllib_device *ieee);
+extern void rtllib_wake_queue(struct rtllib_device *ieee);
+extern void rtllib_stop_queue(struct rtllib_device *ieee);
+extern void rtllib_wake_all_queues(struct rtllib_device *ieee);
+extern void rtllib_stop_all_queues(struct rtllib_device *ieee);
+extern struct sk_buff *rtllib_get_beacon(struct rtllib_device *ieee);
+extern void rtllib_start_send_beacons(struct rtllib_device *ieee);
+extern void rtllib_stop_send_beacons(struct rtllib_device *ieee);
+extern int rtllib_wpa_supplicant_ioctl(struct rtllib_device *ieee, struct iw_point *p, u8 is_mesh);
+
+extern void notify_wx_assoc_event(struct rtllib_device *ieee);
+extern void rtllib_ps_tx_ack(struct rtllib_device *ieee, short success);
+
+extern void softmac_mgmt_xmit(struct sk_buff *skb, struct rtllib_device *ieee);
+extern u16 rtllib_query_seqnum(struct rtllib_device*ieee, struct sk_buff* skb, u8* dst);
+extern u8 rtllib_ap_sec_type(struct rtllib_device *ieee);
+
+/* rtllib_crypt_ccmp&tkip&wep.c */
+extern void rtllib_tkip_null(void);
+extern void rtllib_wep_null(void);
+extern void rtllib_ccmp_null(void);
+
+/* rtllib_softmac_wx.c */
+
+extern int rtllib_wx_get_wap(struct rtllib_device *ieee,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *ext);
+
+extern int rtllib_wx_set_wap(struct rtllib_device *ieee,
+                        struct iw_request_info *info,
+                        union iwreq_data *awrq,
+                        char *extra);
+
+extern int rtllib_wx_get_essid(struct rtllib_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b);
+
+extern int rtllib_wx_set_rate(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_get_rate(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_set_mode(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b);
+
+extern int rtllib_wx_set_scan(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b);
+
+extern int rtllib_wx_set_essid(struct rtllib_device *ieee,
+                             struct iw_request_info *a,
+                             union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_get_mode(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b);
+
+extern int rtllib_wx_set_freq(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b);
+
+extern int rtllib_wx_get_freq(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b);
+extern void rtllib_wx_sync_scan_wq(void *data);
+
+extern int rtllib_wx_set_rawtx(struct rtllib_device *ieee,
+                              struct iw_request_info *info,
+                              union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_get_name(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_set_power(struct rtllib_device *ieee,
+                                struct iw_request_info *info,
+                                union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_get_power(struct rtllib_device *ieee,
+                                struct iw_request_info *info,
+                                union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_set_rts(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra);
+
+extern int rtllib_wx_get_rts(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra);
+#define MAX_RECEIVE_BUFFER_SIZE 9100
+extern void HTDebugHTCapability(u8* CapIE, u8* TitleString );
+extern void HTDebugHTInfo(u8*  InfoIE, u8* TitleString);
+
+void HTSetConnectBwMode(struct rtllib_device* ieee, HT_CHANNEL_WIDTH Bandwidth, HT_EXTCHNL_OFFSET    Offset);
+extern void HTUpdateDefaultSetting(struct rtllib_device* ieee);
+extern void HTConstructCapabilityElement(struct rtllib_device* ieee, u8* posHTCap, u8* len, u8 isEncrypt,bool bAssoc);
+extern void HTConstructInfoElement(struct rtllib_device* ieee, u8* posHTInfo, u8* len, u8 isEncrypt);
+extern void HTConstructRT2RTAggElement(struct rtllib_device* ieee, u8* posRT2RTAgg, u8* len);
+extern void HTOnAssocRsp(struct rtllib_device *ieee);
+extern void HTInitializeHTInfo(struct rtllib_device* ieee);
+extern void HTInitializeBssDesc(PBSS_HT pBssHT);
+extern void HTResetSelfAndSavePeerSetting(struct rtllib_device* ieee, struct rtllib_network * pNetwork);
+extern void HTUpdateSelfAndPeerSetting(struct rtllib_device* ieee,   struct rtllib_network * pNetwork);
+extern u8 HTGetHighestMCSRate(struct rtllib_device* ieee, u8* pMCSRateSet, u8* pMCSFilter);
+extern u8 MCS_FILTER_ALL[];
+extern u16 MCS_DATA_RATE[2][2][77] ;
+extern u8 HTCCheck(struct rtllib_device* ieee, u8*   pFrame);
+extern void HTResetIOTSetting(PRT_HIGH_THROUGHPUT  pHTInfo);
+extern bool IsHTHalfNmodeAPs(struct rtllib_device* ieee);
+extern u16 HTHalfMcsToDataRate(struct rtllib_device* ieee,  u8      nMcsRate);
+extern u16 HTMcsToDataRate( struct rtllib_device* ieee, u8 nMcsRate);
+extern u16  TxCountToDataRate( struct rtllib_device* ieee, u8 nDataRate);
+extern int rtllib_rx_ADDBAReq( struct rtllib_device* ieee, struct sk_buff *skb);
+extern int rtllib_rx_ADDBARsp( struct rtllib_device* ieee, struct sk_buff *skb);
+extern int rtllib_rx_DELBA(struct rtllib_device* ieee,struct sk_buff *skb);
+extern void TsInitAddBA( struct rtllib_device* ieee, PTX_TS_RECORD   pTS, u8 Policy, u8 bOverwritePending);
+extern void TsInitDelBA( struct rtllib_device* ieee, PTS_COMMON_INFO pTsCommonInfo, TR_SELECT TxRxSelect);
+extern void BaSetupTimeOut(unsigned long data);
+extern void TxBaInactTimeout(unsigned long data);
+extern void RxBaInactTimeout(unsigned long data);
+extern void ResetBaEntry( PBA_RECORD pBA);
+extern bool GetTs(
+        struct rtllib_device*        ieee,
+        PTS_COMMON_INFO                 *ppTS,
+        u8*                             Addr,
+        u8                              TID,
+        TR_SELECT                       TxRxSelect,
+        bool                            bAddNewTs
+        );
+extern void TSInitialize(struct rtllib_device *ieee);
+extern  void TsStartAddBaProcess(struct rtllib_device* ieee, PTX_TS_RECORD   pTxTS);
+extern void RemovePeerTS(struct rtllib_device* ieee, u8* Addr);
+extern void RemoveAllTS(struct rtllib_device* ieee);
+void rtllib_softmac_scan_syncro(struct rtllib_device *ieee, u8 is_mesh);
+
+extern const long rtllib_wlan_frequencies[];
+
+extern inline void rtllib_increment_scans(struct rtllib_device *ieee)
+{
+       ieee->scans++;
+}
+
+extern inline int rtllib_get_scans(struct rtllib_device *ieee)
+{
+       return ieee->scans;
+}
+
+static inline const char *escape_essid(const char *essid, u8 essid_len) {
+       static char escaped[IW_ESSID_MAX_SIZE * 2 + 1];
+       const char *s = essid;
+       char *d = escaped;
+
+       if (rtllib_is_empty_essid(essid, essid_len)) {
+               memcpy(escaped, "<hidden>", sizeof("<hidden>"));
+               return escaped;
+       }
+
+       essid_len = min(essid_len, (u8)IW_ESSID_MAX_SIZE);
+       while (essid_len--) {
+               if (*s == '\0') {
+                       *d++ = '\\';
+                       *d++ = '0';
+                       s++;
+               } else {
+                       *d++ = *s++;
+               }
+       }
+       *d = '\0';
+       return escaped;
+}
+
+#define CONVERT_RATE(_ieee, _MGN_RATE) (_MGN_RATE<MGN_MCS0)?(_MGN_RATE):(HTMcsToDataRate(_ieee, (u8)_MGN_RATE))
+
+/* fun with the built-in rtllib stack... */
+int rtllib_init(void);
+void rtllib_exit(void);
+int rtllib_crypto_init(void);
+void rtllib_crypto_deinit(void);
+int rtllib_crypto_tkip_init(void);
+void rtllib_crypto_tkip_exit(void);
+int rtllib_crypto_ccmp_init(void);
+void rtllib_crypto_ccmp_exit(void);
+int rtllib_crypto_wep_init(void);
+void rtllib_crypto_wep_exit(void);
+
+void rtllib_MgntDisconnectIBSS(struct rtllib_device* rtllib);
+void rtllib_MlmeDisassociateRequest(struct rtllib_device* rtllib, u8* asSta,u8 asRsn);
+void rtllib_MgntDisconnectAP(struct rtllib_device* rtllib,     u8 asRsn);
+bool rtllib_MgntDisconnect(struct rtllib_device* rtllib,u8 asRsn);
+
+
+/* For the function is more related to hardware setting, it's better to use the
+ * ieee handler to refer to it.
+ */
+extern void rtllib_update_active_chan_map(struct rtllib_device *ieee);
+extern void rtllib_FlushRxTsPendingPkts(struct rtllib_device *ieee, PRX_TS_RECORD pTS);
+extern int rtllib_data_xmit(struct sk_buff *skb, struct net_device *dev);
+extern int rtllib_parse_info_param(struct rtllib_device *ieee,
+               struct rtllib_info_element *info_element,
+               u16 length,
+               struct rtllib_network *network,
+               struct rtllib_rx_stats *stats);
+
+void rtllib_indicate_packets(struct rtllib_device *ieee, struct rtllib_rxb** prxbIndicateArray,u8  index);
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+extern void IbssAgeFunction(struct rtllib_device *ieee);
+extern struct sta_info *GetStaInfo(struct rtllib_device *ieee, u8 *addr);
+extern void DelStaInfoList(struct rtllib_device *ieee);
+extern void DelStaInfo(struct rtllib_device *ieee, u8 *addr);
+#endif
+extern u8 HTFilterMCSRate( struct rtllib_device* ieee, u8* pSupportMCS, u8* pOperateMCS);
+extern void HTUseDefaultSetting(struct rtllib_device* ieee);
+#define RT_ASOC_RETRY_LIMIT    5
+u8 MgntQuery_TxRateExcludeCCKRates(struct rtllib_device *ieee);
+extern void rtllib_TURBO_Info(struct rtllib_device *ieee, u8 **tag_p);
+#ifndef ENABLE_LOCK_DEBUG
+#define SPIN_LOCK_IEEE(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_IEEE(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_IEEE_REORDER(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_IEEE_REORDER(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_IEEE_WPAX(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_IEEE_WPAX(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_IEEE_MGNTTX(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_IEEE_MGNTTX(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_IEEE_BCN(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_IEEE_BCN(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_MSH_STAINFO(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_MSH_STAINFO(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_MSH_PREQ(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_MSH_PREQ(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_MSH_QUEUE(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_MSH_QUEUE(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_PRIV_RFPS(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_PRIV_RFPS(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_PRIV_IRQTH(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_PRIV_IRQTH(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_PRIV_TX(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_PRIV_TX(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_PRIV_D3(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_PRIV_D3(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_PRIV_RF(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_PRIV_RF(plock) spin_unlock_irqrestore((plock), flags)
+#define SPIN_LOCK_PRIV_PS(plock) spin_lock_irqsave((plock), flags)
+#define SPIN_UNLOCK_PRIV_PS(plock) spin_unlock_irqrestore((plock), flags)
+#define SEM_DOWN_IEEE_WX(psem) down(psem)
+#define SEM_UP_IEEE_WX(psem) up(psem)
+#define SEM_DOWN_IEEE_SCAN(psem) down(psem)
+#define SEM_UP_IEEE_SCAN(psem) up(psem)
+#define SEM_DOWN_IEEE_IPS(psem) down(psem)
+#define SEM_UP_IEEE_IPS(psem) up(psem)
+#define SEM_DOWN_PRIV_WX(psem) down(psem)
+#define SEM_UP_PRIV_WX(psem) up(psem)
+#define SEM_DOWN_PRIV_RF(psem) down(psem)
+#define SEM_UP_PRIV_RF(psem) up(psem)
+#define MUTEX_LOCK_PRIV(pmutex) mutex_lock(pmutex)
+#define MUTEX_UNLOCK_PRIV(pmutex) mutex_unlock(pmutex)
+#endif
+static inline void dump_buf(u8 *buf, u32 len)
+{
+       u32 i;
+       printk("-----------------Len %d----------------\n", len);
+       for (i=0; i<len; i++)
+               printk("%2.2x-", *(buf+i));
+       printk("\n");
+}
+#endif /* RTLLIB_H */
diff --git a/drivers/staging/rtl8192e/rtllib_crypt.c b/drivers/staging/rtl8192e/rtllib_crypt.c
new file mode 100644 (file)
index 0000000..225d28a
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * Host AP crypto routines
+ *
+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
+ * Portions Copyright (C) 2004, Intel Corporation <jketreno@linux.intel.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ *
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <asm/string.h>
+#include <asm/errno.h>
+
+#include "rtllib.h"
+
+struct rtllib_crypto_alg {
+       struct list_head list;
+       struct rtllib_crypto_ops *ops;
+};
+
+
+struct rtllib_crypto {
+       struct list_head algs;
+       spinlock_t lock;
+};
+
+static struct rtllib_crypto *hcrypt;
+
+void rtllib_crypt_deinit_entries(struct rtllib_device *ieee,
+                                          int force)
+{
+       struct list_head *ptr, *n;
+       struct rtllib_crypt_data *entry;
+
+       for (ptr = ieee->crypt_deinit_list.next, n = ptr->next;
+            ptr != &ieee->crypt_deinit_list; ptr = n, n = ptr->next) {
+               entry = list_entry(ptr, struct rtllib_crypt_data, list);
+
+               if (atomic_read(&entry->refcnt) != 0 && !force)
+                       continue;
+
+               list_del(ptr);
+
+               if (entry->ops)
+                       entry->ops->deinit(entry->priv);
+               kfree(entry);
+       }
+}
+
+void rtllib_crypt_deinit_handler(unsigned long data)
+{
+       struct rtllib_device *ieee = (struct rtllib_device *)data;
+       unsigned long flags;
+
+       spin_lock_irqsave(&ieee->lock, flags);
+       rtllib_crypt_deinit_entries(ieee, 0);
+       if (!list_empty(&ieee->crypt_deinit_list)) {
+               printk(KERN_DEBUG "%s: entries remaining in delayed crypt "
+                      "deletion list\n", ieee->dev->name);
+               ieee->crypt_deinit_timer.expires = jiffies + HZ;
+               add_timer(&ieee->crypt_deinit_timer);
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+}
+
+void rtllib_crypt_delayed_deinit(struct rtllib_device *ieee,
+                                   struct rtllib_crypt_data **crypt)
+{
+       struct rtllib_crypt_data *tmp;
+       unsigned long flags;
+
+       if (*crypt == NULL)
+               return;
+
+       tmp = *crypt;
+       *crypt = NULL;
+
+       /* must not run ops->deinit() while there may be pending encrypt or
+        * decrypt operations. Use a list of delayed deinits to avoid needing
+        * locking. */
+
+       spin_lock_irqsave(&ieee->lock, flags);
+       list_add(&tmp->list, &ieee->crypt_deinit_list);
+       if (!timer_pending(&ieee->crypt_deinit_timer)) {
+               ieee->crypt_deinit_timer.expires = jiffies + HZ;
+               add_timer(&ieee->crypt_deinit_timer);
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+}
+
+int rtllib_register_crypto_ops(struct rtllib_crypto_ops *ops)
+{
+       unsigned long flags;
+       struct rtllib_crypto_alg *alg;
+
+       if (hcrypt == NULL)
+               return -1;
+
+       alg = kmalloc(sizeof(*alg), GFP_KERNEL);
+       if (alg == NULL)
+               return -ENOMEM;
+
+       memset(alg, 0, sizeof(*alg));
+       alg->ops = ops;
+
+       spin_lock_irqsave(&hcrypt->lock, flags);
+       list_add(&alg->list, &hcrypt->algs);
+       spin_unlock_irqrestore(&hcrypt->lock, flags);
+
+       printk(KERN_DEBUG "rtllib_crypt: registered algorithm '%s'\n",
+              ops->name);
+
+       return 0;
+}
+
+int rtllib_unregister_crypto_ops(struct rtllib_crypto_ops *ops)
+{
+       unsigned long flags;
+       struct list_head *ptr;
+       struct rtllib_crypto_alg *del_alg = NULL;
+
+       if (hcrypt == NULL)
+               return -1;
+
+       spin_lock_irqsave(&hcrypt->lock, flags);
+       for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
+               struct rtllib_crypto_alg *alg =
+                       (struct rtllib_crypto_alg *) ptr;
+               if (alg->ops == ops) {
+                       list_del(&alg->list);
+                       del_alg = alg;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&hcrypt->lock, flags);
+
+       if (del_alg) {
+               printk(KERN_DEBUG "rtllib_crypt: unregistered algorithm "
+                      "'%s'\n", ops->name);
+               kfree(del_alg);
+       }
+
+       return del_alg ? 0 : -1;
+}
+
+
+struct rtllib_crypto_ops * rtllib_get_crypto_ops(const char *name)
+{
+       unsigned long flags;
+       struct list_head *ptr;
+       struct rtllib_crypto_alg *found_alg = NULL;
+
+       if (hcrypt == NULL)
+               return NULL;
+
+       spin_lock_irqsave(&hcrypt->lock, flags);
+       for (ptr = hcrypt->algs.next; ptr != &hcrypt->algs; ptr = ptr->next) {
+               struct rtllib_crypto_alg *alg =
+                       (struct rtllib_crypto_alg *) ptr;
+               if (strcmp(alg->ops->name, name) == 0) {
+                       found_alg = alg;
+                       break;
+               }
+       }
+       spin_unlock_irqrestore(&hcrypt->lock, flags);
+
+       if (found_alg)
+               return found_alg->ops;
+       else
+               return NULL;
+}
+
+
+static void * rtllib_crypt_null_init(int keyidx) { return (void *) 1; }
+static void rtllib_crypt_null_deinit(void *priv) {}
+
+static struct rtllib_crypto_ops rtllib_crypt_null = {
+       .name                   = "NULL",
+       .init                   = rtllib_crypt_null_init,
+       .deinit                 = rtllib_crypt_null_deinit,
+       .encrypt_mpdu           = NULL,
+       .decrypt_mpdu           = NULL,
+       .encrypt_msdu           = NULL,
+       .decrypt_msdu           = NULL,
+       .set_key                = NULL,
+       .get_key                = NULL,
+       .extra_prefix_len       = 0,
+       .extra_postfix_len      = 0,
+       .owner                  = THIS_MODULE,
+};
+
+
+int __init rtllib_crypto_init(void)
+{
+       int ret = -ENOMEM;
+
+       hcrypt = kmalloc(sizeof(*hcrypt), GFP_KERNEL);
+       if (!hcrypt)
+               goto out;
+
+       memset(hcrypt, 0, sizeof(*hcrypt));
+       INIT_LIST_HEAD(&hcrypt->algs);
+       spin_lock_init(&hcrypt->lock);
+
+       ret = rtllib_register_crypto_ops(&rtllib_crypt_null);
+       if (ret < 0) {
+               kfree(hcrypt);
+               hcrypt = NULL;
+       }
+out:
+       return ret;
+}
+
+
+void __exit rtllib_crypto_deinit(void)
+{
+       struct list_head *ptr, *n;
+
+       if (hcrypt == NULL)
+               return;
+
+       for (ptr = hcrypt->algs.next, n = ptr->next; ptr != &hcrypt->algs;
+            ptr = n, n = ptr->next) {
+               struct rtllib_crypto_alg *alg =
+                       (struct rtllib_crypto_alg *) ptr;
+               list_del(ptr);
+               printk(KERN_DEBUG "rtllib_crypt: unregistered algorithm "
+                      "'%s' (deinit)\n", alg->ops->name);
+               kfree(alg);
+       }
+
+       kfree(hcrypt);
+}
diff --git a/drivers/staging/rtl8192e/rtllib_crypt.h b/drivers/staging/rtl8192e/rtllib_crypt.h
new file mode 100644 (file)
index 0000000..5f8990c
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Original code based on Host AP (software wireless LAN access point) driver
+ * for Intersil Prism2/2.5/3.
+ *
+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+ * <jkmaline@cc.hut.fi>
+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
+ *
+ * Adaption to a generic IEEE 802.11 stack by James Ketrenos
+ * <jketreno@linux.intel.com>
+ *
+ * Copyright (c) 2004, Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+
+/*
+ * This file defines the interface to the rtllib crypto module.
+ */
+#ifndef RTLLIB_CRYPT_H
+#define RTLLIB_CRYPT_H
+
+#include <linux/skbuff.h>
+
+struct rtllib_crypto_ops {
+       const char *name;
+
+       /* init new crypto context (e.g., allocate private data space,
+        * select IV, etc.); returns NULL on failure or pointer to allocated
+        * private data on success */
+       void * (*init)(int keyidx);
+
+       /* deinitialize crypto context and free allocated private data */
+       void (*deinit)(void *priv);
+
+       /* encrypt/decrypt return < 0 on error or >= 0 on success. The return
+        * value from decrypt_mpdu is passed as the keyidx value for
+        * decrypt_msdu. skb must have enough head and tail room for the
+        * encryption; if not, error will be returned; these functions are
+        * called for all MPDUs (i.e., fragments).
+        */
+       int (*encrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv);
+       int (*decrypt_mpdu)(struct sk_buff *skb, int hdr_len, void *priv);
+
+       /* These functions are called for full MSDUs, i.e. full frames.
+        * These can be NULL if full MSDU operations are not needed. */
+       int (*encrypt_msdu)(struct sk_buff *skb, int hdr_len, void *priv);
+       int (*decrypt_msdu)(struct sk_buff *skb, int keyidx, int hdr_len,
+                           void *priv, struct rtllib_device* ieee);
+
+       int (*set_key)(void *key, int len, u8 *seq, void *priv);
+       int (*get_key)(void *key, int len, u8 *seq, void *priv);
+
+       /* procfs handler for printing out key information and possible
+        * statistics */
+       char * (*print_stats)(char *p, void *priv);
+
+       /* maximum number of bytes added by encryption; encrypt buf is
+        * allocated with extra_prefix_len bytes, copy of in_buf, and
+        * extra_postfix_len; encrypt need not use all this space, but
+        * the result must start at the beginning of the buffer and correct
+        * length must be returned */
+       int extra_prefix_len, extra_postfix_len;
+
+       struct module *owner;
+};
+
+struct rtllib_crypt_data {
+       struct list_head list; /* delayed deletion list */
+       struct rtllib_crypto_ops *ops;
+       void *priv;
+       atomic_t refcnt;
+};
+
+int rtllib_register_crypto_ops(struct rtllib_crypto_ops *ops);
+int rtllib_unregister_crypto_ops(struct rtllib_crypto_ops *ops);
+struct rtllib_crypto_ops * rtllib_get_crypto_ops(const char *name);
+void rtllib_crypt_deinit_entries(struct rtllib_device *, int);
+void rtllib_crypt_deinit_handler(unsigned long);
+void rtllib_crypt_delayed_deinit(struct rtllib_device *ieee,
+                                   struct rtllib_crypt_data **crypt);
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#define offset_in_page(p) ((unsigned long)(p) & ~PAGE_MASK)
+#endif
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,4,31))
+#define crypto_alloc_tfm crypto_alloc_tfm_rsl
+#define crypto_free_tfm crypto_free_tfm_rsl
+#endif
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
new file mode 100644 (file)
index 0000000..80b56b4
--- /dev/null
@@ -0,0 +1,505 @@
+/*
+ * Host AP crypt: host-based CCMP encryption implementation for Host AP driver
+ *
+ * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/random.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/if_ether.h>
+#include <linux/if_arp.h>
+#include <asm/string.h>
+#include <linux/wireless.h>
+#include "rtllib.h"
+
+#if defined(BUILT_IN_CRYPTO) || (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include "rtl_crypto.h"
+#else
+#include <linux/crypto.h>
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+    #include <asm/scatterlist.h>
+#else
+    #include <linux/scatterlist.h>
+#endif
+
+#define AES_BLOCK_LEN 16
+#define CCMP_HDR_LEN 8
+#define CCMP_MIC_LEN 8
+#define CCMP_TK_LEN 16
+#define CCMP_PN_LEN 6
+
+struct rtllib_ccmp_data {
+       u8 key[CCMP_TK_LEN];
+       int key_set;
+
+       u8 tx_pn[CCMP_PN_LEN];
+       u8 rx_pn[CCMP_PN_LEN];
+
+       u32 dot11RSNAStatsCCMPFormatErrors;
+       u32 dot11RSNAStatsCCMPReplays;
+       u32 dot11RSNAStatsCCMPDecryptErrors;
+
+       int key_idx;
+
+       struct crypto_tfm *tfm;
+
+       /* scratch buffers for virt_to_page() (crypto API) */
+       u8 tx_b0[AES_BLOCK_LEN], tx_b[AES_BLOCK_LEN],
+               tx_e[AES_BLOCK_LEN], tx_s0[AES_BLOCK_LEN];
+       u8 rx_b0[AES_BLOCK_LEN], rx_b[AES_BLOCK_LEN], rx_a[AES_BLOCK_LEN];
+};
+
+void rtllib_ccmp_aes_encrypt(struct crypto_tfm *tfm,
+                            const u8 pt[16], u8 ct[16])
+{
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       struct scatterlist src, dst;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+       src.page = virt_to_page(pt);
+       src.offset = offset_in_page(pt);
+       src.length = AES_BLOCK_LEN;
+
+       dst.page = virt_to_page(ct);
+       dst.offset = offset_in_page(ct);
+       dst.length = AES_BLOCK_LEN;
+
+#else
+       sg_init_one(&src, pt, AES_BLOCK_LEN);
+       sg_init_one(&dst, ct, AES_BLOCK_LEN);
+#endif
+
+       crypto_cipher_encrypt(tfm, &dst, &src, AES_BLOCK_LEN);
+#else
+       crypto_cipher_encrypt_one((void*)tfm, ct, pt);
+#endif
+}
+
+static void * rtllib_ccmp_init(int key_idx)
+{
+       struct rtllib_ccmp_data *priv;
+
+       priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
+       if (priv == NULL)
+               goto fail;
+       memset(priv, 0, sizeof(*priv));
+       priv->key_idx = key_idx;
+
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       priv->tfm = crypto_alloc_tfm("aes", 0);
+       if (priv->tfm == NULL) {
+               printk(KERN_DEBUG "rtllib_crypt_ccmp: could not allocate "
+                      "crypto API aes\n");
+               goto fail;
+       }
+       #else
+       priv->tfm = (void*)crypto_alloc_cipher("aes", 0, CRYPTO_ALG_ASYNC);
+       if (IS_ERR(priv->tfm)) {
+               printk(KERN_DEBUG "rtllib_crypt_ccmp: could not allocate "
+                      "crypto API aes\n");
+               priv->tfm = NULL;
+               goto fail;
+       }
+       #endif
+       return priv;
+
+fail:
+       if (priv) {
+               if (priv->tfm)
+                       #if defined(BUILT_IN_CRYPTO) || (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
+                       crypto_free_tfm(priv->tfm);
+                    #else
+                       crypto_free_cipher((void*)priv->tfm);
+                     #endif
+               kfree(priv);
+       }
+
+       return NULL;
+}
+
+
+static void rtllib_ccmp_deinit(void *priv)
+{
+       struct rtllib_ccmp_data *_priv = priv;
+       if (_priv && _priv->tfm)
+#if defined(BUILT_IN_CRYPTO) || (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21))
+               crypto_free_tfm(_priv->tfm);
+#else
+               crypto_free_cipher((void*)_priv->tfm);
+#endif
+       kfree(priv);
+}
+
+
+static inline void xor_block(u8 *b, u8 *a, size_t len)
+{
+       int i;
+       for (i = 0; i < len; i++)
+               b[i] ^= a[i];
+}
+
+
+
+static void ccmp_init_blocks(struct crypto_tfm *tfm,
+                            struct rtllib_hdr_4addr *hdr,
+                            u8 *pn, size_t dlen, u8 *b0, u8 *auth,
+                            u8 *s0)
+{
+       u8 *pos, qc = 0;
+       size_t aad_len;
+       u16 fc;
+       int a4_included, qc_included;
+       u8 aad[2 * AES_BLOCK_LEN];
+
+       fc = le16_to_cpu(hdr->frame_ctl);
+       a4_included = ((fc & (RTLLIB_FCTL_TODS | RTLLIB_FCTL_FROMDS)) ==
+                      (RTLLIB_FCTL_TODS | RTLLIB_FCTL_FROMDS));
+       /*
+       qc_included = ((WLAN_FC_GET_TYPE(fc) == RTLLIB_FTYPE_DATA) &&
+                      (WLAN_FC_GET_STYPE(fc) & 0x08));
+        */
+       qc_included = ((WLAN_FC_GET_TYPE(fc) == RTLLIB_FTYPE_DATA) &&
+                      (WLAN_FC_GET_STYPE(fc) & 0x80));
+       aad_len = 22;
+       if (a4_included)
+               aad_len += 6;
+       if (qc_included) {
+               pos = (u8 *) &hdr->addr4;
+               if (a4_included)
+                       pos += 6;
+               qc = *pos & 0x0f;
+               aad_len += 2;
+       }
+       /* CCM Initial Block:
+        * Flag (Include authentication header, M=3 (8-octet MIC),
+        *       L=1 (2-octet Dlen))
+        * Nonce: 0x00 | A2 | PN
+        * Dlen */
+       b0[0] = 0x59;
+       b0[1] = qc;
+       memcpy(b0 + 2, hdr->addr2, ETH_ALEN);
+       memcpy(b0 + 8, pn, CCMP_PN_LEN);
+       b0[14] = (dlen >> 8) & 0xff;
+       b0[15] = dlen & 0xff;
+
+       /* AAD:
+        * FC with bits 4..6 and 11..13 masked to zero; 14 is always one
+        * A1 | A2 | A3
+        * SC with bits 4..15 (seq#) masked to zero
+        * A4 (if present)
+        * QC (if present)
+        */
+       pos = (u8 *) hdr;
+       aad[0] = 0; /* aad_len >> 8 */
+       aad[1] = aad_len & 0xff;
+       aad[2] = pos[0] & 0x8f;
+       aad[3] = pos[1] & 0xc7;
+       memcpy(aad + 4, hdr->addr1, 3 * ETH_ALEN);
+       pos = (u8 *) &hdr->seq_ctl;
+       aad[22] = pos[0] & 0x0f;
+       aad[23] = 0; /* all bits masked */
+       memset(aad + 24, 0, 8);
+       if (a4_included)
+               memcpy(aad + 24, hdr->addr4, ETH_ALEN);
+       if (qc_included) {
+               aad[a4_included ? 30 : 24] = qc;
+               /* rest of QC masked */
+       }
+
+       /* Start with the first block and AAD */
+       rtllib_ccmp_aes_encrypt(tfm, b0, auth);
+       xor_block(auth, aad, AES_BLOCK_LEN);
+       rtllib_ccmp_aes_encrypt(tfm, auth, auth);
+       xor_block(auth, &aad[AES_BLOCK_LEN], AES_BLOCK_LEN);
+       rtllib_ccmp_aes_encrypt(tfm, auth, auth);
+       b0[0] &= 0x07;
+       b0[14] = b0[15] = 0;
+       rtllib_ccmp_aes_encrypt(tfm, b0, s0);
+}
+
+
+
+static int rtllib_ccmp_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct rtllib_ccmp_data *key = priv;
+       int data_len, i;
+       u8 *pos;
+       struct rtllib_hdr_4addr *hdr;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       if (skb_headroom(skb) < CCMP_HDR_LEN ||
+           skb_tailroom(skb) < CCMP_MIC_LEN ||
+           skb->len < hdr_len)
+               return -1;
+
+       data_len = skb->len - hdr_len;
+       pos = skb_push(skb, CCMP_HDR_LEN);
+       memmove(pos, pos + CCMP_HDR_LEN, hdr_len);
+       pos += hdr_len;
+
+       i = CCMP_PN_LEN - 1;
+       while (i >= 0) {
+               key->tx_pn[i]++;
+               if (key->tx_pn[i] != 0)
+                       break;
+               i--;
+       }
+
+       *pos++ = key->tx_pn[5];
+       *pos++ = key->tx_pn[4];
+       *pos++ = 0;
+       *pos++ = (key->key_idx << 6) | (1 << 5) /* Ext IV included */;
+       *pos++ = key->tx_pn[3];
+       *pos++ = key->tx_pn[2];
+       *pos++ = key->tx_pn[1];
+       *pos++ = key->tx_pn[0];
+
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       if (!tcb_desc->bHwSec) {
+               int blocks, last, len;
+               u8 *mic;
+               u8 *b0 = key->tx_b0;
+               u8 *b = key->tx_b;
+               u8 *e = key->tx_e;
+               u8 *s0 = key->tx_s0;
+
+               mic = skb_put(skb, CCMP_MIC_LEN);
+
+               ccmp_init_blocks(key->tfm, hdr, key->tx_pn, data_len, b0, b, s0);
+
+               blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN;
+               last = data_len % AES_BLOCK_LEN;
+
+               for (i = 1; i <= blocks; i++) {
+                       len = (i == blocks && last) ? last : AES_BLOCK_LEN;
+                       /* Authentication */
+                       xor_block(b, pos, len);
+                       rtllib_ccmp_aes_encrypt(key->tfm, b, b);
+                       /* Encryption, with counter */
+                       b0[14] = (i >> 8) & 0xff;
+                       b0[15] = i & 0xff;
+                       rtllib_ccmp_aes_encrypt(key->tfm, b0, e);
+                       xor_block(pos, e, len);
+                       pos += len;
+               }
+
+               for (i = 0; i < CCMP_MIC_LEN; i++)
+                       mic[i] = b[i] ^ s0[i];
+       }
+       return 0;
+}
+
+
+static int rtllib_ccmp_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct rtllib_ccmp_data *key = priv;
+       u8 keyidx, *pos;
+       struct rtllib_hdr_4addr *hdr;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       u8 pn[6];
+
+       if (skb->len < hdr_len + CCMP_HDR_LEN + CCMP_MIC_LEN) {
+               key->dot11RSNAStatsCCMPFormatErrors++;
+               return -1;
+       }
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       pos = skb->data + hdr_len;
+       keyidx = pos[3];
+       if (!(keyidx & (1 << 5))) {
+               if (net_ratelimit()) {
+                       printk(KERN_DEBUG "CCMP: received packet without ExtIV"
+                              " flag from " MAC_FMT "\n", MAC_ARG(hdr->addr2));
+               }
+               key->dot11RSNAStatsCCMPFormatErrors++;
+               return -2;
+       }
+       keyidx >>= 6;
+       if (key->key_idx != keyidx) {
+               printk(KERN_DEBUG "CCMP: RX tkey->key_idx=%d frame "
+                      "keyidx=%d priv=%p\n", key->key_idx, keyidx, priv);
+               return -6;
+       }
+       if (!key->key_set) {
+               if (net_ratelimit()) {
+                       printk(KERN_DEBUG "CCMP: received packet from " MAC_FMT
+                              " with keyid=%d that does not have a configured"
+                              " key\n", MAC_ARG(hdr->addr2), keyidx);
+               }
+               return -3;
+       }
+
+       pn[0] = pos[7];
+       pn[1] = pos[6];
+       pn[2] = pos[5];
+       pn[3] = pos[4];
+       pn[4] = pos[1];
+       pn[5] = pos[0];
+       pos += 8;
+       if (memcmp(pn, key->rx_pn, CCMP_PN_LEN) <= 0) {
+               key->dot11RSNAStatsCCMPReplays++;
+               return -4;
+       }
+       if (!tcb_desc->bHwSec) {
+               size_t data_len = skb->len - hdr_len - CCMP_HDR_LEN - CCMP_MIC_LEN;
+               u8 *mic = skb->data + skb->len - CCMP_MIC_LEN;
+               u8 *b0 = key->rx_b0;
+               u8 *b = key->rx_b;
+               u8 *a = key->rx_a;
+               int i, blocks, last, len;
+
+
+               ccmp_init_blocks(key->tfm, hdr, pn, data_len, b0, a, b);
+               xor_block(mic, b, CCMP_MIC_LEN);
+
+               blocks = (data_len + AES_BLOCK_LEN - 1) / AES_BLOCK_LEN;
+               last = data_len % AES_BLOCK_LEN;
+
+               for (i = 1; i <= blocks; i++) {
+                       len = (i == blocks && last) ? last : AES_BLOCK_LEN;
+                       /* Decrypt, with counter */
+                       b0[14] = (i >> 8) & 0xff;
+                       b0[15] = i & 0xff;
+                       rtllib_ccmp_aes_encrypt(key->tfm, b0, b);
+                       xor_block(pos, b, len);
+                       /* Authentication */
+                       xor_block(a, pos, len);
+                       rtllib_ccmp_aes_encrypt(key->tfm, a, a);
+                       pos += len;
+               }
+
+               if (memcmp(mic, a, CCMP_MIC_LEN) != 0) {
+                       if (net_ratelimit()) {
+                               printk(KERN_DEBUG "CCMP: decrypt failed: STA="
+                               MAC_FMT "\n", MAC_ARG(hdr->addr2));
+                       }
+                       key->dot11RSNAStatsCCMPDecryptErrors++;
+                       return -5;
+               }
+
+               memcpy(key->rx_pn, pn, CCMP_PN_LEN);
+       }
+       /* Remove hdr and MIC */
+       memmove(skb->data + CCMP_HDR_LEN, skb->data, hdr_len);
+       skb_pull(skb, CCMP_HDR_LEN);
+       skb_trim(skb, skb->len - CCMP_MIC_LEN);
+
+       return keyidx;
+}
+
+
+static int rtllib_ccmp_set_key(void *key, int len, u8 *seq, void *priv)
+{
+       struct rtllib_ccmp_data *data = priv;
+       int keyidx;
+       struct crypto_tfm *tfm = data->tfm;
+
+       keyidx = data->key_idx;
+       memset(data, 0, sizeof(*data));
+       data->key_idx = keyidx;
+       data->tfm = tfm;
+       if (len == CCMP_TK_LEN) {
+               memcpy(data->key, key, CCMP_TK_LEN);
+               data->key_set = 1;
+               if (seq) {
+                       data->rx_pn[0] = seq[5];
+                       data->rx_pn[1] = seq[4];
+                       data->rx_pn[2] = seq[3];
+                       data->rx_pn[3] = seq[2];
+                       data->rx_pn[4] = seq[1];
+                       data->rx_pn[5] = seq[0];
+               }
+               crypto_cipher_setkey((void*)data->tfm, data->key, CCMP_TK_LEN);
+       } else if (len == 0)
+               data->key_set = 0;
+       else
+               return -1;
+
+       return 0;
+}
+
+
+static int rtllib_ccmp_get_key(void *key, int len, u8 *seq, void *priv)
+{
+       struct rtllib_ccmp_data *data = priv;
+
+       if (len < CCMP_TK_LEN)
+               return -1;
+
+       if (!data->key_set)
+               return 0;
+       memcpy(key, data->key, CCMP_TK_LEN);
+
+       if (seq) {
+               seq[0] = data->tx_pn[5];
+               seq[1] = data->tx_pn[4];
+               seq[2] = data->tx_pn[3];
+               seq[3] = data->tx_pn[2];
+               seq[4] = data->tx_pn[1];
+               seq[5] = data->tx_pn[0];
+       }
+
+       return CCMP_TK_LEN;
+}
+
+
+static char * rtllib_ccmp_print_stats(char *p, void *priv)
+{
+       struct rtllib_ccmp_data *ccmp = priv;
+       p += sprintf(p, "key[%d] alg=CCMP key_set=%d "
+                    "tx_pn=%02x%02x%02x%02x%02x%02x "
+                    "rx_pn=%02x%02x%02x%02x%02x%02x "
+                    "format_errors=%d replays=%d decrypt_errors=%d\n",
+                    ccmp->key_idx, ccmp->key_set,
+                    MAC_ARG(ccmp->tx_pn), MAC_ARG(ccmp->rx_pn),
+                    ccmp->dot11RSNAStatsCCMPFormatErrors,
+                    ccmp->dot11RSNAStatsCCMPReplays,
+                    ccmp->dot11RSNAStatsCCMPDecryptErrors);
+
+       return p;
+}
+
+void rtllib_ccmp_null(void)
+{
+       return;
+}
+
+static struct rtllib_crypto_ops rtllib_crypt_ccmp = {
+       .name                   = "CCMP",
+       .init                   = rtllib_ccmp_init,
+       .deinit                 = rtllib_ccmp_deinit,
+       .encrypt_mpdu           = rtllib_ccmp_encrypt,
+       .decrypt_mpdu           = rtllib_ccmp_decrypt,
+       .encrypt_msdu           = NULL,
+       .decrypt_msdu           = NULL,
+       .set_key                = rtllib_ccmp_set_key,
+       .get_key                = rtllib_ccmp_get_key,
+       .print_stats            = rtllib_ccmp_print_stats,
+       .extra_prefix_len       = CCMP_HDR_LEN,
+       .extra_postfix_len      = CCMP_MIC_LEN,
+       .owner                  = THIS_MODULE,
+};
+
+
+int __init rtllib_crypto_ccmp_init(void)
+{
+       return rtllib_register_crypto_ops(&rtllib_crypt_ccmp);
+}
+
+
+void __exit rtllib_crypto_ccmp_exit(void)
+{
+       rtllib_unregister_crypto_ops(&rtllib_crypt_ccmp);
+}
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
new file mode 100644 (file)
index 0000000..ad9a62f
--- /dev/null
@@ -0,0 +1,992 @@
+/*
+ * Host AP crypt: host-based TKIP encryption implementation for Host AP driver
+ *
+ * Copyright (c) 2003-2004, Jouni Malinen <jkmaline@cc.hut.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/random.h>
+#include <linux/skbuff.h>
+#include <linux/netdevice.h>
+#include <linux/if_ether.h>
+#include <linux/if_arp.h>
+#include <asm/string.h>
+#include "rtllib.h"
+
+
+#if defined(BUILT_IN_CRYPTO) || (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include "rtl_crypto.h"
+#else
+#include <linux/crypto.h>
+#endif
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+    #include <asm/scatterlist.h>
+#else
+        #include <linux/scatterlist.h>
+#endif
+
+#include <linux/crc32.h>
+
+struct rtllib_tkip_data {
+#define TKIP_KEY_LEN 32
+       u8 key[TKIP_KEY_LEN];
+       int key_set;
+
+       u32 tx_iv32;
+       u16 tx_iv16;
+       u16 tx_ttak[5];
+       int tx_phase1_done;
+
+       u32 rx_iv32;
+       u16 rx_iv16;
+      bool initialized;
+       u16 rx_ttak[5];
+       int rx_phase1_done;
+       u32 rx_iv32_new;
+       u16 rx_iv16_new;
+
+       u32 dot11RSNAStatsTKIPReplays;
+       u32 dot11RSNAStatsTKIPICVErrors;
+       u32 dot11RSNAStatsTKIPLocalMICFailures;
+
+       int key_idx;
+#if  ( !defined(BUILT_IN_CRYPTO) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) || (OPENSUSE_SLED)) )
+       struct crypto_blkcipher *rx_tfm_arc4;
+       struct crypto_hash *rx_tfm_michael;
+       struct crypto_blkcipher *tx_tfm_arc4;
+       struct crypto_hash *tx_tfm_michael;
+#else
+       struct crypto_tfm *tx_tfm_arc4;
+       struct crypto_tfm *tx_tfm_michael;
+       struct crypto_tfm *rx_tfm_arc4;
+       struct crypto_tfm *rx_tfm_michael;
+#endif
+       /* scratch buffers for virt_to_page() (crypto API) */
+       u8 rx_hdr[16], tx_hdr[16];
+};
+
+static void * rtllib_tkip_init(int key_idx)
+{
+       struct rtllib_tkip_data *priv;
+
+       priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
+       if (priv == NULL)
+               goto fail;
+       memset(priv, 0, sizeof(*priv));
+       priv->key_idx = key_idx;
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       priv->tx_tfm_arc4 = crypto_alloc_tfm("arc4", 0);
+       if (priv->tx_tfm_arc4 == NULL) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API arc4\n");
+               goto fail;
+       }
+
+       priv->tx_tfm_michael = crypto_alloc_tfm("michael_mic", 0);
+       if (priv->tx_tfm_michael == NULL) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API michael_mic\n");
+               goto fail;
+       }
+
+       priv->rx_tfm_arc4 = crypto_alloc_tfm("arc4", 0);
+       if (priv->rx_tfm_arc4 == NULL) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API arc4\n");
+               goto fail;
+       }
+
+       priv->rx_tfm_michael = crypto_alloc_tfm("michael_mic", 0);
+       if (priv->rx_tfm_michael == NULL) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API michael_mic\n");
+               goto fail;
+       }
+#else
+       priv->tx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
+                       CRYPTO_ALG_ASYNC);
+       if (IS_ERR(priv->tx_tfm_arc4)) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API arc4\n");
+               priv->tx_tfm_arc4 = NULL;
+               goto fail;
+       }
+
+       priv->tx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
+                       CRYPTO_ALG_ASYNC);
+       if (IS_ERR(priv->tx_tfm_michael)) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API michael_mic\n");
+               priv->tx_tfm_michael = NULL;
+               goto fail;
+       }
+
+       priv->rx_tfm_arc4 = crypto_alloc_blkcipher("ecb(arc4)", 0,
+                       CRYPTO_ALG_ASYNC);
+       if (IS_ERR(priv->rx_tfm_arc4)) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API arc4\n");
+               priv->rx_tfm_arc4 = NULL;
+               goto fail;
+       }
+
+       priv->rx_tfm_michael = crypto_alloc_hash("michael_mic", 0,
+                       CRYPTO_ALG_ASYNC);
+       if (IS_ERR(priv->rx_tfm_michael)) {
+               printk(KERN_DEBUG "rtllib_crypt_tkip: could not allocate "
+                               "crypto API michael_mic\n");
+               priv->rx_tfm_michael = NULL;
+               goto fail;
+       }
+#endif
+       return priv;
+
+fail:
+       if (priv) {
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+               if (priv->tx_tfm_michael)
+                       crypto_free_tfm(priv->tx_tfm_michael);
+               if (priv->tx_tfm_arc4)
+                       crypto_free_tfm(priv->tx_tfm_arc4);
+               if (priv->rx_tfm_michael)
+                       crypto_free_tfm(priv->rx_tfm_michael);
+               if (priv->rx_tfm_arc4)
+                       crypto_free_tfm(priv->rx_tfm_arc4);
+
+#else
+               if (priv->tx_tfm_michael)
+                       crypto_free_hash(priv->tx_tfm_michael);
+               if (priv->tx_tfm_arc4)
+                       crypto_free_blkcipher(priv->tx_tfm_arc4);
+               if (priv->rx_tfm_michael)
+                       crypto_free_hash(priv->rx_tfm_michael);
+               if (priv->rx_tfm_arc4)
+                       crypto_free_blkcipher(priv->rx_tfm_arc4);
+#endif
+               kfree(priv);
+       }
+
+       return NULL;
+}
+
+
+static void rtllib_tkip_deinit(void *priv)
+{
+       struct rtllib_tkip_data *_priv = priv;
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       if (_priv->tx_tfm_michael)
+               crypto_free_tfm(_priv->tx_tfm_michael);
+       if (_priv->tx_tfm_arc4)
+               crypto_free_tfm(_priv->tx_tfm_arc4);
+       if (_priv->rx_tfm_michael)
+               crypto_free_tfm(_priv->rx_tfm_michael);
+       if (_priv->rx_tfm_arc4)
+               crypto_free_tfm(_priv->rx_tfm_arc4);
+#else
+       if (_priv) {
+               if (_priv->tx_tfm_michael)
+                       crypto_free_hash(_priv->tx_tfm_michael);
+               if (_priv->tx_tfm_arc4)
+                       crypto_free_blkcipher(_priv->tx_tfm_arc4);
+               if (_priv->rx_tfm_michael)
+                       crypto_free_hash(_priv->rx_tfm_michael);
+               if (_priv->rx_tfm_arc4)
+                       crypto_free_blkcipher(_priv->rx_tfm_arc4);
+       }
+#endif
+       kfree(priv);
+}
+
+
+static inline u16 RotR1(u16 val)
+{
+       return (val >> 1) | (val << 15);
+}
+
+
+static inline u8 Lo8(u16 val)
+{
+       return val & 0xff;
+}
+
+
+static inline u8 Hi8(u16 val)
+{
+       return val >> 8;
+}
+
+
+static inline u16 Lo16(u32 val)
+{
+       return val & 0xffff;
+}
+
+
+static inline u16 Hi16(u32 val)
+{
+       return val >> 16;
+}
+
+
+static inline u16 Mk16(u8 hi, u8 lo)
+{
+       return lo | (((u16) hi) << 8);
+}
+
+
+static inline u16 Mk16_le(u16 *v)
+{
+       return le16_to_cpu(*v);
+}
+
+
+static const u16 Sbox[256] =
+{
+       0xC6A5, 0xF884, 0xEE99, 0xF68D, 0xFF0D, 0xD6BD, 0xDEB1, 0x9154,
+       0x6050, 0x0203, 0xCEA9, 0x567D, 0xE719, 0xB562, 0x4DE6, 0xEC9A,
+       0x8F45, 0x1F9D, 0x8940, 0xFA87, 0xEF15, 0xB2EB, 0x8EC9, 0xFB0B,
+       0x41EC, 0xB367, 0x5FFD, 0x45EA, 0x23BF, 0x53F7, 0xE496, 0x9B5B,
+       0x75C2, 0xE11C, 0x3DAE, 0x4C6A, 0x6C5A, 0x7E41, 0xF502, 0x834F,
+       0x685C, 0x51F4, 0xD134, 0xF908, 0xE293, 0xAB73, 0x6253, 0x2A3F,
+       0x080C, 0x9552, 0x4665, 0x9D5E, 0x3028, 0x37A1, 0x0A0F, 0x2FB5,
+       0x0E09, 0x2436, 0x1B9B, 0xDF3D, 0xCD26, 0x4E69, 0x7FCD, 0xEA9F,
+       0x121B, 0x1D9E, 0x5874, 0x342E, 0x362D, 0xDCB2, 0xB4EE, 0x5BFB,
+       0xA4F6, 0x764D, 0xB761, 0x7DCE, 0x527B, 0xDD3E, 0x5E71, 0x1397,
+       0xA6F5, 0xB968, 0x0000, 0xC12C, 0x4060, 0xE31F, 0x79C8, 0xB6ED,
+       0xD4BE, 0x8D46, 0x67D9, 0x724B, 0x94DE, 0x98D4, 0xB0E8, 0x854A,
+       0xBB6B, 0xC52A, 0x4FE5, 0xED16, 0x86C5, 0x9AD7, 0x6655, 0x1194,
+       0x8ACF, 0xE910, 0x0406, 0xFE81, 0xA0F0, 0x7844, 0x25BA, 0x4BE3,
+       0xA2F3, 0x5DFE, 0x80C0, 0x058A, 0x3FAD, 0x21BC, 0x7048, 0xF104,
+       0x63DF, 0x77C1, 0xAF75, 0x4263, 0x2030, 0xE51A, 0xFD0E, 0xBF6D,
+       0x814C, 0x1814, 0x2635, 0xC32F, 0xBEE1, 0x35A2, 0x88CC, 0x2E39,
+       0x9357, 0x55F2, 0xFC82, 0x7A47, 0xC8AC, 0xBAE7, 0x322B, 0xE695,
+       0xC0A0, 0x1998, 0x9ED1, 0xA37F, 0x4466, 0x547E, 0x3BAB, 0x0B83,
+       0x8CCA, 0xC729, 0x6BD3, 0x283C, 0xA779, 0xBCE2, 0x161D, 0xAD76,
+       0xDB3B, 0x6456, 0x744E, 0x141E, 0x92DB, 0x0C0A, 0x486C, 0xB8E4,
+       0x9F5D, 0xBD6E, 0x43EF, 0xC4A6, 0x39A8, 0x31A4, 0xD337, 0xF28B,
+       0xD532, 0x8B43, 0x6E59, 0xDAB7, 0x018C, 0xB164, 0x9CD2, 0x49E0,
+       0xD8B4, 0xACFA, 0xF307, 0xCF25, 0xCAAF, 0xF48E, 0x47E9, 0x1018,
+       0x6FD5, 0xF088, 0x4A6F, 0x5C72, 0x3824, 0x57F1, 0x73C7, 0x9751,
+       0xCB23, 0xA17C, 0xE89C, 0x3E21, 0x96DD, 0x61DC, 0x0D86, 0x0F85,
+       0xE090, 0x7C42, 0x71C4, 0xCCAA, 0x90D8, 0x0605, 0xF701, 0x1C12,
+       0xC2A3, 0x6A5F, 0xAEF9, 0x69D0, 0x1791, 0x9958, 0x3A27, 0x27B9,
+       0xD938, 0xEB13, 0x2BB3, 0x2233, 0xD2BB, 0xA970, 0x0789, 0x33A7,
+       0x2DB6, 0x3C22, 0x1592, 0xC920, 0x8749, 0xAAFF, 0x5078, 0xA57A,
+       0x038F, 0x59F8, 0x0980, 0x1A17, 0x65DA, 0xD731, 0x84C6, 0xD0B8,
+       0x82C3, 0x29B0, 0x5A77, 0x1E11, 0x7BCB, 0xA8FC, 0x6DD6, 0x2C3A,
+};
+
+
+static inline u16 _S_(u16 v)
+{
+       u16 t = Sbox[Hi8(v)];
+       return Sbox[Lo8(v)] ^ ((t << 8) | (t >> 8));
+}
+
+
+#define PHASE1_LOOP_COUNT 8
+
+
+static void tkip_mixing_phase1(u16 *TTAK, const u8 *TK, const u8 *TA, u32 IV32)
+{
+       int i, j;
+
+       /* Initialize the 80-bit TTAK from TSC (IV32) and TA[0..5] */
+       TTAK[0] = Lo16(IV32);
+       TTAK[1] = Hi16(IV32);
+       TTAK[2] = Mk16(TA[1], TA[0]);
+       TTAK[3] = Mk16(TA[3], TA[2]);
+       TTAK[4] = Mk16(TA[5], TA[4]);
+
+       for (i = 0; i < PHASE1_LOOP_COUNT; i++) {
+               j = 2 * (i & 1);
+               TTAK[0] += _S_(TTAK[4] ^ Mk16(TK[1 + j], TK[0 + j]));
+               TTAK[1] += _S_(TTAK[0] ^ Mk16(TK[5 + j], TK[4 + j]));
+               TTAK[2] += _S_(TTAK[1] ^ Mk16(TK[9 + j], TK[8 + j]));
+               TTAK[3] += _S_(TTAK[2] ^ Mk16(TK[13 + j], TK[12 + j]));
+               TTAK[4] += _S_(TTAK[3] ^ Mk16(TK[1 + j], TK[0 + j])) + i;
+       }
+}
+
+
+static void tkip_mixing_phase2(u8 *WEPSeed, const u8 *TK, const u16 *TTAK,
+                              u16 IV16)
+{
+       /* Make temporary area overlap WEP seed so that the final copy can be
+        * avoided on little endian hosts. */
+       u16 *PPK = (u16 *) &WEPSeed[4];
+
+       /* Step 1 - make copy of TTAK and bring in TSC */
+       PPK[0] = TTAK[0];
+       PPK[1] = TTAK[1];
+       PPK[2] = TTAK[2];
+       PPK[3] = TTAK[3];
+       PPK[4] = TTAK[4];
+       PPK[5] = TTAK[4] + IV16;
+
+       /* Step 2 - 96-bit bijective mixing using S-box */
+       PPK[0] += _S_(PPK[5] ^ Mk16_le((u16 *) &TK[0]));
+       PPK[1] += _S_(PPK[0] ^ Mk16_le((u16 *) &TK[2]));
+       PPK[2] += _S_(PPK[1] ^ Mk16_le((u16 *) &TK[4]));
+       PPK[3] += _S_(PPK[2] ^ Mk16_le((u16 *) &TK[6]));
+       PPK[4] += _S_(PPK[3] ^ Mk16_le((u16 *) &TK[8]));
+       PPK[5] += _S_(PPK[4] ^ Mk16_le((u16 *) &TK[10]));
+
+       PPK[0] += RotR1(PPK[5] ^ Mk16_le((u16 *) &TK[12]));
+       PPK[1] += RotR1(PPK[0] ^ Mk16_le((u16 *) &TK[14]));
+       PPK[2] += RotR1(PPK[1]);
+       PPK[3] += RotR1(PPK[2]);
+       PPK[4] += RotR1(PPK[3]);
+       PPK[5] += RotR1(PPK[4]);
+
+       /* Step 3 - bring in last of TK bits, assign 24-bit WEP IV value
+        * WEPSeed[0..2] is transmitted as WEP IV */
+       WEPSeed[0] = Hi8(IV16);
+       WEPSeed[1] = (Hi8(IV16) | 0x20) & 0x7F;
+       WEPSeed[2] = Lo8(IV16);
+       WEPSeed[3] = Lo8((PPK[5] ^ Mk16_le((u16 *) &TK[0])) >> 1);
+
+#ifdef __BIG_ENDIAN
+       {
+               int i;
+               for (i = 0; i < 6; i++)
+                       PPK[i] = (PPK[i] << 8) | (PPK[i] >> 8);
+       }
+#endif
+}
+
+
+static int rtllib_tkip_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct rtllib_tkip_data *tkey = priv;
+               int len;
+       u8 *pos;
+       struct rtllib_hdr_4addr *hdr;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+
+       #if ( !defined(BUILT_IN_CRYPTO) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) || (OPENSUSE_SLED)) )
+       struct blkcipher_desc desc = {.tfm = tkey->tx_tfm_arc4};
+       int ret = 0;
+       #endif
+       u8 rc4key[16],  *icv;
+       u32 crc;
+       struct scatterlist sg;
+
+       if (skb_headroom(skb) < 8 || skb_tailroom(skb) < 4 ||
+           skb->len < hdr_len)
+               return -1;
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+
+       if (!tcb_desc->bHwSec) {
+               if (!tkey->tx_phase1_done) {
+                       tkip_mixing_phase1(tkey->tx_ttak, tkey->key, hdr->addr2,
+                                       tkey->tx_iv32);
+                       tkey->tx_phase1_done = 1;
+               }
+               tkip_mixing_phase2(rc4key, tkey->key, tkey->tx_ttak, tkey->tx_iv16);
+       } else
+       tkey->tx_phase1_done = 1;
+
+
+       len = skb->len - hdr_len;
+       pos = skb_push(skb, 8);
+       memmove(pos, pos + 8, hdr_len);
+       pos += hdr_len;
+
+       if (tcb_desc->bHwSec) {
+               *pos++ = Hi8(tkey->tx_iv16);
+               *pos++ = (Hi8(tkey->tx_iv16) | 0x20) & 0x7F;
+               *pos++ = Lo8(tkey->tx_iv16);
+       } else {
+               *pos++ = rc4key[0];
+               *pos++ = rc4key[1];
+               *pos++ = rc4key[2];
+       }
+
+       *pos++ = (tkey->key_idx << 6) | (1 << 5) /* Ext IV included */;
+       *pos++ = tkey->tx_iv32 & 0xff;
+       *pos++ = (tkey->tx_iv32 >> 8) & 0xff;
+       *pos++ = (tkey->tx_iv32 >> 16) & 0xff;
+       *pos++ = (tkey->tx_iv32 >> 24) & 0xff;
+
+       if (!tcb_desc->bHwSec) {
+               icv = skb_put(skb, 4);
+               crc = ~crc32_le(~0, pos, len);
+               icv[0] = crc;
+               icv[1] = crc >> 8;
+               icv[2] = crc >> 16;
+               icv[3] = crc >> 24;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+               sg.page = virt_to_page(pos);
+               sg.offset = offset_in_page(pos);
+               sg.length = len + 4;
+#else
+               sg_init_one(&sg, pos, len+4);
+#endif
+
+
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+               crypto_cipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
+               crypto_cipher_encrypt(tkey->tx_tfm_arc4, &sg, &sg, len + 4);
+#else
+               crypto_blkcipher_setkey(tkey->tx_tfm_arc4, rc4key, 16);
+               ret= crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
+#endif
+
+       }
+
+       tkey->tx_iv16++;
+       if (tkey->tx_iv16 == 0) {
+               tkey->tx_phase1_done = 0;
+               tkey->tx_iv32++;
+       }
+
+       if (!tcb_desc->bHwSec)
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+               return 0;
+       #else
+               return ret;
+       #endif
+       else
+               return 0;
+
+
+}
+
+static int rtllib_tkip_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct rtllib_tkip_data *tkey = priv;
+       u8 keyidx, *pos;
+       u32 iv32;
+       u16 iv16;
+       struct rtllib_hdr_4addr *hdr;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       #if ( !defined(BUILT_IN_CRYPTO) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) || (OPENSUSE_SLED)) )
+       struct blkcipher_desc desc = {.tfm = tkey->rx_tfm_arc4};
+       #endif
+       u8 rc4key[16];
+       u8 icv[4];
+       u32 crc;
+       struct scatterlist sg;
+       int plen;
+       if (skb->len < hdr_len + 8 + 4)
+               return -1;
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       pos = skb->data + hdr_len;
+       keyidx = pos[3];
+       if (!(keyidx & (1 << 5))) {
+               if (net_ratelimit()) {
+                       printk(KERN_DEBUG "TKIP: received packet without ExtIV"
+                              " flag from " MAC_FMT "\n", MAC_ARG(hdr->addr2));
+               }
+               return -2;
+       }
+       keyidx >>= 6;
+       if (tkey->key_idx != keyidx) {
+               printk(KERN_DEBUG "TKIP: RX tkey->key_idx=%d frame "
+                      "keyidx=%d priv=%p\n", tkey->key_idx, keyidx, priv);
+               return -6;
+       }
+       if (!tkey->key_set) {
+               if (net_ratelimit()) {
+                       printk(KERN_DEBUG "TKIP: received packet from " MAC_FMT
+                              " with keyid=%d that does not have a configured"
+                              " key\n", MAC_ARG(hdr->addr2), keyidx);
+               }
+               return -3;
+       }
+       iv16 = (pos[0] << 8) | pos[2];
+       iv32 = pos[4] | (pos[5] << 8) | (pos[6] << 16) | (pos[7] << 24);
+       pos += 8;
+
+       if (!tcb_desc->bHwSec || (skb->cb[0] == 1))
+       {
+               if ((iv32 < tkey->rx_iv32 ||
+               (iv32 == tkey->rx_iv32 && iv16 <= tkey->rx_iv16))&&tkey->initialized) {
+                       if (net_ratelimit()) {
+                               printk(KERN_DEBUG "TKIP: replay detected: STA=" MAC_FMT
+                               " previous TSC %08x%04x received TSC "
+                               "%08x%04x\n", MAC_ARG(hdr->addr2),
+                               tkey->rx_iv32, tkey->rx_iv16, iv32, iv16);
+                       }
+                       tkey->dot11RSNAStatsTKIPReplays++;
+                       return -4;
+               }
+                tkey->initialized = true;
+
+               if (iv32 != tkey->rx_iv32 || !tkey->rx_phase1_done) {
+                       tkip_mixing_phase1(tkey->rx_ttak, tkey->key, hdr->addr2, iv32);
+                       tkey->rx_phase1_done = 1;
+               }
+               tkip_mixing_phase2(rc4key, tkey->key, tkey->rx_ttak, iv16);
+
+               plen = skb->len - hdr_len - 12;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+               sg.page = virt_to_page(pos);
+               sg.offset = offset_in_page(pos);
+               sg.length = plen + 4;
+#else
+               sg_init_one(&sg, pos, plen+4);
+#endif
+
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+               crypto_cipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
+               crypto_cipher_decrypt(tkey->rx_tfm_arc4, &sg, &sg, plen + 4);
+#else
+               crypto_blkcipher_setkey(tkey->rx_tfm_arc4, rc4key, 16);
+               if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4)) {
+                       if (net_ratelimit()) {
+                               printk(KERN_DEBUG ": TKIP: failed to decrypt "
+                                               "received packet from " MAC_FMT "\n",
+                                               MAC_ARG(hdr->addr2));
+                       }
+                       return -7;
+               }
+#endif
+
+       #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+               crc = ~crc32_le(~0, pos, plen);
+       #else
+               crc = ~ether_crc_le(plen, pos);
+       #endif
+               icv[0] = crc;
+               icv[1] = crc >> 8;
+               icv[2] = crc >> 16;
+               icv[3] = crc >> 24;
+
+               if (memcmp(icv, pos + plen, 4) != 0) {
+                       if (iv32 != tkey->rx_iv32) {
+                               /* Previously cached Phase1 result was already lost, so
+                               * it needs to be recalculated for the next packet. */
+                               tkey->rx_phase1_done = 0;
+                       }
+                       if (net_ratelimit()) {
+                               printk(KERN_DEBUG "TKIP: ICV error detected: STA="
+                               MAC_FMT "\n", MAC_ARG(hdr->addr2));
+                       }
+                       tkey->dot11RSNAStatsTKIPICVErrors++;
+                       return -5;
+               }
+
+       }
+
+       /* Update real counters only after Michael MIC verification has
+        * completed */
+       tkey->rx_iv32_new = iv32;
+       tkey->rx_iv16_new = iv16;
+
+       /* Remove IV and ICV */
+       memmove(skb->data + 8, skb->data, hdr_len);
+       skb_pull(skb, 8);
+       skb_trim(skb, skb->len - 4);
+
+#ifdef JOHN_DUMP
+if ( ((u16*)skb->data)[0] & 0x4000){
+        printk("@@ rx decrypted skb->data");
+        int i;
+        for (i = 0; i < skb->len; i++) {
+                if ( (i%24)==0 ) printk("\n");
+                printk("%2x ", ((u8*)skb->data)[i]);
+        }
+        printk("\n");
+}
+#endif /*JOHN_DUMP*/
+       return keyidx;
+}
+
+
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+static int michael_mic(struct crypto_tfm * tfm_michael, u8 *key, u8 *hdr,
+                      u8 *data, size_t data_len, u8 *mic)
+{
+       struct scatterlist sg[2];
+#if ( !defined(BUILT_IN_CRYPTO) && LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,20) )
+        struct hash_desc desc;
+        int ret = 0;
+#endif
+
+       if (tfm_michael == NULL){
+               printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
+               return -1;
+       }
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+       sg[0].page = virt_to_page(hdr);
+       sg[0].offset = offset_in_page(hdr);
+       sg[0].length = 16;
+
+       sg[1].page = virt_to_page(data);
+       sg[1].offset = offset_in_page(data);
+       sg[1].length = data_len;
+#else
+       sg_init_table(sg, 2);
+       sg_set_buf(&sg[0], hdr, 16);
+       sg_set_buf(&sg[1], data, data_len);
+#endif
+
+#if ( defined(BUILT_IN_CRYPTO) || LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20) )
+       crypto_digest_init(tfm_michael);
+        crypto_digest_setkey(tfm_michael, key, 8);
+        crypto_digest_update(tfm_michael, sg, 2);
+        crypto_digest_final(tfm_michael, mic);
+        return 0;
+#else
+if (crypto_hash_setkey(tkey->tfm_michael, key, 8))
+                return -1;
+
+              desc.tfm = tkey->tfm_michael;
+              desc.flags = 0;
+              ret = crypto_hash_digest(&desc, sg, data_len + 16, mic);
+              return ret;
+#endif
+}
+#else
+static int michael_mic(struct crypto_hash *tfm_michael, u8 * key, u8 * hdr,
+                       u8 * data, size_t data_len, u8 * mic)
+{
+        struct hash_desc desc;
+        struct scatterlist sg[2];
+
+        if (tfm_michael == NULL) {
+                printk(KERN_WARNING "michael_mic: tfm_michael == NULL\n");
+                return -1;
+        }
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24)
+        sg[0].page = virt_to_page(hdr);
+        sg[0].offset = offset_in_page(hdr);
+        sg[0].length = 16;
+
+        sg[1].page = virt_to_page(data);
+        sg[1].offset = offset_in_page(data);
+        sg[1].length = data_len;
+#else
+        sg_init_table(sg, 2);
+        sg_set_buf(&sg[0], hdr, 16);
+        sg_set_buf(&sg[1], data, data_len);
+#endif
+
+        if (crypto_hash_setkey(tfm_michael, key, 8))
+                return -1;
+
+        desc.tfm = tfm_michael;
+        desc.flags = 0;
+        return crypto_hash_digest(&desc, sg, data_len + 16, mic);
+}
+#endif
+
+
+
+static void michael_mic_hdr(struct sk_buff *skb, u8 *hdr)
+{
+       struct rtllib_hdr_4addr *hdr11;
+
+       hdr11 = (struct rtllib_hdr_4addr *) skb->data;
+       switch (le16_to_cpu(hdr11->frame_ctl) &
+               (RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS)) {
+       case RTLLIB_FCTL_TODS:
+               memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
+               memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
+               break;
+       case RTLLIB_FCTL_FROMDS:
+               memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
+               memcpy(hdr + ETH_ALEN, hdr11->addr3, ETH_ALEN); /* SA */
+               break;
+       case RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS:
+               memcpy(hdr, hdr11->addr3, ETH_ALEN); /* DA */
+               memcpy(hdr + ETH_ALEN, hdr11->addr4, ETH_ALEN); /* SA */
+               break;
+       case 0:
+               memcpy(hdr, hdr11->addr1, ETH_ALEN); /* DA */
+               memcpy(hdr + ETH_ALEN, hdr11->addr2, ETH_ALEN); /* SA */
+               break;
+       }
+
+       hdr[12] = 0; /* priority */
+
+       hdr[13] = hdr[14] = hdr[15] = 0; /* reserved */
+}
+
+
+static int rtllib_michael_mic_add(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct rtllib_tkip_data *tkey = priv;
+       u8 *pos;
+       struct rtllib_hdr_4addr *hdr;
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+
+       if (skb_tailroom(skb) < 8 || skb->len < hdr_len) {
+               printk(KERN_DEBUG "Invalid packet for Michael MIC add "
+                      "(tailroom=%d hdr_len=%d skb->len=%d)\n",
+                      skb_tailroom(skb), hdr_len, skb->len);
+               return -1;
+       }
+
+       michael_mic_hdr(skb, tkey->tx_hdr);
+
+       if (RTLLIB_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl))) {
+               tkey->tx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
+       }
+       pos = skb_put(skb, 8);
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
+                               skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
+#else
+       if (michael_mic(tkey->tx_tfm_michael, &tkey->key[16], tkey->tx_hdr,
+                               skb->data + hdr_len, skb->len - 8 - hdr_len, pos))
+#endif
+               return -1;
+
+       return 0;
+}
+
+
+#if WIRELESS_EXT >= 18
+static void rtllib_michael_mic_failure(struct net_device *dev,
+                                      struct rtllib_hdr_4addr *hdr,
+                                      int keyidx)
+{
+       union iwreq_data wrqu;
+       struct iw_michaelmicfailure ev;
+
+       /* TODO: needed parameters: count, keyid, key type, TSC */
+       memset(&ev, 0, sizeof(ev));
+       ev.flags = keyidx & IW_MICFAILURE_KEY_ID;
+       if (hdr->addr1[0] & 0x01)
+               ev.flags |= IW_MICFAILURE_GROUP;
+       else
+               ev.flags |= IW_MICFAILURE_PAIRWISE;
+       ev.src_addr.sa_family = ARPHRD_ETHER;
+       memcpy(ev.src_addr.sa_data, hdr->addr2, ETH_ALEN);
+       memset(&wrqu, 0, sizeof(wrqu));
+       wrqu.data.length = sizeof(ev);
+       wireless_send_event(dev, IWEVMICHAELMICFAILURE, &wrqu, (char *) &ev);
+}
+#elif WIRELESS_EXT >= 15
+static void rtllib_michael_mic_failure(struct net_device *dev,
+                                      struct rtllib_hdr_4addr *hdr,
+                                      int keyidx)
+{
+       union iwreq_data wrqu;
+       char buf[128];
+
+       /* TODO: needed parameters: count, keyid, key type, TSC */
+       sprintf(buf, "MLME-MICHAELMICFAILURE.indication(keyid=%d %scast addr="
+               MAC_FMT ")", keyidx, hdr->addr1[0] & 0x01 ? "broad" : "uni",
+               MAC_ARG(hdr->addr2));
+       memset(&wrqu, 0, sizeof(wrqu));
+       wrqu.data.length = strlen(buf);
+       wireless_send_event(dev, IWEVCUSTOM, &wrqu, buf);
+}
+#else /* WIRELESS_EXT >= 15 */
+static inline void rtllib_michael_mic_failure(struct net_device *dev,
+                                             struct rtllib_hdr_4addr *hdr,
+                                             int keyidx)
+{
+}
+#endif /* WIRELESS_EXT >= 15 */
+
+static int rtllib_michael_mic_verify(struct sk_buff *skb, int keyidx,
+                                    int hdr_len, void *priv, struct rtllib_device* ieee)
+{
+       struct rtllib_tkip_data *tkey = priv;
+       u8 mic[8];
+       struct rtllib_hdr_4addr *hdr;
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+
+       if (!tkey->key_set)
+               return -1;
+
+       michael_mic_hdr(skb, tkey->rx_hdr);
+       if (RTLLIB_QOS_HAS_SEQ(le16_to_cpu(hdr->frame_ctl))) {
+               tkey->rx_hdr[12] = *(skb->data + hdr_len - 2) & 0x07;
+       }
+
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
+                               skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
+#else
+       if (michael_mic(tkey->rx_tfm_michael, &tkey->key[24], tkey->rx_hdr,
+                               skb->data + hdr_len, skb->len - 8 - hdr_len, mic))
+#endif
+               return -1;
+
+       if ((memcmp(mic, skb->data + skb->len - 8, 8) != 0)||(ieee->force_mic_error)) {
+               struct rtllib_hdr_4addr *hdr;
+               hdr = (struct rtllib_hdr_4addr *) skb->data;
+               printk(KERN_DEBUG "%s: Michael MIC verification failed for "
+                      "MSDU from " MAC_FMT " keyidx=%d\n",
+                      skb->dev ? skb->dev->name : "N/A", MAC_ARG(hdr->addr2),
+                      keyidx);
+                printk("%d, force_mic_error = %d\n", (memcmp(mic, skb->data + skb->len - 8, 8) != 0),\
+                        ieee->force_mic_error);
+               if (skb->dev) {
+                        printk("skb->dev != NULL\n");
+                       rtllib_michael_mic_failure(skb->dev, hdr, keyidx);
+                }
+               tkey->dot11RSNAStatsTKIPLocalMICFailures++;
+                ieee->force_mic_error = false;
+               return -1;
+       }
+
+       /* Update TSC counters for RX now that the packet verification has
+        * completed. */
+       tkey->rx_iv32 = tkey->rx_iv32_new;
+       tkey->rx_iv16 = tkey->rx_iv16_new;
+
+       skb_trim(skb, skb->len - 8);
+
+       return 0;
+}
+
+
+static int rtllib_tkip_set_key(void *key, int len, u8 *seq, void *priv)
+{
+       struct rtllib_tkip_data *tkey = priv;
+       int keyidx;
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       struct crypto_tfm *tfm = tkey->tx_tfm_michael;
+       struct crypto_tfm *tfm2 = tkey->tx_tfm_arc4;
+       struct crypto_tfm *tfm3 = tkey->rx_tfm_michael;
+       struct crypto_tfm *tfm4 = tkey->rx_tfm_arc4;
+#else
+       struct crypto_hash *tfm = tkey->tx_tfm_michael;
+       struct crypto_blkcipher *tfm2 = tkey->tx_tfm_arc4;
+       struct crypto_hash *tfm3 = tkey->rx_tfm_michael;
+       struct crypto_blkcipher *tfm4 = tkey->rx_tfm_arc4;
+#endif
+
+       keyidx = tkey->key_idx;
+       memset(tkey, 0, sizeof(*tkey));
+       tkey->key_idx = keyidx;
+#if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       tkey->tx_tfm_michael = tfm;
+       tkey->tx_tfm_arc4 = tfm2;
+       tkey->rx_tfm_michael = tfm3;
+       tkey->rx_tfm_arc4 = tfm4;
+#else
+       tkey->tx_tfm_michael = tfm;
+       tkey->tx_tfm_arc4 = tfm2;
+       tkey->rx_tfm_michael = tfm3;
+       tkey->rx_tfm_arc4 = tfm4;
+#endif
+
+       if (len == TKIP_KEY_LEN) {
+               memcpy(tkey->key, key, TKIP_KEY_LEN);
+               tkey->key_set = 1;
+               tkey->tx_iv16 = 1; /* TSC is initialized to 1 */
+               if (seq) {
+                       tkey->rx_iv32 = (seq[5] << 24) | (seq[4] << 16) |
+                               (seq[3] << 8) | seq[2];
+                       tkey->rx_iv16 = (seq[1] << 8) | seq[0];
+               }
+       } else if (len == 0)
+               tkey->key_set = 0;
+       else
+               return -1;
+
+       return 0;
+}
+
+
+static int rtllib_tkip_get_key(void *key, int len, u8 *seq, void *priv)
+{
+       struct rtllib_tkip_data *tkey = priv;
+
+       if (len < TKIP_KEY_LEN)
+               return -1;
+
+       if (!tkey->key_set)
+               return 0;
+       memcpy(key, tkey->key, TKIP_KEY_LEN);
+
+       if (seq) {
+               /* Return the sequence number of the last transmitted frame. */
+               u16 iv16 = tkey->tx_iv16;
+               u32 iv32 = tkey->tx_iv32;
+               if (iv16 == 0)
+                       iv32--;
+               iv16--;
+               seq[0] = tkey->tx_iv16;
+               seq[1] = tkey->tx_iv16 >> 8;
+               seq[2] = tkey->tx_iv32;
+               seq[3] = tkey->tx_iv32 >> 8;
+               seq[4] = tkey->tx_iv32 >> 16;
+               seq[5] = tkey->tx_iv32 >> 24;
+       }
+
+       return TKIP_KEY_LEN;
+}
+
+
+static char * rtllib_tkip_print_stats(char *p, void *priv)
+{
+       struct rtllib_tkip_data *tkip = priv;
+       p += sprintf(p, "key[%d] alg=TKIP key_set=%d "
+                    "tx_pn=%02x%02x%02x%02x%02x%02x "
+                    "rx_pn=%02x%02x%02x%02x%02x%02x "
+                    "replays=%d icv_errors=%d local_mic_failures=%d\n",
+                    tkip->key_idx, tkip->key_set,
+                    (tkip->tx_iv32 >> 24) & 0xff,
+                    (tkip->tx_iv32 >> 16) & 0xff,
+                    (tkip->tx_iv32 >> 8) & 0xff,
+                    tkip->tx_iv32 & 0xff,
+                    (tkip->tx_iv16 >> 8) & 0xff,
+                    tkip->tx_iv16 & 0xff,
+                    (tkip->rx_iv32 >> 24) & 0xff,
+                    (tkip->rx_iv32 >> 16) & 0xff,
+                    (tkip->rx_iv32 >> 8) & 0xff,
+                    tkip->rx_iv32 & 0xff,
+                    (tkip->rx_iv16 >> 8) & 0xff,
+                    tkip->rx_iv16 & 0xff,
+                    tkip->dot11RSNAStatsTKIPReplays,
+                    tkip->dot11RSNAStatsTKIPICVErrors,
+                    tkip->dot11RSNAStatsTKIPLocalMICFailures);
+       return p;
+}
+
+
+static struct rtllib_crypto_ops rtllib_crypt_tkip = {
+       .name                   = "TKIP",
+       .init                   = rtllib_tkip_init,
+       .deinit                 = rtllib_tkip_deinit,
+       .encrypt_mpdu           = rtllib_tkip_encrypt,
+       .decrypt_mpdu           = rtllib_tkip_decrypt,
+       .encrypt_msdu           = rtllib_michael_mic_add,
+       .decrypt_msdu           = rtllib_michael_mic_verify,
+       .set_key                = rtllib_tkip_set_key,
+       .get_key                = rtllib_tkip_get_key,
+       .print_stats            = rtllib_tkip_print_stats,
+       .extra_prefix_len       = 4 + 4, /* IV + ExtIV */
+       .extra_postfix_len      = 8 + 4, /* MIC + ICV */
+       .owner                  = THIS_MODULE,
+};
+
+
+int __init rtllib_crypto_tkip_init(void)
+{
+       return rtllib_register_crypto_ops(&rtllib_crypt_tkip);
+}
+
+
+void __exit rtllib_crypto_tkip_exit(void)
+{
+       rtllib_unregister_crypto_ops(&rtllib_crypt_tkip);
+}
+
+void rtllib_tkip_null(void)
+{
+        return;
+}
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_wep.c b/drivers/staging/rtl8192e/rtllib_crypt_wep.c
new file mode 100644 (file)
index 0000000..3867922
--- /dev/null
@@ -0,0 +1,371 @@
+/*
+ * Host AP crypt: host-based WEP encryption implementation for Host AP driver
+ *
+ * Copyright (c) 2002-2004, Jouni Malinen <jkmaline@cc.hut.fi>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ */
+
+#include <linux/version.h>
+#include <linux/module.h>
+#include <linux/init.h>
+#include <linux/slab.h>
+#include <linux/random.h>
+#include <linux/skbuff.h>
+#include <asm/string.h>
+#include "rtllib.h"
+
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,20))
+#endif
+
+
+#if defined(BUILT_IN_CRYPTO) || (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include "rtl_crypto.h"
+#else
+#include <linux/crypto.h>
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20)
+    #include <asm/scatterlist.h>
+#else
+    #include <linux/scatterlist.h>
+#endif
+#include <linux/crc32.h>
+/*
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,5,0))
+#include "rtl_crypto.h"
+#else
+#include <linux/crypto.h>
+#endif
+
+#include <asm/scatterlist.h>
+#include <linux/crc32.h>
+*/
+struct prism2_wep_data {
+       u32 iv;
+#define WEP_KEY_LEN 13
+       u8 key[WEP_KEY_LEN + 1];
+       u8 key_len;
+       u8 key_idx;
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       struct crypto_tfm *tfm;
+       #else
+        struct crypto_blkcipher *tx_tfm;
+        struct crypto_blkcipher *rx_tfm;
+        #endif
+};
+
+
+static void * prism2_wep_init(int keyidx)
+{
+       struct prism2_wep_data *priv;
+
+       priv = kmalloc(sizeof(*priv), GFP_ATOMIC);
+       if (priv == NULL)
+               goto fail;
+       memset(priv, 0, sizeof(*priv));
+       priv->key_idx = keyidx;
+
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       priv->tfm = crypto_alloc_tfm("arc4", 0);
+       if (priv->tfm == NULL) {
+               printk(KERN_DEBUG "rtllib_crypt_wep: could not allocate "
+                      "crypto API arc4\n");
+               goto fail;
+       }
+       #else
+       priv->tx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
+        if (IS_ERR(priv->tx_tfm)) {
+                printk(KERN_DEBUG "rtllib_crypt_wep: could not allocate "
+                       "crypto API arc4\n");
+                priv->tx_tfm = NULL;
+                goto fail;
+        }
+        priv->rx_tfm = crypto_alloc_blkcipher("ecb(arc4)", 0, CRYPTO_ALG_ASYNC);
+        if (IS_ERR(priv->rx_tfm)) {
+                printk(KERN_DEBUG "rtllib_crypt_wep: could not allocate "
+                       "crypto API arc4\n");
+                priv->rx_tfm = NULL;
+                goto fail;
+        }
+        #endif
+
+       /* start WEP IV from a random value */
+       get_random_bytes(&priv->iv, 4);
+
+       return priv;
+
+fail:
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       if (priv) {
+               if (priv->tfm)
+                       crypto_free_tfm(priv->tfm);
+               kfree(priv);
+       }
+       #else
+       if (priv) {
+                if (priv->tx_tfm)
+                        crypto_free_blkcipher(priv->tx_tfm);
+                if (priv->rx_tfm)
+                        crypto_free_blkcipher(priv->rx_tfm);
+                kfree(priv);
+        }
+        #endif
+       return NULL;
+}
+
+
+static void prism2_wep_deinit(void *priv)
+{
+       struct prism2_wep_data *_priv = priv;
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+       if (_priv && _priv->tfm)
+               crypto_free_tfm(_priv->tfm);
+       #else
+       if (_priv) {
+                if (_priv->tx_tfm)
+                        crypto_free_blkcipher(_priv->tx_tfm);
+                if (_priv->rx_tfm)
+                        crypto_free_blkcipher(_priv->rx_tfm);
+        }
+        #endif
+       kfree(priv);
+}
+
+/* Perform WEP encryption on given skb that has at least 4 bytes of headroom
+ * for IV and 4 bytes of tailroom for ICV. Both IV and ICV will be transmitted,
+ * so the payload length increases with 8 bytes.
+ *
+ * WEP frame payload: IV + TX key idx, RC4(data), ICV = RC4(CRC32(data))
+ */
+static int prism2_wep_encrypt(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct prism2_wep_data *wep = priv;
+       u32 klen, len;
+       u8 key[WEP_KEY_LEN + 3];
+       u8 *pos;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       #if ( !defined(BUILT_IN_CRYPTO) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) || (OPENSUSE_SLED)) )
+       struct blkcipher_desc desc = {.tfm = wep->tx_tfm};
+       #endif
+       u32 crc;
+       u8 *icv;
+       struct scatterlist sg;
+       if (skb_headroom(skb) < 4 || skb_tailroom(skb) < 4 ||
+           skb->len < hdr_len){
+               printk("Error!!!headroom=%d tailroom=%d skblen=%d hdr_len=%d\n",skb_headroom(skb),skb_tailroom(skb),skb->len,hdr_len);
+               return -1;
+       }
+       len = skb->len - hdr_len;
+       pos = skb_push(skb, 4);
+       memmove(pos, pos + 4, hdr_len);
+       pos += hdr_len;
+
+       klen = 3 + wep->key_len;
+
+       wep->iv++;
+
+       /* Fluhrer, Mantin, and Shamir have reported weaknesses in the key
+        * scheduling algorithm of RC4. At least IVs (KeyByte + 3, 0xff, N)
+        * can be used to speedup attacks, so avoid using them. */
+       if ((wep->iv & 0xff00) == 0xff00) {
+               u8 B = (wep->iv >> 16) & 0xff;
+               if (B >= 3 && B < klen)
+                       wep->iv += 0x0100;
+       }
+
+       /* Prepend 24-bit IV to RC4 key and TX frame */
+       *pos++ = key[0] = (wep->iv >> 16) & 0xff;
+       *pos++ = key[1] = (wep->iv >> 8) & 0xff;
+       *pos++ = key[2] = wep->iv & 0xff;
+       *pos++ = wep->key_idx << 6;
+
+       /* Copy rest of the WEP key (the secret part) */
+       memcpy(key + 3, wep->key, wep->key_len);
+
+       if (!tcb_desc->bHwSec)
+       {
+
+               /* Append little-endian CRC32 and encrypt it to produce ICV */
+       #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+               crc = ~crc32_le(~0, pos, len);
+       #else
+               crc = ~ether_crc_le(len, pos);
+       #endif
+               icv = skb_put(skb, 4);
+               icv[0] = crc;
+               icv[1] = crc >> 8;
+               icv[2] = crc >> 16;
+               icv[3] = crc >> 24;
+
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+               sg.page = virt_to_page(pos);
+               sg.offset = offset_in_page(pos);
+               sg.length = len + 4;
+       #else
+               sg_init_one(&sg, pos, len+4);
+       #endif
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+               crypto_cipher_setkey(wep->tfm, key, klen);
+               crypto_cipher_encrypt(wep->tfm, &sg, &sg, len + 4);
+               return 0;
+       #else
+               crypto_blkcipher_setkey(wep->tx_tfm, key, klen);
+               return crypto_blkcipher_encrypt(&desc, &sg, &sg, len + 4);
+       #endif
+       }
+
+       return 0;
+}
+
+
+/* Perform WEP decryption on given buffer. Buffer includes whole WEP part of
+ * the frame: IV (4 bytes), encrypted payload (including SNAP header),
+ * ICV (4 bytes). len includes both IV and ICV.
+ *
+ * Returns 0 if frame was decrypted successfully and ICV was correct and -1 on
+ * failure. If frame is OK, IV and ICV will be removed.
+ */
+static int prism2_wep_decrypt(struct sk_buff *skb, int hdr_len, void *priv)
+{
+       struct prism2_wep_data *wep = priv;
+       u32  klen, plen;
+       u8 key[WEP_KEY_LEN + 3];
+       u8 keyidx, *pos;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + MAX_DEV_ADDR_SIZE);
+       #if ( !defined(BUILT_IN_CRYPTO) && ((LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,21)) || (OPENSUSE_SLED)) )
+       struct blkcipher_desc desc = {.tfm = wep->rx_tfm};
+       #endif
+       u32 crc;
+       u8 icv[4];
+       struct scatterlist sg;
+       if (skb->len < hdr_len + 8)
+               return -1;
+
+       pos = skb->data + hdr_len;
+       key[0] = *pos++;
+       key[1] = *pos++;
+       key[2] = *pos++;
+       keyidx = *pos++ >> 6;
+       if (keyidx != wep->key_idx)
+               return -1;
+
+       klen = 3 + wep->key_len;
+
+       /* Copy rest of the WEP key (the secret part) */
+       memcpy(key + 3, wep->key, wep->key_len);
+
+       /* Apply RC4 to data and compute CRC32 over decrypted data */
+       plen = skb->len - hdr_len - 8;
+
+       if (!tcb_desc->bHwSec)
+       {
+       #if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,24))
+               sg.page = virt_to_page(pos);
+               sg.offset = offset_in_page(pos);
+               sg.length = plen + 4;
+       #else
+               sg_init_one(&sg, pos, plen+4);
+       #endif
+       #if ( defined(BUILT_IN_CRYPTO) || ((LINUX_VERSION_CODE < KERNEL_VERSION(2,6,21)) && (!OPENSUSE_SLED)) )
+               crypto_cipher_setkey(wep->tfm, key, klen);
+               crypto_cipher_decrypt(wep->tfm, &sg, &sg, plen + 4);
+       #else
+               crypto_blkcipher_setkey(wep->rx_tfm, key, klen);
+               if (crypto_blkcipher_decrypt(&desc, &sg, &sg, plen + 4))
+                       return -7;
+       #endif
+       #if (LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0))
+               crc = ~crc32_le(~0, pos, plen);
+       #else
+               crc = ~ether_crc_le(plen, pos);
+       #endif
+               icv[0] = crc;
+               icv[1] = crc >> 8;
+               icv[2] = crc >> 16;
+               icv[3] = crc >> 24;
+               if (memcmp(icv, pos + plen, 4) != 0) {
+                       /* ICV mismatch - drop frame */
+                       return -2;
+               }
+       }
+       /* Remove IV and ICV */
+       memmove(skb->data + 4, skb->data, hdr_len);
+       skb_pull(skb, 4);
+       skb_trim(skb, skb->len - 4);
+
+       return 0;
+}
+
+
+static int prism2_wep_set_key(void *key, int len, u8 *seq, void *priv)
+{
+       struct prism2_wep_data *wep = priv;
+
+       if (len < 0 || len > WEP_KEY_LEN)
+               return -1;
+
+       memcpy(wep->key, key, len);
+       wep->key_len = len;
+
+       return 0;
+}
+
+
+static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv)
+{
+       struct prism2_wep_data *wep = priv;
+
+       if (len < wep->key_len)
+               return -1;
+
+       memcpy(key, wep->key, wep->key_len);
+
+       return wep->key_len;
+}
+
+
+static char * prism2_wep_print_stats(char *p, void *priv)
+{
+       struct prism2_wep_data *wep = priv;
+       p += sprintf(p, "key[%d] alg=WEP len=%d\n",
+                    wep->key_idx, wep->key_len);
+       return p;
+}
+
+
+static struct rtllib_crypto_ops rtllib_crypt_wep = {
+       .name                   = "WEP",
+       .init                   = prism2_wep_init,
+       .deinit                 = prism2_wep_deinit,
+       .encrypt_mpdu           = prism2_wep_encrypt,
+       .decrypt_mpdu           = prism2_wep_decrypt,
+       .encrypt_msdu           = NULL,
+       .decrypt_msdu           = NULL,
+       .set_key                = prism2_wep_set_key,
+       .get_key                = prism2_wep_get_key,
+       .print_stats            = prism2_wep_print_stats,
+       .extra_prefix_len       = 4, /* IV */
+       .extra_postfix_len      = 4, /* ICV */
+       .owner                  = THIS_MODULE,
+};
+
+
+int __init rtllib_crypto_wep_init(void)
+{
+       return rtllib_register_crypto_ops(&rtllib_crypt_wep);
+}
+
+
+void __exit rtllib_crypto_wep_exit(void)
+{
+       rtllib_unregister_crypto_ops(&rtllib_crypt_wep);
+}
+
+void rtllib_wep_null(void)
+{
+        return;
+}
diff --git a/drivers/staging/rtl8192e/rtllib_endianfree.h b/drivers/staging/rtl8192e/rtllib_endianfree.h
new file mode 100644 (file)
index 0000000..46d8f19
--- /dev/null
@@ -0,0 +1,156 @@
+#ifndef __INC_ENDIANFREE_H
+#define __INC_ENDIANFREE_H
+
+/*
+ *     Call endian free function when
+ *             1. Read/write packet content.
+ *             2. Before write integer to IO.
+ *             3. After read integer from IO.
+ */
+
+#define __MACHINE_LITTLE_ENDIAN 1234    /* LSB first: i386, vax */
+#define __MACHINE_BIG_ENDIAN    4321    /* MSB first: 68000, ibm, net, ppc */
+
+#define BYTE_ORDER __MACHINE_LITTLE_ENDIAN
+
+#if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
+#define EF1Byte(_val)                          ((u8)(_val))
+#define EF2Byte(_val)                          ((u16)(_val))
+#define EF4Byte(_val)                          ((u32)(_val))
+
+#else
+#define EF1Byte(_val)                          ((u8)(_val))
+#define EF2Byte(_val)                          (((((u16)(_val))&0x00ff)<<8)|((((u16)(_val))&0xff00)>>8))
+#define EF4Byte(_val)                          (((((u32)(_val))&0x000000ff)<<24)|\
+                                               ((((u32)(_val))&0x0000ff00)<<8)|\
+                                               ((((u32)(_val))&0x00ff0000)>>8)|\
+                                               ((((u32)(_val))&0xff000000)>>24))
+#endif
+
+#define ReadEF1Byte(_ptr)              EF1Byte(*((u8 *)(_ptr)))
+#define ReadEF2Byte(_ptr)              EF2Byte(*((u16 *)(_ptr)))
+#define ReadEF4Byte(_ptr)              EF4Byte(*((u32 *)(_ptr)))
+
+#define WriteEF1Byte(_ptr, _val)       (*((u8 *)(_ptr)))=EF1Byte(_val)
+#define WriteEF2Byte(_ptr, _val)       (*((u16 *)(_ptr)))=EF2Byte(_val)
+#define WriteEF4Byte(_ptr, _val)       (*((u32 *)(_ptr)))=EF4Byte(_val)
+#if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
+#define H2N1BYTE(_val) ((u8)(_val))
+#define H2N2BYTE(_val) (((((u16)(_val))&0x00ff)<<8)|\
+                       ((((u16)(_val))&0xff00)>>8))
+#define H2N4BYTE(_val) (((((u32)(_val))&0x000000ff)<<24)|\
+                       ((((u32)(_val))&0x0000ff00)<<8) |\
+                       ((((u32)(_val))&0x00ff0000)>>8) |\
+                       ((((u32)(_val))&0xff000000)>>24))
+#else
+#define H2N1BYTE(_val)                 ((u8)(_val))
+#define H2N2BYTE(_val)                 ((u16)(_val))
+#define H2N4BYTE(_val)                 ((u32)(_val))
+#endif
+
+#if BYTE_ORDER == __MACHINE_LITTLE_ENDIAN
+#define N2H1BYTE(_val) ((u8)(_val))
+#define N2H2BYTE(_val) (((((u16)(_val))&0x00ff)<<8)|\
+                       ((((u16)(_val))&0xff00)>>8))
+#define N2H4BYTE(_val) (((((u32)(_val))&0x000000ff)<<24)|\
+                       ((((u32)(_val))&0x0000ff00)<<8) |\
+                       ((((u32)(_val))&0x00ff0000)>>8) |\
+                       ((((u32)(_val))&0xff000000)>>24))
+#else
+#define N2H1BYTE(_val)                 ((u8)(_val))
+#define N2H2BYTE(_val)                 ((u16)(_val))
+#define N2H4BYTE(_val)                 ((u32)(_val))
+#endif
+
+#define BIT_LEN_MASK_32(__BitLen) (0xFFFFFFFF >> (32 - (__BitLen)))
+#define BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) (BIT_LEN_MASK_32(__BitLen) << (__BitOffset))
+
+#define LE_P4BYTE_TO_HOST_4BYTE(__pStart) (EF4Byte(*((u32 *)(__pStart))))
+
+#define LE_BITS_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
+       ( \
+         ( LE_P4BYTE_TO_HOST_4BYTE(__pStart) >> (__BitOffset) ) \
+         & \
+         BIT_LEN_MASK_32(__BitLen) \
+       )
+
+#define LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
+       ( \
+         LE_P4BYTE_TO_HOST_4BYTE(__pStart) \
+         & \
+         ( ~BIT_OFFSET_LEN_MASK_32(__BitOffset, __BitLen) ) \
+       )
+
+#define SET_BITS_TO_LE_4BYTE(__pStart, __BitOffset, __BitLen, __Value) \
+       *((u32 *)(__pStart)) = \
+       EF4Byte( \
+       LE_BITS_CLEARED_TO_4BYTE(__pStart, __BitOffset, __BitLen) \
+       | \
+       ( (((u32)__Value) & BIT_LEN_MASK_32(__BitLen)) << (__BitOffset) ) \
+       );
+
+
+#define BIT_LEN_MASK_16(__BitLen) \
+       (0xFFFF >> (16 - (__BitLen)))
+
+#define BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) \
+       (BIT_LEN_MASK_16(__BitLen) << (__BitOffset))
+
+#define LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
+       (EF2Byte(*((u16 *)(__pStart))))
+
+#define LE_BITS_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
+       ( \
+         ( LE_P2BYTE_TO_HOST_2BYTE(__pStart) >> (__BitOffset) ) \
+         & \
+         BIT_LEN_MASK_16(__BitLen) \
+       )
+
+#define LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
+       ( \
+         LE_P2BYTE_TO_HOST_2BYTE(__pStart) \
+         & \
+         ( ~BIT_OFFSET_LEN_MASK_16(__BitOffset, __BitLen) ) \
+       )
+
+#define SET_BITS_TO_LE_2BYTE(__pStart, __BitOffset, __BitLen, __Value) \
+       *((u16 *)(__pStart)) = \
+       EF2Byte( \
+               LE_BITS_CLEARED_TO_2BYTE(__pStart, __BitOffset, __BitLen) \
+               | \
+               ( (((u16)__Value) & BIT_LEN_MASK_16(__BitLen)) << (__BitOffset) ) \
+       );
+
+#define BIT_LEN_MASK_8(__BitLen) \
+       (0xFF >> (8 - (__BitLen)))
+
+#define BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) \
+       (BIT_LEN_MASK_8(__BitLen) << (__BitOffset))
+
+#define LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
+       (EF1Byte(*((u8 *)(__pStart))))
+
+#define LE_BITS_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
+       ( \
+         ( LE_P1BYTE_TO_HOST_1BYTE(__pStart) >> (__BitOffset) ) \
+         & \
+         BIT_LEN_MASK_8(__BitLen) \
+       )
+
+#define LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
+       ( \
+         LE_P1BYTE_TO_HOST_1BYTE(__pStart) \
+         & \
+         ( ~BIT_OFFSET_LEN_MASK_8(__BitOffset, __BitLen) ) \
+       )
+
+#define SET_BITS_TO_LE_1BYTE(__pStart, __BitOffset, __BitLen, __Value) \
+       *((u8 *)(__pStart)) = \
+       EF1Byte( \
+               LE_BITS_CLEARED_TO_1BYTE(__pStart, __BitOffset, __BitLen) \
+               | \
+               ( (((u8)__Value) & BIT_LEN_MASK_8(__BitLen)) << (__BitOffset) ) \
+       );
+
+#define        N_BYTE_ALIGMENT(__Value, __Aligment) ((__Aligment == 1) ? (__Value) : (((__Value + __Aligment - 1) / __Aligment) * __Aligment))
+#endif
diff --git a/drivers/staging/rtl8192e/rtllib_module.c b/drivers/staging/rtl8192e/rtllib_module.c
new file mode 100644 (file)
index 0000000..5373de6
--- /dev/null
@@ -0,0 +1,374 @@
+/*******************************************************************************
+
+  Copyright(c) 2004 Intel Corporation. All rights reserved.
+
+  Portions of this file are based on the WEP enablement code provided by the
+  Host AP project hostap-drivers v0.1.3
+  Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+  <jkmaline@cc.hut.fi>
+  Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  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.
+
+  The full GNU General Public License is included in this distribution in the
+  file called LICENSE.
+
+  Contact Information:
+  James P. Ketrenos <ipw2100-admin@linux.intel.com>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+*******************************************************************************/
+
+#include <linux/compiler.h>
+#include <linux/errno.h>
+#include <linux/if_arp.h>
+#include <linux/in6.h>
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/slab.h>
+#include <linux/tcp.h>
+#include <linux/types.h>
+#include <linux/version.h>
+#include <linux/wireless.h>
+#include <linux/etherdevice.h>
+#include <asm/uaccess.h>
+#include <net/arp.h>
+
+#include "rtllib.h"
+
+
+#define DRV_NAME "rtllib_92e"
+
+#ifdef CONFIG_CFG_80211
+#ifdef CONFIG_RTL_RFKILL
+static inline void rtllib_rfkill_poll(struct wiphy *wiphy)
+{
+       struct rtllib_device *rtllib = NULL;
+
+       rtllib = (struct rtllib_device *)wiphy_priv(wiphy);
+
+       rtllib = (struct rtllib_device *)netdev_priv_rsl(rtllib->dev);
+
+       if (rtllib->rtllib_rfkill_poll)
+               rtllib->rtllib_rfkill_poll(rtllib->dev);
+}
+#else
+static inline void rtllib_rfkill_poll(struct wiphy *wiphy) {}
+#endif
+struct cfg80211_ops rtllib_config_ops = {.rfkill_poll = rtllib_rfkill_poll };
+void *rtllib_wiphy_privid = &rtllib_wiphy_privid;
+#endif
+
+void _setup_timer( struct timer_list* ptimer, void* fun, unsigned long data )
+{
+   ptimer->function = fun;
+   ptimer->data = data;
+   init_timer( ptimer );
+}
+
+static inline int rtllib_networks_allocate(struct rtllib_device *ieee)
+{
+       if (ieee->networks)
+               return 0;
+
+#ifndef RTK_DMP_PLATFORM
+       ieee->networks = kmalloc(
+               MAX_NETWORK_COUNT * sizeof(struct rtllib_network),
+               GFP_KERNEL);
+#else
+       ieee->networks = dvr_malloc(MAX_NETWORK_COUNT * sizeof(struct rtllib_network));
+#endif
+       if (!ieee->networks) {
+               printk(KERN_WARNING "%s: Out of memory allocating beacons\n",
+                      ieee->dev->name);
+               return -ENOMEM;
+       }
+
+       memset(ieee->networks, 0,
+              MAX_NETWORK_COUNT * sizeof(struct rtllib_network));
+
+       return 0;
+}
+
+static inline void rtllib_networks_free(struct rtllib_device *ieee)
+{
+       if (!ieee->networks)
+               return;
+#ifndef RTK_DMP_PLATFORM
+       kfree(ieee->networks);
+#else
+       dvr_free(ieee->networks);
+#endif
+       ieee->networks = NULL;
+}
+
+static inline void rtllib_networks_initialize(struct rtllib_device *ieee)
+{
+       int i;
+
+       INIT_LIST_HEAD(&ieee->network_free_list);
+       INIT_LIST_HEAD(&ieee->network_list);
+       for (i = 0; i < MAX_NETWORK_COUNT; i++)
+               list_add_tail(&ieee->networks[i].list, &ieee->network_free_list);
+}
+
+#if defined CONFIG_CFG_80211
+static bool rtllib_wdev_alloc(struct rtllib_device *ieee, int sizeof_priv)
+{
+       int priv_size;
+       struct rtllib_device *rtllib = NULL;
+
+       priv_size = ALIGN(sizeof(struct rtllib_device),NETDEV_ALIGN) + sizeof_priv;
+
+       ieee->wdev.wiphy = wiphy_new(&rtllib_config_ops, priv_size);
+       if (!ieee->wdev.wiphy) {
+               RTLLIB_ERROR("Unable to allocate wiphy.\n");
+               goto out_err_new;
+       }
+
+       rtllib = (struct rtllib_device *)wiphy_priv(ieee->wdev.wiphy);
+       rtllib->dev = ieee->dev;
+
+       ieee->dev->ieee80211_ptr = &ieee->wdev;
+       ieee->wdev.iftype = NL80211_IFTYPE_STATION;
+
+       /* Fill-out wiphy structure bits we know...  Not enough info
+        *            here to call set_wiphy_dev or set MAC address or channel info
+        *                       -- have to do that in ->ndo_init... */
+       ieee->wdev.wiphy->privid = rtllib_wiphy_privid;
+
+       ieee->wdev.wiphy->max_scan_ssids = 1;
+       ieee->wdev.wiphy->max_scan_ie_len = 0;
+       ieee->wdev.wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) | BIT(NL80211_IFTYPE_ADHOC);
+
+       return true;
+
+out_err_new:
+       wiphy_free(ieee->wdev.wiphy);
+       return false;
+}
+#endif
+
+struct net_device *alloc_rtllib(int sizeof_priv)
+{
+       struct rtllib_device *ieee = NULL;
+       struct net_device *dev;
+       int i,err;
+
+       RTLLIB_DEBUG_INFO("Initializing...\n");
+
+       dev = alloc_etherdev(sizeof(struct rtllib_device) + sizeof_priv);
+       if (!dev) {
+               RTLLIB_ERROR("Unable to network device.\n");
+               goto failed;
+       }
+       ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
+       memset(ieee, 0, sizeof(struct rtllib_device)+sizeof_priv);
+       ieee->dev = dev;
+
+#ifdef CONFIG_CFG_80211
+       if (!rtllib_wdev_alloc(ieee, sizeof_priv))
+               goto failed;
+#endif
+       err = rtllib_networks_allocate(ieee);
+       if (err) {
+               RTLLIB_ERROR("Unable to allocate beacon storage: %d\n",
+                               err);
+               goto failed;
+       }
+       rtllib_networks_initialize(ieee);
+
+
+       /* Default fragmentation threshold is maximum payload size */
+       ieee->fts = DEFAULT_FTS;
+       ieee->scan_age = DEFAULT_MAX_SCAN_AGE;
+       ieee->open_wep = 1;
+
+       /* Default to enabling full open WEP with host based encrypt/decrypt */
+       ieee->host_encrypt = 1;
+       ieee->host_decrypt = 1;
+       ieee->ieee802_1x = 1; /* Default to supporting 802.1x */
+
+       INIT_LIST_HEAD(&ieee->crypt_deinit_list);
+       _setup_timer(&ieee->crypt_deinit_timer,
+                   rtllib_crypt_deinit_handler,
+                   (unsigned long) ieee);
+       ieee->rtllib_ap_sec_type = rtllib_ap_sec_type;
+
+       spin_lock_init(&ieee->lock);
+       spin_lock_init(&ieee->wpax_suitlist_lock);
+       spin_lock_init(&ieee->bw_spinlock);
+       spin_lock_init(&ieee->reorder_spinlock);
+       atomic_set(&(ieee->atm_chnlop), 0);
+       atomic_set(&(ieee->atm_swbw), 0);
+
+       ieee->bHalfNMode = false;
+       ieee->wpa_enabled = 0;
+       ieee->tkip_countermeasures = 0;
+       ieee->drop_unencrypted = 0;
+       ieee->privacy_invoked = 0;
+       ieee->ieee802_1x = 1;
+       ieee->raw_tx = 0;
+       ieee->hwsec_active = 0;
+
+       memset(ieee->swcamtable,0,sizeof(SW_CAM_TABLE)*32);
+       rtllib_softmac_init(ieee);
+
+       ieee->pHTInfo = (RT_HIGH_THROUGHPUT*)kzalloc(sizeof(RT_HIGH_THROUGHPUT), GFP_KERNEL);
+       if (ieee->pHTInfo == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't alloc memory for HTInfo\n");
+               return NULL;
+       }
+       HTUpdateDefaultSetting(ieee);
+       HTInitializeHTInfo(ieee);
+       TSInitialize(ieee);
+       for (i = 0; i < IEEE_IBSS_MAC_HASH_SIZE; i++)
+               INIT_LIST_HEAD(&ieee->ibss_mac_hash[i]);
+
+       for (i = 0; i < 17; i++) {
+               ieee->last_rxseq_num[i] = -1;
+               ieee->last_rxfrag_num[i] = -1;
+               ieee->last_packet_time[i] = 0;
+       }
+
+       rtllib_tkip_null();
+       rtllib_wep_null();
+       rtllib_ccmp_null();
+
+       return dev;
+
+ failed:
+       if (dev)
+               free_netdev(dev);
+       return NULL;
+}
+
+
+void free_rtllib(struct net_device *dev)
+{
+       struct rtllib_device *ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
+       int i;
+       if (ieee->pHTInfo != NULL) {
+               kfree(ieee->pHTInfo);
+               ieee->pHTInfo = NULL;
+       }
+       rtllib_softmac_free(ieee);
+       del_timer_sync(&ieee->crypt_deinit_timer);
+       rtllib_crypt_deinit_entries(ieee, 1);
+
+       for (i = 0; i < WEP_KEYS; i++) {
+               struct rtllib_crypt_data *crypt = ieee->crypt[i];
+               if (crypt) {
+                       if (crypt->ops)
+                               crypt->ops->deinit(crypt->priv);
+                       kfree(crypt);
+                       ieee->crypt[i] = NULL;
+               }
+       }
+
+       rtllib_networks_free(ieee);
+#ifdef CONFIG_CFG_80211
+       wiphy_unregister(ieee->wdev.wiphy);
+       wiphy_free(ieee->wdev.wiphy);
+#endif
+       free_netdev(dev);
+}
+
+#ifdef CONFIG_RTLLIB_DEBUG
+
+u32 rtllib_debug_level = 0;
+static int debug = \
+                           RTLLIB_DL_ERR
+                           ;
+struct proc_dir_entry *rtllib_proc = NULL;
+
+static int show_debug_level(char *page, char **start, off_t offset,
+                           int count, int *eof, void *data)
+{
+       return snprintf(page, count, "0x%08X\n", rtllib_debug_level);
+}
+
+static int store_debug_level(struct file *file, const char *buffer,
+                            unsigned long count, void *data)
+{
+       char buf[] = "0x00000000";
+       unsigned long len = min((unsigned long)sizeof(buf) - 1, count);
+       char *p = (char *)buf;
+       unsigned long val;
+
+       if (copy_from_user(buf, buffer, len))
+               return count;
+       buf[len] = 0;
+       if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
+               p++;
+               if (p[0] == 'x' || p[0] == 'X')
+                       p++;
+               val = simple_strtoul(p, &p, 16);
+       } else
+               val = simple_strtoul(p, &p, 10);
+       if (p == buf)
+               printk(KERN_INFO DRV_NAME
+                      ": %s is not in hex or decimal form.\n", buf);
+       else
+               rtllib_debug_level = val;
+
+       return strnlen(buf, count);
+}
+
+int __init rtllib_init(void)
+{
+#ifdef CONFIG_RTLLIB_DEBUG
+       struct proc_dir_entry *e;
+
+       rtllib_debug_level = debug;
+       rtllib_proc = create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net);
+       if (rtllib_proc == NULL) {
+               RTLLIB_ERROR("Unable to create " DRV_NAME
+                               " proc directory\n");
+               return -EIO;
+       }
+       e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR,
+                             rtllib_proc);
+       if (!e) {
+               remove_proc_entry(DRV_NAME, init_net.proc_net);
+               rtllib_proc = NULL;
+               return -EIO;
+       }
+       e->read_proc = show_debug_level;
+       e->write_proc = store_debug_level;
+       e->data = NULL;
+#endif
+
+       return 0;
+}
+
+void __exit rtllib_exit(void)
+{
+#ifdef CONFIG_RTLLIB_DEBUG
+       if (rtllib_proc) {
+               remove_proc_entry("debug_level", rtllib_proc);
+               remove_proc_entry(DRV_NAME, init_net.proc_net);
+               rtllib_proc = NULL;
+       }
+#endif
+}
+
+#endif
diff --git a/drivers/staging/rtl8192e/rtllib_rx.c b/drivers/staging/rtl8192e/rtllib_rx.c
new file mode 100644 (file)
index 0000000..2a7133c
--- /dev/null
@@ -0,0 +1,4234 @@
+/*
+ * Original code based Host AP (software wireless LAN access point) driver
+ * for Intersil Prism2/2.5/3 - hostap.o module, common routines
+ *
+ * Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+ * <jkmaline@cc.hut.fi>
+ * Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
+ * Copyright (c) 2004, Intel Corporation
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation. See README and COPYING for
+ * more details.
+ ******************************************************************************
+
+  Few modifications for Realtek's Wi-Fi drivers by
+  Andrea Merello <andreamrl@tiscali.it>
+
+  A special thanks goes to Realtek for their support !
+
+******************************************************************************/
+
+
+#include <linux/compiler.h>
+#include <linux/errno.h>
+#include <linux/if_arp.h>
+#include <linux/in6.h>
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/slab.h>
+#include <linux/tcp.h>
+#include <linux/types.h>
+#include <linux/version.h>
+#include <linux/wireless.h>
+#include <linux/etherdevice.h>
+#include <asm/uaccess.h>
+#include <linux/ctype.h>
+
+#include "rtllib.h"
+#ifdef ENABLE_DOT11D
+#include "dot11d.h"
+#endif
+
+#if defined(RTLLIB_RADIOTAP) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10))
+#include <net/ieee80211_radiotap.h>
+#endif
+
+#if defined CONFIG_CFG_80211
+#include <linux/crc32.h>
+
+struct ieee80211_channel *rtllib_get_channel(struct wiphy *wiphy,
+                                                 int freq)
+{
+       enum ieee80211_band band;
+       struct ieee80211_supported_band *sband;
+       int i;
+
+       for (band = 0; band < IEEE80211_NUM_BANDS; band++) {
+               sband = wiphy->bands[band];
+
+               if (!sband)
+                       continue;
+
+               for (i = 0; i < sband->n_channels; i++) {
+                       if (sband->channels[i].center_freq == freq)
+                               return &sband->channels[i];
+               }
+       }
+
+       return NULL;
+}
+
+int rtllib_channel_to_frequency(int chan)
+{
+       if (chan < 14)
+               return 2407 + chan * 5;
+
+       if (chan == 14)
+               return 2484;
+
+       /* FIXME: 802.11j 17.3.8.3.2 */
+       return (chan + 1000) * 5;
+}
+
+u32 rtllib_parse_elems_crc(u8 *start, size_t len,
+                              struct ieee802_11_elems *elems,
+                              u64 filter, u32 crc)
+{
+       size_t left = len;
+       u8 *pos = start;
+       bool calc_crc = filter != 0;
+
+       memset(elems, 0, sizeof(*elems));
+       elems->ie_start = start;
+       elems->total_len = len;
+
+       while (left >= 2) {
+               u8 id, elen;
+
+               id = *pos++;
+               elen = *pos++;
+               left -= 2;
+
+               if (elen > left)
+                       break;
+
+               if (calc_crc && id < 64 && (filter & BIT(id)))
+                       crc = crc32_be(crc, pos - 2, elen + 2);
+
+               switch (id) {
+               case WLAN_EID_SSID:
+                       elems->ssid = pos;
+                       elems->ssid_len = elen;
+                       break;
+               case WLAN_EID_SUPP_RATES:
+                       elems->supp_rates = pos;
+                       elems->supp_rates_len = elen;
+                       break;
+               case WLAN_EID_FH_PARAMS:
+                       elems->fh_params = pos;
+                       elems->fh_params_len = elen;
+                       break;
+               case WLAN_EID_DS_PARAMS:
+                       elems->ds_params = pos;
+                       elems->ds_params_len = elen;
+                       break;
+               case WLAN_EID_CF_PARAMS:
+                       elems->cf_params = pos;
+                       elems->cf_params_len = elen;
+                       break;
+               case WLAN_EID_TIM:
+                       if (elen >= sizeof(struct ieee80211_tim_ie)) {
+                               elems->tim = (void *)pos;
+                               elems->tim_len = elen;
+                       }
+                       break;
+               case WLAN_EID_IBSS_PARAMS:
+                       elems->ibss_params = pos;
+                       elems->ibss_params_len = elen;
+                       break;
+               case WLAN_EID_CHALLENGE:
+                       elems->challenge = pos;
+                       elems->challenge_len = elen;
+                       break;
+               case WLAN_EID_VENDOR_SPECIFIC:
+                       if (elen >= 4 && pos[0] == 0x00 && pos[1] == 0x50 &&
+                           pos[2] == 0xf2) {
+                               /* Microsoft OUI (00:50:F2) */
+
+                               if (calc_crc)
+                                       crc = crc32_be(crc, pos - 2, elen + 2);
+
+                               if (pos[3] == 1) {
+                                       /* OUI Type 1 - WPA IE */
+                                       elems->wpa = pos;
+                                       elems->wpa_len = elen;
+                               } else if (elen >= 5 && pos[3] == 2) {
+                                       /* OUI Type 2 - WMM IE */
+                                       if (pos[4] == 0) {
+                                               elems->wmm_info = pos;
+                                               elems->wmm_info_len = elen;
+                                       } else if (pos[4] == 1) {
+                                               elems->wmm_param = pos;
+                                               elems->wmm_param_len = elen;
+                                       }
+                               }
+                       }
+                       break;
+               case WLAN_EID_RSN:
+                       elems->rsn = pos;
+                       elems->rsn_len = elen;
+                       break;
+               case WLAN_EID_ERP_INFO:
+                       elems->erp_info = pos;
+                       elems->erp_info_len = elen;
+                       break;
+               case WLAN_EID_EXT_SUPP_RATES:
+                       elems->ext_supp_rates = pos;
+                       elems->ext_supp_rates_len = elen;
+                       break;
+               case WLAN_EID_HT_CAPABILITY:
+                       if (elen >= sizeof(struct ieee80211_ht_cap))
+                               elems->ht_cap_elem = (void *)pos;
+                       break;
+               case WLAN_EID_HT_INFORMATION:
+                       if (elen >= sizeof(struct ieee80211_ht_info))
+                               elems->ht_info_elem = (void *)pos;
+                       break;
+               case WLAN_EID_MESH_ID:
+                       elems->mesh_id = pos;
+                       elems->mesh_id_len = elen;
+                       break;
+               case WLAN_EID_MESH_CONFIG:
+                       elems->mesh_config = pos;
+                       elems->mesh_config_len = elen;
+                       break;
+               case WLAN_EID_PEER_LINK:
+                       elems->peer_link = pos;
+                       elems->peer_link_len = elen;
+                       break;
+               case WLAN_EID_PREQ:
+                       elems->preq = pos;
+                       elems->preq_len = elen;
+                       break;
+               case WLAN_EID_PREP:
+                       elems->prep = pos;
+                       elems->prep_len = elen;
+                       break;
+               case WLAN_EID_PERR:
+                       elems->perr = pos;
+                       elems->perr_len = elen;
+                       break;
+               case WLAN_EID_CHANNEL_SWITCH:
+                       elems->ch_switch_elem = pos;
+                       elems->ch_switch_elem_len = elen;
+                       break;
+               case WLAN_EID_QUIET:
+                       if (!elems->quiet_elem) {
+                               elems->quiet_elem = pos;
+                               elems->quiet_elem_len = elen;
+                       }
+                       elems->num_of_quiet_elem++;
+                       break;
+               case WLAN_EID_COUNTRY:
+                       elems->country_elem = pos;
+                       elems->country_elem_len = elen;
+                       break;
+               case WLAN_EID_PWR_CONSTRAINT:
+                       elems->pwr_constr_elem = pos;
+                       elems->pwr_constr_elem_len = elen;
+                       break;
+               case WLAN_EID_TIMEOUT_INTERVAL:
+                       elems->timeout_int = pos;
+                       elems->timeout_int_len = elen;
+                       break;
+               default:
+                       break;
+               }
+
+               left -= elen;
+               pos += elen;
+       }
+
+       return crc;
+}
+
+void rtllib_parse_elems(u8 *start, size_t len,
+                           struct ieee802_11_elems *elems)
+{
+       rtllib_parse_elems_crc(start, len, elems, 0, 0);
+}
+
+void ieee80211_scan_rx(struct rtllib_device *ieee, struct sk_buff *skb, struct rtllib_rx_stats *rx_status)
+{
+       struct rtllib_hdr_4addr *header = (struct rtllib_hdr_4addr *)skb->data ;
+       struct ieee80211_mgmt *mgmt;
+       struct ieee80211_bss *bss;
+       u8 *elements;
+       struct ieee80211_channel *channel;
+       size_t baselen;
+       int freq;
+       __le16 fc;
+       bool presp, beacon = false;
+       struct ieee802_11_elems elems;
+       s32 signal = 0;
+
+       if (skb->len < 2)
+               return;
+
+       mgmt = (struct ieee80211_mgmt *) skb->data;
+       fc = mgmt->frame_control;
+
+       if (skb->len < 24)
+               return;
+
+       presp = (WLAN_FC_GET_STYPE(header->frame_ctl) == RTLLIB_STYPE_PROBE_RESP);
+       if (presp) {
+               /* ignore ProbeResp to foreign address */
+               if (memcmp(mgmt->da, ieee->dev->dev_addr, ETH_ALEN))
+                       return ;;
+
+               presp = true;
+               elements = mgmt->u.probe_resp.variable;
+               baselen = offsetof(struct ieee80211_mgmt, u.probe_resp.variable);
+       } else {
+               beacon =  (WLAN_FC_GET_STYPE(header->frame_ctl) == RTLLIB_STYPE_BEACON);
+               baselen = offsetof(struct ieee80211_mgmt, u.beacon.variable);
+               elements = mgmt->u.beacon.variable;
+       }
+
+       if (!presp && !beacon)
+               return;
+
+       if (baselen > skb->len)
+               return;
+
+       rtllib_parse_elems(elements, skb->len - baselen, &elems);
+
+       if (elems.ds_params && elems.ds_params_len == 1)
+               freq = rtllib_channel_to_frequency(elems.ds_params[0]);
+       else
+               return;
+
+       channel = rtllib_get_channel(ieee->wdev.wiphy, freq);
+
+       if (!channel || channel->flags & IEEE80211_CHAN_DISABLED)
+               return;
+
+               signal = rx_status->signal * 100;
+
+       bss = (void *)cfg80211_inform_bss_frame(ieee->wdev.wiphy, channel,
+                                               mgmt, skb->len, signal, GFP_ATOMIC);
+
+       return;
+}
+#endif
+
+
+#if defined(RTLLIB_RADIOTAP) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10))
+static int rtllib_rx_radiotap_len(struct rtllib_device *ieee, struct rtllib_rx_stats *rx_status)
+{
+       int len;
+
+       /* always present fields */
+       len = sizeof(struct ieee80211_radiotap_header) +
+               8 + /* TSFT */
+               1 + /* FLAGS */
+               1 + /* RATE */
+               2 + /* CHANNEL IN MHZ */
+               2 + /* CHANNEL BITFIELD */
+               1 + /* HW SIGNAL DBM */
+               1 + /* HW NOISE DBM */
+               1;  /* ANTENNA NUMBER */
+
+
+       if (len & 1) /* padding for RX_FLAGS if necessary */
+               len++;
+
+       /* make sure radiotap starts at a naturally aligned address */
+       if (len % 8)
+               len = roundup(len, 8);
+
+       return len;
+}
+
+static void rtllib_add_rx_radiotap_header(struct rtllib_device *ieee,
+               struct sk_buff *skb, int rtap_len, struct rtllib_rx_stats *rx_status)
+{
+       struct ieee80211_radiotap_header *rthdr;
+       unsigned char *pos;
+       printk("add header!\n");
+       rthdr = (struct ieee80211_radiotap_header *)skb_push(skb, rtap_len);
+       memset(rthdr, 0, rtap_len);
+
+       rthdr->it_version = PKTHDR_RADIOTAP_VERSION;
+       rthdr->it_pad = 0;
+       rthdr->it_len = cpu_to_le16(rtap_len);
+       /* radiotap header, set always present flags */
+       rthdr->it_present = cpu_to_le32(
+               (1 << IEEE80211_RADIOTAP_TSFT) |
+               (1 << IEEE80211_RADIOTAP_FLAGS) |
+               (1 << IEEE80211_RADIOTAP_RATE) |
+               (1 << IEEE80211_RADIOTAP_CHANNEL) |
+               (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |
+               (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |
+               (1 << IEEE80211_RADIOTAP_ANTENNA));
+
+       pos = (unsigned char *)(rthdr+1);
+       /* the order of the following fields is important */
+       /* IEEE80211_RADIOTAP_TSFT */
+       *(__le64 *)pos = cpu_to_le64(rx_status->TimeStampLow);
+       pos += 8;
+
+       /* IEEE80211_RADIOTAP_FLAGS */
+       if (rx_status->bCRC)
+               *pos |= IEEE80211_RADIOTAP_F_BADFCS;
+       if (rx_status->bShortPreamble)
+               *pos |= IEEE80211_RADIOTAP_F_SHORTPRE;
+       pos++;
+
+       /* IEEE80211_RADIOTAP_RATE */
+       *pos = rx_status->rate / 5;
+       pos++;
+
+       /* IEEE80211_RADIOTAP_CHANNEL */
+       *(__le16 *)pos = cpu_to_le16(rx_status->received_channel);
+       pos += 2;
+       pos += 2;
+
+
+       /* IEEE80211_RADIOTAP_DBM_ANTSIGNAL */
+       *pos = rx_status->RxPower;
+       pos++;
+
+       /* IEEE80211_RADIOTAP_DBM_ANTNOISE */
+       *pos = rx_status->noise;
+       pos++;
+
+       /* IEEE80211_RADIOTAP_ANTENNA */
+       *pos = rx_status->Antenna;
+       pos++;
+
+       /* IEEE80211_RADIOTAP_DB_ANTNOISE is not used */
+
+       /* IEEE80211_RADIOTAP_RX_FLAGS */
+       /* ensure 2 byte alignment for the 2 byte field as required */
+}
+#endif
+
+static inline void rtllib_monitor_rx(struct rtllib_device *ieee,
+                               struct sk_buff *skb,struct rtllib_rx_stats *rx_status,
+                               size_t hdr_length)
+{
+
+#if defined(RTLLIB_RADIOTAP) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10))
+       int needed_headroom = 0;
+       struct sk_buff *radiotap_skb;
+
+       needed_headroom = rtllib_rx_radiotap_len(ieee, rx_status);
+       printk("needed_headroom = %d\n", needed_headroom);
+       radiotap_skb = skb_copy_expand(skb, needed_headroom, 0, GFP_ATOMIC);
+       dev_kfree_skb(skb);
+       if (!radiotap_skb) {
+               return;
+       }
+
+       rtllib_add_rx_radiotap_header(ieee, radiotap_skb, needed_headroom, rx_status);
+       radiotap_skb->dev = ieee->dev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
+        skb_reset_mac_header(radiotap_skb);
+#else
+        radiotap_skb->mac.raw = radiotap_skb->data;
+#endif
+       radiotap_skb->ip_summed = CHECKSUM_UNNECESSARY;
+       radiotap_skb->pkt_type = PACKET_OTHERHOST;
+       radiotap_skb->protocol = htons(ETH_P_802_2);
+       memset(radiotap_skb->cb, 0, sizeof(radiotap_skb->cb));
+       netif_rx(radiotap_skb);
+#else
+       skb->dev = ieee->dev;
+#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,22)
+        skb_reset_mac_header(skb);
+#else
+        skb->mac.raw = skb->data;
+#endif
+       skb_pull(skb, hdr_length);
+       skb->pkt_type = PACKET_OTHERHOST;
+       skb->protocol = __constant_htons(ETH_P_80211_RAW);
+       memset(skb->cb, 0, sizeof(skb->cb));
+       netif_rx(skb);
+#endif
+}
+
+/* Called only as a tasklet (software IRQ) */
+static struct rtllib_frag_entry *
+rtllib_frag_cache_find(struct rtllib_device *ieee, unsigned int seq,
+                         unsigned int frag, u8 tid,u8 *src, u8 *dst)
+{
+       struct rtllib_frag_entry *entry;
+       int i;
+
+       for (i = 0; i < RTLLIB_FRAG_CACHE_LEN; i++) {
+               entry = &ieee->frag_cache[tid][i];
+               if (entry->skb != NULL &&
+                   time_after(jiffies, entry->first_frag_time + 2 * HZ)) {
+                       RTLLIB_DEBUG_FRAG(
+                               "expiring fragment cache entry "
+                               "seq=%u last_frag=%u\n",
+                               entry->seq, entry->last_frag);
+                       dev_kfree_skb_any(entry->skb);
+                       entry->skb = NULL;
+               }
+
+               if (entry->skb != NULL && entry->seq == seq &&
+                   (entry->last_frag + 1 == frag || frag == -1) &&
+                   memcmp(entry->src_addr, src, ETH_ALEN) == 0 &&
+                   memcmp(entry->dst_addr, dst, ETH_ALEN) == 0)
+                       return entry;
+       }
+
+       return NULL;
+}
+
+/* Called only as a tasklet (software IRQ) */
+static struct sk_buff *
+rtllib_frag_cache_get(struct rtllib_device *ieee,
+                        struct rtllib_hdr_4addr *hdr)
+{
+       struct sk_buff *skb = NULL;
+       u16 fc = le16_to_cpu(hdr->frame_ctl);
+       u16 sc = le16_to_cpu(hdr->seq_ctl);
+       unsigned int frag = WLAN_GET_SEQ_FRAG(sc);
+       unsigned int seq = WLAN_GET_SEQ_SEQ(sc);
+       struct rtllib_frag_entry *entry;
+       struct rtllib_hdr_3addrqos *hdr_3addrqos;
+       struct rtllib_hdr_4addrqos *hdr_4addrqos;
+       u8 tid;
+
+       if (((fc & RTLLIB_FCTL_DSTODS) == RTLLIB_FCTL_DSTODS)&&RTLLIB_QOS_HAS_SEQ(fc)) {
+         hdr_4addrqos = (struct rtllib_hdr_4addrqos *)hdr;
+         tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & RTLLIB_QCTL_TID;
+         tid = UP2AC(tid);
+         tid ++;
+       } else if (RTLLIB_QOS_HAS_SEQ(fc)) {
+         hdr_3addrqos = (struct rtllib_hdr_3addrqos *)hdr;
+         tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & RTLLIB_QCTL_TID;
+         tid = UP2AC(tid);
+         tid ++;
+       } else {
+         tid = 0;
+       }
+
+       if (frag == 0) {
+               /* Reserve enough space to fit maximum frame length */
+               skb = dev_alloc_skb(ieee->dev->mtu +
+                                   sizeof(struct rtllib_hdr_4addr) +
+                                   8 /* LLC */ +
+                                   2 /* alignment */ +
+                                   8 /* WEP */ +
+                                   ETH_ALEN /* WDS */ +
+                                   (RTLLIB_QOS_HAS_SEQ(fc)?2:0) /* QOS Control */);
+               if (skb == NULL)
+                       return NULL;
+
+               entry = &ieee->frag_cache[tid][ieee->frag_next_idx[tid]];
+               ieee->frag_next_idx[tid]++;
+               if (ieee->frag_next_idx[tid] >= RTLLIB_FRAG_CACHE_LEN)
+                       ieee->frag_next_idx[tid] = 0;
+
+               if (entry->skb != NULL)
+                       dev_kfree_skb_any(entry->skb);
+
+               entry->first_frag_time = jiffies;
+               entry->seq = seq;
+               entry->last_frag = frag;
+               entry->skb = skb;
+               memcpy(entry->src_addr, hdr->addr2, ETH_ALEN);
+               memcpy(entry->dst_addr, hdr->addr1, ETH_ALEN);
+       } else {
+               /* received a fragment of a frame for which the head fragment
+                * should have already been received */
+               entry = rtllib_frag_cache_find(ieee, seq, frag, tid,hdr->addr2,
+                                                 hdr->addr1);
+               if (entry != NULL) {
+                       entry->last_frag = frag;
+                       skb = entry->skb;
+               }
+       }
+
+       return skb;
+}
+
+
+/* Called only as a tasklet (software IRQ) */
+static int rtllib_frag_cache_invalidate(struct rtllib_device *ieee,
+                                          struct rtllib_hdr_4addr *hdr)
+{
+       u16 fc = le16_to_cpu(hdr->frame_ctl);
+       u16 sc = le16_to_cpu(hdr->seq_ctl);
+       unsigned int seq = WLAN_GET_SEQ_SEQ(sc);
+       struct rtllib_frag_entry *entry;
+       struct rtllib_hdr_3addrqos *hdr_3addrqos;
+       struct rtllib_hdr_4addrqos *hdr_4addrqos;
+       u8 tid;
+
+       if (((fc & RTLLIB_FCTL_DSTODS) == RTLLIB_FCTL_DSTODS)&&RTLLIB_QOS_HAS_SEQ(fc)) {
+         hdr_4addrqos = (struct rtllib_hdr_4addrqos *)hdr;
+         tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & RTLLIB_QCTL_TID;
+         tid = UP2AC(tid);
+         tid ++;
+       } else if (RTLLIB_QOS_HAS_SEQ(fc)) {
+         hdr_3addrqos = (struct rtllib_hdr_3addrqos *)hdr;
+         tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & RTLLIB_QCTL_TID;
+         tid = UP2AC(tid);
+         tid ++;
+       } else {
+         tid = 0;
+       }
+
+       entry = rtllib_frag_cache_find(ieee, seq, -1, tid,hdr->addr2,
+                                         hdr->addr1);
+
+       if (entry == NULL) {
+               RTLLIB_DEBUG_FRAG(
+                       "could not invalidate fragment cache "
+                       "entry (seq=%u)\n", seq);
+               return -1;
+       }
+
+       entry->skb = NULL;
+       return 0;
+}
+
+
+
+/* rtllib_rx_frame_mgtmt
+ *
+ * Responsible for handling management control frames
+ *
+ * Called by rtllib_rx */
+static inline int
+rtllib_rx_frame_mgmt(struct rtllib_device *ieee, struct sk_buff *skb,
+                       struct rtllib_rx_stats *rx_stats, u16 type,
+                       u16 stype)
+{
+       /* On the struct stats definition there is written that
+        * this is not mandatory.... but seems that the probe
+        * response parser uses it
+        */
+       struct rtllib_hdr_3addr * hdr = (struct rtllib_hdr_3addr *)skb->data;
+
+       rx_stats->len = skb->len;
+       rtllib_rx_mgt(ieee,skb,rx_stats);
+       if ((memcmp(hdr->addr1, ieee->dev->dev_addr, ETH_ALEN))) {
+               dev_kfree_skb_any(skb);
+               return 0;
+       }
+       rtllib_rx_frame_softmac(ieee, skb, rx_stats, type, stype);
+
+       dev_kfree_skb_any(skb);
+
+       return 0;
+
+#ifdef NOT_YET
+       if (ieee->iw_mode == IW_MODE_MASTER) {
+               printk(KERN_DEBUG "%s: Master mode not yet suppported.\n",
+                      ieee->dev->name);
+               return 0;
+/*
+  hostap_update_sta_ps(ieee, (struct hostap_rtllib_hdr_4addr *)
+  skb->data);*/
+       }
+
+       if (ieee->hostapd && type == RTLLIB_TYPE_MGMT) {
+               if (stype == WLAN_FC_STYPE_BEACON &&
+                   ieee->iw_mode == IW_MODE_MASTER) {
+                       struct sk_buff *skb2;
+                       /* Process beacon frames also in kernel driver to
+                        * update STA(AP) table statistics */
+                       skb2 = skb_clone(skb, GFP_ATOMIC);
+                       if (skb2)
+                               hostap_rx(skb2->dev, skb2, rx_stats);
+               }
+
+               /* send management frames to the user space daemon for
+                * processing */
+               ieee->apdevstats.rx_packets++;
+               ieee->apdevstats.rx_bytes += skb->len;
+               prism2_rx_80211(ieee->apdev, skb, rx_stats, PRISM2_RX_MGMT);
+               return 0;
+       }
+
+           if (ieee->iw_mode == IW_MODE_MASTER) {
+               if (type != WLAN_FC_TYPE_MGMT && type != WLAN_FC_TYPE_CTRL) {
+                       printk(KERN_DEBUG "%s: unknown management frame "
+                              "(type=0x%02x, stype=0x%02x) dropped\n",
+                              skb->dev->name, type, stype);
+                       return -1;
+               }
+
+               hostap_rx(skb->dev, skb, rx_stats);
+               return 0;
+       }
+
+       printk(KERN_DEBUG "%s: hostap_rx_frame_mgmt: management frame "
+              "received in non-Host AP mode\n", skb->dev->name);
+       return -1;
+#endif
+}
+
+#ifndef CONFIG_CFG_80211
+/* See IEEE 802.1H for LLC/SNAP encapsulation/decapsulation */
+/* Ethernet-II snap header (RFC1042 for most EtherTypes) */
+static unsigned char rfc1042_header[] =
+{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0x00 };
+/* Bridge-Tunnel header (for EtherTypes ETH_P_AARP and ETH_P_IPX) */
+static unsigned char bridge_tunnel_header[] =
+{ 0xaa, 0xaa, 0x03, 0x00, 0x00, 0xf8 };
+/* No encapsulation header if EtherType < 0x600 (=length) */
+#endif
+
+/* Called by rtllib_rx_frame_decrypt */
+static int rtllib_is_eapol_frame(struct rtllib_device *ieee,
+                                   struct sk_buff *skb, size_t hdrlen)
+{
+       struct net_device *dev = ieee->dev;
+       u16 fc, ethertype;
+       struct rtllib_hdr_4addr *hdr;
+       u8 *pos;
+
+       if (skb->len < 24)
+               return 0;
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       fc = le16_to_cpu(hdr->frame_ctl);
+
+       /* check that the frame is unicast frame to us */
+       if ((fc & (RTLLIB_FCTL_TODS | RTLLIB_FCTL_FROMDS)) ==
+           RTLLIB_FCTL_TODS &&
+           memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0 &&
+           memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN) == 0) {
+               /* ToDS frame with own addr BSSID and DA */
+       } else if ((fc & (RTLLIB_FCTL_TODS | RTLLIB_FCTL_FROMDS)) ==
+                  RTLLIB_FCTL_FROMDS &&
+                  memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN) == 0) {
+               /* FromDS frame with own addr as DA */
+       } else
+               return 0;
+
+       if (skb->len < 24 + 8)
+               return 0;
+
+       /* check for port access entity Ethernet type */
+       pos = skb->data + hdrlen;
+       ethertype = (pos[6] << 8) | pos[7];
+       if (ethertype == ETH_P_PAE)
+               return 1;
+
+       return 0;
+}
+
+/* Called only as a tasklet (software IRQ), by rtllib_rx */
+static inline int
+rtllib_rx_frame_decrypt(struct rtllib_device* ieee, struct sk_buff *skb,
+                          struct rtllib_crypt_data *crypt)
+{
+       struct rtllib_hdr_4addr *hdr;
+       int res, hdrlen;
+
+       if (crypt == NULL || crypt->ops->decrypt_mpdu == NULL)
+               return 0;
+#if 1
+       if (ieee->hwsec_active)
+       {
+               cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
+               tcb_desc->bHwSec = 1;
+
+               if (ieee->need_sw_enc)
+                       tcb_desc->bHwSec = 0;
+       }
+#endif
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       hdrlen = rtllib_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
+
+#ifdef CONFIG_RTLLIB_CRYPT_TKIP
+       if (ieee->tkip_countermeasures &&
+           strcmp(crypt->ops->name, "TKIP") == 0) {
+               if (net_ratelimit()) {
+                       printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
+                              "received packet from " MAC_FMT "\n",
+                              ieee->dev->name, MAC_ARG(hdr->addr2));
+               }
+               return -1;
+       }
+#endif
+
+       atomic_inc(&crypt->refcnt);
+       res = crypt->ops->decrypt_mpdu(skb, hdrlen, crypt->priv);
+       atomic_dec(&crypt->refcnt);
+       if (res < 0) {
+               RTLLIB_DEBUG_DROP(
+                       "decryption failed (SA=" MAC_FMT
+                       ") res=%d\n", MAC_ARG(hdr->addr2), res);
+               if (res == -2)
+                       RTLLIB_DEBUG_DROP("Decryption failed ICV "
+                                            "mismatch (key %d)\n",
+                                            skb->data[hdrlen + 3] >> 6);
+               ieee->ieee_stats.rx_discards_undecryptable++;
+               return -1;
+       }
+
+       return res;
+}
+
+
+/* Called only as a tasklet (software IRQ), by rtllib_rx */
+static inline int
+rtllib_rx_frame_decrypt_msdu(struct rtllib_device* ieee, struct sk_buff *skb,
+                            int keyidx, struct rtllib_crypt_data *crypt)
+{
+       struct rtllib_hdr_4addr *hdr;
+       int res, hdrlen;
+
+       if (crypt == NULL || crypt->ops->decrypt_msdu == NULL)
+               return 0;
+       if (ieee->hwsec_active)
+       {
+               cb_desc *tcb_desc = (cb_desc *)(skb->cb+ MAX_DEV_ADDR_SIZE);
+               tcb_desc->bHwSec = 1;
+
+               if (ieee->need_sw_enc)
+                       tcb_desc->bHwSec = 0;
+       }
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       hdrlen = rtllib_get_hdrlen(le16_to_cpu(hdr->frame_ctl));
+
+       atomic_inc(&crypt->refcnt);
+       res = crypt->ops->decrypt_msdu(skb, keyidx, hdrlen, crypt->priv,ieee);
+       atomic_dec(&crypt->refcnt);
+       if (res < 0) {
+               printk(KERN_DEBUG "%s: MSDU decryption/MIC verification failed"
+                      " (SA=" MAC_FMT " keyidx=%d)\n",
+                      ieee->dev->name, MAC_ARG(hdr->addr2), keyidx);
+               return -1;
+       }
+
+       return 0;
+}
+
+
+/* this function is stolen from ipw2200 driver*/
+#define IEEE_PACKET_RETRY_TIME (5*HZ)
+static int is_duplicate_packet(struct rtllib_device *ieee,
+                                     struct rtllib_hdr_4addr *header)
+{
+       u16 fc = le16_to_cpu(header->frame_ctl);
+       u16 sc = le16_to_cpu(header->seq_ctl);
+       u16 seq = WLAN_GET_SEQ_SEQ(sc);
+       u16 frag = WLAN_GET_SEQ_FRAG(sc);
+       u16 *last_seq, *last_frag;
+       unsigned long *last_time;
+       struct rtllib_hdr_3addrqos *hdr_3addrqos;
+       struct rtllib_hdr_4addrqos *hdr_4addrqos;
+       u8 tid;
+
+       if (((fc & RTLLIB_FCTL_DSTODS) == RTLLIB_FCTL_DSTODS)&&RTLLIB_QOS_HAS_SEQ(fc)) {
+         hdr_4addrqos = (struct rtllib_hdr_4addrqos *)header;
+         tid = le16_to_cpu(hdr_4addrqos->qos_ctl) & RTLLIB_QCTL_TID;
+         tid = UP2AC(tid);
+         tid ++;
+       } else if (RTLLIB_QOS_HAS_SEQ(fc)) {
+         hdr_3addrqos = (struct rtllib_hdr_3addrqos*)header;
+         tid = le16_to_cpu(hdr_3addrqos->qos_ctl) & RTLLIB_QCTL_TID;
+         tid = UP2AC(tid);
+         tid ++;
+       } else {
+         tid = 0;
+       }
+
+       switch (ieee->iw_mode) {
+       case IW_MODE_ADHOC:
+       {
+               struct list_head *p;
+               struct ieee_ibss_seq *entry = NULL;
+               u8 *mac = header->addr2;
+               int index = mac[5] % IEEE_IBSS_MAC_HASH_SIZE;
+               list_for_each(p, &ieee->ibss_mac_hash[index]) {
+                       entry = list_entry(p, struct ieee_ibss_seq, list);
+                       if (!memcmp(entry->mac, mac, ETH_ALEN))
+                               break;
+               }
+               if (p == &ieee->ibss_mac_hash[index]) {
+                       entry = kmalloc(sizeof(struct ieee_ibss_seq), GFP_ATOMIC);
+                       if (!entry) {
+                               printk(KERN_WARNING "Cannot malloc new mac entry\n");
+                               return 0;
+                       }
+                       memcpy(entry->mac, mac, ETH_ALEN);
+                       entry->seq_num[tid] = seq;
+                       entry->frag_num[tid] = frag;
+                       entry->packet_time[tid] = jiffies;
+                       list_add(&entry->list, &ieee->ibss_mac_hash[index]);
+                       return 0;
+               }
+               last_seq = &entry->seq_num[tid];
+               last_frag = &entry->frag_num[tid];
+               last_time = &entry->packet_time[tid];
+               break;
+       }
+
+       case IW_MODE_INFRA:
+               last_seq = &ieee->last_rxseq_num[tid];
+               last_frag = &ieee->last_rxfrag_num[tid];
+               last_time = &ieee->last_packet_time[tid];
+               break;
+       default:
+               return 0;
+       }
+
+       if ((*last_seq == seq) &&
+           time_after(*last_time + IEEE_PACKET_RETRY_TIME, jiffies)) {
+               if (*last_frag == frag){
+                       goto drop;
+
+               }
+               if (*last_frag + 1 != frag)
+                       /* out-of-order fragment */
+                       goto drop;
+       } else
+               *last_seq = seq;
+
+       *last_frag = frag;
+       *last_time = jiffies;
+       return 0;
+
+drop:
+
+       return 1;
+}
+bool
+AddReorderEntry(
+       PRX_TS_RECORD                   pTS,
+       PRX_REORDER_ENTRY               pReorderEntry
+       )
+{
+       struct list_head *pList = &pTS->RxPendingPktList;
+
+       while(pList->next != &pTS->RxPendingPktList)
+       {
+               if ( SN_LESS(pReorderEntry->SeqNum, ((PRX_REORDER_ENTRY)list_entry(pList->next,RX_REORDER_ENTRY,List))->SeqNum) )
+               {
+                       pList = pList->next;
+               }
+               else if ( SN_EQUAL(pReorderEntry->SeqNum, ((PRX_REORDER_ENTRY)list_entry(pList->next,RX_REORDER_ENTRY,List))->SeqNum) )
+               {
+                       return false;
+               }
+               else
+               {
+                       break;
+               }
+       }
+       pReorderEntry->List.next = pList->next;
+       pReorderEntry->List.next->prev = &pReorderEntry->List;
+       pReorderEntry->List.prev = pList;
+       pList->next = &pReorderEntry->List;
+
+       return true;
+}
+
+void rtllib_indicate_packets(struct rtllib_device *ieee, struct rtllib_rxb** prxbIndicateArray,u8  index)
+{
+       struct net_device_stats *stats = &ieee->stats;
+       u8 i = 0 , j=0;
+       u16 ethertype;
+       for (j = 0; j < index; j++) {
+               struct rtllib_rxb* prxb = prxbIndicateArray[j];
+               for (i = 0; i<prxb->nr_subframes; i++) {
+                       struct sk_buff *sub_skb = prxb->subframes[i];
+
+               /* convert hdr + possible LLC headers into Ethernet header */
+                       ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
+                       if (sub_skb->len >= 8 &&
+                               ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
+                                 ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
+                                memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
+                       /* remove RFC1042 or Bridge-Tunnel encapsulation and
+                        * replace EtherType */
+                               skb_pull(sub_skb, SNAP_SIZE);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->src, ETH_ALEN);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->dst, ETH_ALEN);
+                       } else {
+                               u16 len;
+                       /* Leave Ethernet header part of hdr and full payload */
+                               len = htons(sub_skb->len);
+                               memcpy(skb_push(sub_skb, 2), &len, 2);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->src, ETH_ALEN);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), prxb->dst, ETH_ALEN);
+                       }
+
+               /* Indicat the packets to upper layer */
+                       if (sub_skb) {
+                               stats->rx_packets++;
+                               stats->rx_bytes += sub_skb->len;
+
+                               memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
+                               sub_skb->protocol = eth_type_trans(sub_skb, ieee->dev);
+                               sub_skb->dev = ieee->dev;
+                               sub_skb->dev->stats.rx_packets++;
+                               sub_skb->dev->stats.rx_bytes += sub_skb->len;
+#ifdef TCP_CSUM_OFFLOAD_RX
+                               if ( prxb->tcp_csum_valid)
+                                       sub_skb->ip_summed = CHECKSUM_UNNECESSARY;
+                               else
+                                       sub_skb->ip_summed = CHECKSUM_NONE;
+
+#else
+                               sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
+#endif
+                               ieee->last_rx_ps_time = jiffies;
+                               netif_rx(sub_skb);
+                       }
+               }
+               kfree(prxb);
+               prxb = NULL;
+       }
+}
+
+void
+rtllib_FlushRxTsPendingPkts(struct rtllib_device *ieee,        PRX_TS_RECORD pTS)
+{
+       PRX_REORDER_ENTRY       pRxReorderEntry;
+       struct rtllib_rxb*              RfdArray[REORDER_WIN_SIZE];
+       u8                                      RfdCnt = 0;
+
+
+       del_timer_sync(&pTS->RxPktPendingTimer);
+       while(!list_empty(&pTS->RxPendingPktList))
+       {
+               if (RfdCnt >= REORDER_WIN_SIZE){
+                       printk("-------------->%s() error! RfdCnt >= REORDER_WIN_SIZE\n", __func__);
+                       break;
+               }
+
+               pRxReorderEntry = (PRX_REORDER_ENTRY)list_entry(pTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
+               RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Indicate SeqNum %d!\n",__func__, pRxReorderEntry->SeqNum);
+               list_del_init(&pRxReorderEntry->List);
+
+               RfdArray[RfdCnt] = pRxReorderEntry->prxb;
+
+               RfdCnt = RfdCnt + 1;
+               list_add_tail(&pRxReorderEntry->List, &ieee->RxReorder_Unused_List);
+       }
+       rtllib_indicate_packets(ieee, RfdArray, RfdCnt);
+
+       pTS->RxIndicateSeq = 0xffff;
+
+#ifdef MERGE_TO_DO
+#endif
+}
+
+
+void RxReorderIndicatePacket( struct rtllib_device *ieee,
+               struct rtllib_rxb* prxb,
+               PRX_TS_RECORD           pTS,
+               u16                     SeqNum)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       PRX_REORDER_ENTRY       pReorderEntry = NULL;
+       struct rtllib_rxb* prxbIndicateArray[REORDER_WIN_SIZE];
+       u8                      WinSize = pHTInfo->RxReorderWinSize;
+       u16                     WinEnd = 0;
+       u8                      index = 0;
+       bool                    bMatchWinStart = false, bPktInBuf = false;
+       unsigned long flags;
+
+       RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Seq is %d,pTS->RxIndicateSeq is %d, WinSize is %d\n",__func__,SeqNum,pTS->RxIndicateSeq,WinSize);
+
+       spin_lock_irqsave(&(ieee->reorder_spinlock), flags);
+
+       WinEnd = (pTS->RxIndicateSeq + WinSize -1)%4096;
+       /* Rx Reorder initialize condition.*/
+       if (pTS->RxIndicateSeq == 0xffff) {
+               pTS->RxIndicateSeq = SeqNum;
+       }
+
+       /* Drop out the packet which SeqNum is smaller than WinStart */
+       if (SN_LESS(SeqNum, pTS->RxIndicateSeq)) {
+               RTLLIB_DEBUG(RTLLIB_DL_REORDER,"Packet Drop! IndicateSeq: %d, NewSeq: %d\n",
+                                pTS->RxIndicateSeq, SeqNum);
+               pHTInfo->RxReorderDropCounter++;
+               {
+                       int i;
+                       for (i =0; i < prxb->nr_subframes; i++) {
+                               dev_kfree_skb(prxb->subframes[i]);
+                       }
+                       kfree(prxb);
+                       prxb = NULL;
+               }
+               spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
+               return;
+       }
+
+       /*
+        * Sliding window manipulation. Conditions includes:
+        * 1. Incoming SeqNum is equal to WinStart =>Window shift 1
+        * 2. Incoming SeqNum is larger than the WinEnd => Window shift N
+        */
+       if (SN_EQUAL(SeqNum, pTS->RxIndicateSeq)) {
+               pTS->RxIndicateSeq = (pTS->RxIndicateSeq + 1) % 4096;
+               bMatchWinStart = true;
+       } else if (SN_LESS(WinEnd, SeqNum)) {
+               if (SeqNum >= (WinSize - 1)) {
+                       pTS->RxIndicateSeq = SeqNum + 1 -WinSize;
+               } else {
+                       pTS->RxIndicateSeq = 4095 - (WinSize - (SeqNum +1)) + 1;
+               }
+               RTLLIB_DEBUG(RTLLIB_DL_REORDER, "Window Shift! IndicateSeq: %d, NewSeq: %d\n",pTS->RxIndicateSeq, SeqNum);
+       }
+
+       /*
+        * Indication process.
+        * After Packet dropping and Sliding Window shifting as above, we can now just indicate the packets
+        * with the SeqNum smaller than latest WinStart and buffer other packets.
+        */
+       /* For Rx Reorder condition:
+        * 1. All packets with SeqNum smaller than WinStart => Indicate
+        * 2. All packets with SeqNum larger than or equal to WinStart => Buffer it.
+        */
+       if (bMatchWinStart) {
+               /* Current packet is going to be indicated.*/
+               RTLLIB_DEBUG(RTLLIB_DL_REORDER, "Packets indication!! IndicateSeq: %d, NewSeq: %d\n",\
+                               pTS->RxIndicateSeq, SeqNum);
+               prxbIndicateArray[0] = prxb;
+               index = 1;
+       } else {
+               /* Current packet is going to be inserted into pending list.*/
+               if (!list_empty(&ieee->RxReorder_Unused_List)) {
+                       pReorderEntry = (PRX_REORDER_ENTRY)list_entry(ieee->RxReorder_Unused_List.next,RX_REORDER_ENTRY,List);
+                       list_del_init(&pReorderEntry->List);
+
+                       /* Make a reorder entry and insert into a the packet list.*/
+                       pReorderEntry->SeqNum = SeqNum;
+                       pReorderEntry->prxb = prxb;
+
+#if 1
+                       if (!AddReorderEntry(pTS, pReorderEntry)) {
+                               RTLLIB_DEBUG(RTLLIB_DL_REORDER, "%s(): Duplicate packet is dropped!! IndicateSeq: %d, NewSeq: %d\n",
+                                       __func__, pTS->RxIndicateSeq, SeqNum);
+                               list_add_tail(&pReorderEntry->List,&ieee->RxReorder_Unused_List);
+                               {
+                                       int i;
+                                       for (i =0; i < prxb->nr_subframes; i++) {
+                                               dev_kfree_skb(prxb->subframes[i]);
+                                       }
+                                       kfree(prxb);
+                                       prxb = NULL;
+                               }
+                       } else {
+                               RTLLIB_DEBUG(RTLLIB_DL_REORDER,
+                                        "Pkt insert into buffer!! IndicateSeq: %d, NewSeq: %d\n",pTS->RxIndicateSeq, SeqNum);
+                       }
+#endif
+               }
+               else {
+                       /*
+                        * Packets are dropped if there is not enough reorder entries.
+                        * This part shall be modified!! We can just indicate all the
+                        * packets in buffer and get reorder entries.
+                        */
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket(): There is no reorder entry!! Packet is dropped!!\n");
+                       {
+                               int i;
+                               for (i =0; i < prxb->nr_subframes; i++) {
+                                       dev_kfree_skb(prxb->subframes[i]);
+                               }
+                               kfree(prxb);
+                               prxb = NULL;
+                       }
+               }
+       }
+
+       /* Check if there is any packet need indicate.*/
+       while(!list_empty(&pTS->RxPendingPktList)) {
+               RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): start RREORDER indicate\n",__func__);
+#if 1
+               pReorderEntry = (PRX_REORDER_ENTRY)list_entry(pTS->RxPendingPktList.prev,RX_REORDER_ENTRY,List);
+               if ( SN_LESS(pReorderEntry->SeqNum, pTS->RxIndicateSeq) ||
+                               SN_EQUAL(pReorderEntry->SeqNum, pTS->RxIndicateSeq))
+               {
+                       /* This protect buffer from overflow. */
+                       if (index >= REORDER_WIN_SIZE) {
+                               RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket(): Buffer overflow!! \n");
+                               bPktInBuf = true;
+                               break;
+                       }
+
+                       list_del_init(&pReorderEntry->List);
+
+                       if (SN_EQUAL(pReorderEntry->SeqNum, pTS->RxIndicateSeq))
+                               pTS->RxIndicateSeq = (pTS->RxIndicateSeq + 1) % 4096;
+
+                       prxbIndicateArray[index] = pReorderEntry->prxb;
+                       RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): Indicate SeqNum %d!\n",__func__, pReorderEntry->SeqNum);
+                       index++;
+
+                       list_add_tail(&pReorderEntry->List,&ieee->RxReorder_Unused_List);
+               } else {
+                       bPktInBuf = true;
+                       break;
+               }
+#endif
+       }
+
+       /* Handling pending timer. Set this timer to prevent from long time Rx buffering.*/
+       if (index>0) {
+               if (timer_pending(&pTS->RxPktPendingTimer)){
+                       del_timer_sync(&pTS->RxPktPendingTimer);
+               }
+               pTS->RxTimeoutIndicateSeq = 0xffff;
+
+               if (index>REORDER_WIN_SIZE){
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR, "RxReorderIndicatePacket(): Rx Reorer buffer full!! \n");
+                       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
+                       return;
+               }
+               rtllib_indicate_packets(ieee, prxbIndicateArray, index);
+               bPktInBuf = false;
+       }
+
+       if (bPktInBuf && pTS->RxTimeoutIndicateSeq==0xffff) {
+               RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): SET rx timeout timer\n", __func__);
+               pTS->RxTimeoutIndicateSeq = pTS->RxIndicateSeq;
+               mod_timer(&pTS->RxPktPendingTimer,  jiffies + MSECS(pHTInfo->RxReorderPendingTime));
+       }
+       spin_unlock_irqrestore(&(ieee->reorder_spinlock), flags);
+}
+
+u8 parse_subframe(struct rtllib_device* ieee,struct sk_buff *skb,
+                  struct rtllib_rx_stats *rx_stats,
+                 struct rtllib_rxb *rxb,u8* src,u8* dst)
+{
+       struct rtllib_hdr_3addr  *hdr = (struct rtllib_hdr_3addr* )skb->data;
+       u16             fc = le16_to_cpu(hdr->frame_ctl);
+
+       u16             LLCOffset= sizeof(struct rtllib_hdr_3addr);
+       u16             ChkLength;
+       bool            bIsAggregateFrame = false;
+       u16             nSubframe_Length;
+       u8              nPadding_Length = 0;
+       u16             SeqNum=0;
+       struct sk_buff *sub_skb;
+       u8             *data_ptr;
+       /* just for debug purpose */
+       SeqNum = WLAN_GET_SEQ_SEQ(le16_to_cpu(hdr->seq_ctl));
+       if ((RTLLIB_QOS_HAS_SEQ(fc))&&\
+                       (((frameqos *)(skb->data + RTLLIB_3ADDR_LEN))->field.reserved)) {
+               bIsAggregateFrame = true;
+       }
+
+       if (RTLLIB_QOS_HAS_SEQ(fc)) {
+               LLCOffset += 2;
+       }
+       if (rx_stats->bContainHTC) {
+               LLCOffset += sHTCLng;
+       }
+
+       ChkLength = LLCOffset;/* + (Frame_WEP(frame)!=0 ?Adapter->MgntInfo.SecurityInfo.EncryptionHeadOverhead:0);*/
+
+       if ( skb->len <= ChkLength ) {
+               return 0;
+       }
+
+       skb_pull(skb, LLCOffset);
+       ieee->bIsAggregateFrame = bIsAggregateFrame;
+       if (!bIsAggregateFrame) {
+               rxb->nr_subframes = 1;
+
+               /* altered by clark 3/30/2010
+                * The buffer size of the skb indicated to upper layer
+                * must be less than 5000, or the defraged IP datagram
+                * in the IP layer will exceed "ipfrag_high_tresh" and be
+                * discarded. so there must not use the function
+                * "skb_copy" and "skb_clone" for "skb".
+                */
+
+               /* Allocate new skb for releasing to upper layer */
+               sub_skb = dev_alloc_skb(RTLLIB_SKBBUFFER_SIZE);
+               skb_reserve(sub_skb, 12);
+               data_ptr = (u8 *)skb_put(sub_skb, skb->len);
+               memcpy(data_ptr, skb->data, skb->len);
+               sub_skb->dev = ieee->dev;
+
+               rxb->subframes[0] = sub_skb;
+
+               memcpy(rxb->src,src,ETH_ALEN);
+               memcpy(rxb->dst,dst,ETH_ALEN);
+               rxb->subframes[0]->dev = ieee->dev;
+               return 1;
+       } else {
+               rxb->nr_subframes = 0;
+               memcpy(rxb->src,src,ETH_ALEN);
+               memcpy(rxb->dst,dst,ETH_ALEN);
+               while(skb->len > ETHERNET_HEADER_SIZE) {
+                       /* Offset 12 denote 2 mac address */
+                       nSubframe_Length = *((u16*)(skb->data + 12));
+                       nSubframe_Length = (nSubframe_Length>>8) + (nSubframe_Length<<8);
+
+                       if (skb->len<(ETHERNET_HEADER_SIZE + nSubframe_Length)) {
+                               printk("%s: A-MSDU parse error!! pRfd->nTotalSubframe : %d\n",\
+                                               __func__,rxb->nr_subframes);
+                               printk("%s: A-MSDU parse error!! Subframe Length: %d\n",__func__, nSubframe_Length);
+                               printk("nRemain_Length is %d and nSubframe_Length is : %d\n",skb->len,nSubframe_Length);
+                               printk("The Packet SeqNum is %d\n",SeqNum);
+                               return 0;
+                       }
+
+                       /* move the data point to data content */
+                       skb_pull(skb, ETHERNET_HEADER_SIZE);
+
+                       /* altered by clark 3/30/2010
+                        * The buffer size of the skb indicated to upper layer
+                        * must be less than 5000, or the defraged IP datagram
+                        * in the IP layer will exceed "ipfrag_high_tresh" and be
+                        * discarded. so there must not use the function
+                        * "skb_copy" and "skb_clone" for "skb".
+                        */
+
+                       /* Allocate new skb for releasing to upper layer */
+                       sub_skb = dev_alloc_skb(nSubframe_Length + 12);
+                       skb_reserve(sub_skb, 12);
+                       data_ptr = (u8 *)skb_put(sub_skb, nSubframe_Length);
+                       memcpy(data_ptr,skb->data,nSubframe_Length);
+
+                       sub_skb->dev = ieee->dev;
+                       rxb->subframes[rxb->nr_subframes++] = sub_skb;
+                       if (rxb->nr_subframes >= MAX_SUBFRAME_COUNT) {
+                               RTLLIB_DEBUG_RX("ParseSubframe(): Too many Subframes! Packets dropped!\n");
+                               break;
+                       }
+                       skb_pull(skb,nSubframe_Length);
+
+                       if (skb->len != 0) {
+                               nPadding_Length = 4 - ((nSubframe_Length + ETHERNET_HEADER_SIZE) % 4);
+                               if (nPadding_Length == 4) {
+                                       nPadding_Length = 0;
+                               }
+
+                               if (skb->len < nPadding_Length) {
+                                       return 0;
+                               }
+
+                               skb_pull(skb,nPadding_Length);
+                       }
+               }
+
+               return rxb->nr_subframes;
+       }
+}
+
+
+size_t rtllib_rx_get_hdrlen(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       struct rtllib_hdr_4addr *hdr = (struct rtllib_hdr_4addr *)skb->data;
+       u16 fc = le16_to_cpu(hdr->frame_ctl);
+       size_t hdrlen = 0;
+
+       hdrlen = rtllib_get_hdrlen(fc);
+       if (HTCCheck(ieee, skb->data)) {
+               if (net_ratelimit())
+                       printk("%s: find HTCControl!\n", __func__);
+               hdrlen += 4;
+               rx_stats->bContainHTC = 1;
+       }
+
+        if (RTLLIB_QOS_HAS_SEQ(fc))
+               rx_stats->bIsQosData = 1;
+
+       return hdrlen;
+}
+
+int rtllib_rx_check_duplicate(struct rtllib_device *ieee, struct sk_buff *skb, u8 multicast)
+{
+       struct rtllib_hdr_4addr *hdr = (struct rtllib_hdr_4addr *)skb->data;
+       u16 fc, sc;
+       u8 frag, type, stype;
+
+       fc = le16_to_cpu(hdr->frame_ctl);
+       type = WLAN_FC_GET_TYPE(fc);
+       stype = WLAN_FC_GET_STYPE(fc);
+       sc = le16_to_cpu(hdr->seq_ctl);
+       frag = WLAN_GET_SEQ_FRAG(sc);
+
+       if ( (ieee->pHTInfo->bCurRxReorderEnable == false) ||
+               !ieee->current_network.qos_data.active ||
+               !IsDataFrame(skb->data) ||
+               IsLegacyDataFrame(skb->data)) {
+               if (!((type == RTLLIB_FTYPE_MGMT) && (stype == RTLLIB_STYPE_BEACON))){
+                       if (is_duplicate_packet(ieee, hdr)){
+                               return -1;
+                       }
+               }
+       } else {
+               PRX_TS_RECORD pRxTS = NULL;
+               if (GetTs(ieee, (PTS_COMMON_INFO*) &pRxTS, hdr->addr2,
+                       (u8)Frame_QoSTID((u8*)(skb->data)), RX_DIR, true)) {
+                       if ((fc & (1<<11)) && (frag == pRxTS->RxLastFragNum) &&
+                           (WLAN_GET_SEQ_SEQ(sc) == pRxTS->RxLastSeqNum)) {
+                               return -1;
+                       } else {
+                               pRxTS->RxLastFragNum = frag;
+                               pRxTS->RxLastSeqNum = WLAN_GET_SEQ_SEQ(sc);
+                       }
+               } else {
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!%s(): No TS!! Skip the check!!\n",__func__);
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+void rtllib_rx_extract_addr(struct rtllib_device *ieee, struct rtllib_hdr_4addr *hdr, u8 *dst, u8 *src, u8 *bssid)
+{
+       u16 fc = le16_to_cpu(hdr->frame_ctl);
+
+       switch (fc & (RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS)) {
+               case RTLLIB_FCTL_FROMDS:
+                       memcpy(dst, hdr->addr1, ETH_ALEN);
+                       memcpy(src, hdr->addr3, ETH_ALEN);
+                       memcpy(bssid, hdr->addr2, ETH_ALEN);
+                       break;
+               case RTLLIB_FCTL_TODS:
+                       memcpy(dst, hdr->addr3, ETH_ALEN);
+                       memcpy(src, hdr->addr2, ETH_ALEN);
+                       memcpy(bssid, hdr->addr1, ETH_ALEN);
+                       break;
+               case RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS:
+                       memcpy(dst, hdr->addr3, ETH_ALEN);
+                       memcpy(src, hdr->addr4, ETH_ALEN);
+                       memcpy(bssid, ieee->current_network.bssid, ETH_ALEN);
+                       break;
+               case 0:
+                       memcpy(dst, hdr->addr1, ETH_ALEN);
+                       memcpy(src, hdr->addr2, ETH_ALEN);
+                       memcpy(bssid, hdr->addr3, ETH_ALEN);
+                       break;
+       }
+}
+int rtllib_rx_data_filter(struct rtllib_device *ieee, u16 fc, u8 *dst, u8 *src, u8 *bssid, u8 *addr2)
+{
+       u8 zero_addr[ETH_ALEN] = {0};
+       u8 type, stype;
+
+       type = WLAN_FC_GET_TYPE(fc);
+       stype = WLAN_FC_GET_STYPE(fc);
+
+       /* Filter frames from different BSS */
+       if (((fc & RTLLIB_FCTL_DSTODS) != RTLLIB_FCTL_DSTODS)
+                && (compare_ether_addr(ieee->current_network.bssid, bssid) != 0)
+                && memcmp(ieee->current_network.bssid, zero_addr, ETH_ALEN)) {
+               return -1;
+       }
+
+       /* Filter packets sent by an STA that will be forwarded by AP */
+       if ( ieee->IntelPromiscuousModeInfo.bPromiscuousOn  &&
+                ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame ) {
+               if ((fc & RTLLIB_FCTL_TODS) && !(fc & RTLLIB_FCTL_FROMDS) &&
+                       (compare_ether_addr(dst, ieee->current_network.bssid) != 0) &&
+                       (compare_ether_addr(bssid, ieee->current_network.bssid) == 0)) {
+                       return -1;
+               }
+       }
+
+       /* Nullfunc frames may have PS-bit set, so they must be passed to
+        * hostap_handle_sta_rx() before being dropped here. */
+       if (!ieee->IntelPromiscuousModeInfo.bPromiscuousOn){
+               if (stype != RTLLIB_STYPE_DATA &&
+                   stype != RTLLIB_STYPE_DATA_CFACK &&
+                   stype != RTLLIB_STYPE_DATA_CFPOLL &&
+                   stype != RTLLIB_STYPE_DATA_CFACKPOLL&&
+                   stype != RTLLIB_STYPE_QOS_DATA
+                   ) {
+                       if (stype != RTLLIB_STYPE_NULLFUNC)
+                               RTLLIB_DEBUG_DROP(
+                                       "RX: dropped data frame "
+                                       "with no data (type=0x%02x, "
+                                       "subtype=0x%02x)\n",
+                                       type, stype);
+                       return -1;
+               }
+       }
+
+       if (ieee->iw_mode != IW_MODE_MESH) {
+               /* packets from our adapter are dropped (echo) */
+               if (!memcmp(src, ieee->dev->dev_addr, ETH_ALEN))
+                       return -1;
+
+               /* {broad,multi}cast packets to our BSS go through */
+               if (is_multicast_ether_addr(dst) || is_broadcast_ether_addr(dst)) {
+                       if (memcmp(bssid, ieee->current_network.bssid, ETH_ALEN)) {
+                               return -1;
+                       }
+               }
+       }
+       return 0;
+}
+int rtllib_rx_get_crypt(
+               struct rtllib_device *ieee,
+               struct sk_buff *skb,
+               struct rtllib_crypt_data **crypt,
+               size_t hdrlen)
+{
+       struct rtllib_hdr_4addr *hdr = (struct rtllib_hdr_4addr *)skb->data;
+       u16 fc = le16_to_cpu(hdr->frame_ctl);
+       int idx = 0;
+
+       if (ieee->host_decrypt) {
+               if (skb->len >= hdrlen + 3)
+                       idx = skb->data[hdrlen + 3] >> 6;
+
+               *crypt = ieee->crypt[idx];
+               /* allow NULL decrypt to indicate an station specific override
+                * for default encryption */
+               if (*crypt && ((*crypt)->ops == NULL ||
+                             (*crypt)->ops->decrypt_mpdu == NULL))
+                       *crypt = NULL;
+
+               if (!*crypt && (fc & RTLLIB_FCTL_WEP)) {
+                       /* This seems to be triggered by some (multicast?)
+                        * frames from other than current BSS, so just drop the
+                        * frames silently instead of filling system log with
+                        * these reports. */
+                       RTLLIB_DEBUG_DROP("Decryption failed (not set)"
+                                            " (SA=" MAC_FMT ")\n",
+                                            MAC_ARG(hdr->addr2));
+                       ieee->ieee_stats.rx_discards_undecryptable++;
+                       return -1;
+               }
+       }
+
+       return 0;
+}
+int rtllib_rx_decrypt(
+               struct rtllib_device *ieee,
+               struct sk_buff *skb,
+               struct rtllib_rx_stats *rx_stats,
+               struct rtllib_crypt_data *crypt,
+               size_t hdrlen)
+{
+       struct rtllib_hdr_4addr *hdr;
+       int keyidx = 0;
+       u16 fc, sc;
+       u8 frag;
+
+       hdr = (struct rtllib_hdr_4addr *)skb->data;
+       fc = le16_to_cpu(hdr->frame_ctl);
+       sc = le16_to_cpu(hdr->seq_ctl);
+       frag = WLAN_GET_SEQ_FRAG(sc);
+
+       if ((!rx_stats->Decrypted)){
+               ieee->need_sw_enc = 1;
+       }else{
+               ieee->need_sw_enc = 0;
+       }
+
+       if (ieee->host_decrypt && (fc & RTLLIB_FCTL_WEP) &&
+           ((keyidx = rtllib_rx_frame_decrypt(ieee, skb, crypt)) < 0)) {
+               printk("%s: decrypt frame error\n", __func__);
+               return -1;
+       }
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       if ((frag != 0 || (fc & RTLLIB_FCTL_MOREFRAGS))) {
+               int flen;
+               struct sk_buff *frag_skb = rtllib_frag_cache_get(ieee, hdr);
+               RTLLIB_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
+
+               if (!frag_skb) {
+                       RTLLIB_DEBUG(RTLLIB_DL_RX | RTLLIB_DL_FRAG,
+                                       "Rx cannot get skb from fragment "
+                                       "cache (morefrag=%d seq=%u frag=%u)\n",
+                                       (fc & RTLLIB_FCTL_MOREFRAGS) != 0,
+                                       WLAN_GET_SEQ_SEQ(sc), frag);
+                       return -1;
+               }
+               flen = skb->len;
+               if (frag != 0)
+                       flen -= hdrlen;
+
+               if (frag_skb->tail + flen > frag_skb->end) {
+                       printk(KERN_WARNING "%s: host decrypted and "
+                              "reassembled frame did not fit skb\n",
+                              __func__);
+                       rtllib_frag_cache_invalidate(ieee, hdr);
+                       return -1;
+               }
+
+               if (frag == 0) {
+                       /* copy first fragment (including full headers) into
+                        * beginning of the fragment cache skb */
+                       memcpy(skb_put(frag_skb, flen), skb->data, flen);
+               } else {
+                       /* append frame payload to the end of the fragment
+                        * cache skb */
+                       memcpy(skb_put(frag_skb, flen), skb->data + hdrlen,
+                              flen);
+               }
+               dev_kfree_skb_any(skb);
+               skb = NULL;
+
+               if (fc & RTLLIB_FCTL_MOREFRAGS) {
+                       /* more fragments expected - leave the skb in fragment
+                        * cache for now; it will be delivered to upper layers
+                        * after all fragments have been received */
+                       return -2;
+               }
+
+               /* this was the last fragment and the frame will be
+                * delivered, so remove skb from fragment cache */
+               skb = frag_skb;
+               hdr = (struct rtllib_hdr_4addr *) skb->data;
+               rtllib_frag_cache_invalidate(ieee, hdr);
+       }
+
+       /* skb: hdr + (possible reassembled) full MSDU payload; possibly still
+        * encrypted/authenticated */
+       if (ieee->host_decrypt && (fc & RTLLIB_FCTL_WEP) &&
+               rtllib_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt))
+       {
+               printk("%s: ==>decrypt msdu error\n", __func__);
+               return -1;
+       }
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       if (crypt && !(fc & RTLLIB_FCTL_WEP) && !ieee->open_wep) {
+               if (/*ieee->ieee802_1x &&*/
+                   rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+
+#ifdef CONFIG_RTLLIB_DEBUG
+                       /* pass unencrypted EAPOL frames even if encryption is
+                        * configured */
+                       struct eapol *eap = (struct eapol *)(skb->data +
+                               24);
+                       RTLLIB_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
+                                               eap_get_type(eap->type));
+#endif
+               } else {
+                       RTLLIB_DEBUG_DROP(
+                               "encryption configured, but RX "
+                               "frame not encrypted (SA=" MAC_FMT ")\n",
+                               MAC_ARG(hdr->addr2));
+                       return -1;
+               }
+       }
+
+#ifdef CONFIG_RTLLIB_DEBUG
+       if (crypt && !(fc & RTLLIB_FCTL_WEP) &&
+           rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+                       struct eapol *eap = (struct eapol *)(skb->data +
+                               24);
+                       RTLLIB_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
+                                               eap_get_type(eap->type));
+       }
+#endif
+
+       if (crypt && !(fc & RTLLIB_FCTL_WEP) && !ieee->open_wep &&
+           !rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+               RTLLIB_DEBUG_DROP(
+                       "dropped unencrypted RX data "
+                       "frame from " MAC_FMT
+                       " (drop_unencrypted=1)\n",
+                       MAC_ARG(hdr->addr2));
+               return -1;
+       }
+
+       if (rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+               printk(KERN_WARNING "RX: IEEE802.1X EAPOL frame!\n");
+       }
+
+       return 0;
+}
+void rtllib_rx_check_leave_lps(struct rtllib_device *ieee, u8 unicast, u8 nr_subframes)
+{
+#if !defined(RTL8192SU) && !defined(RTL8192U)
+       if (unicast){
+
+               if ((ieee->state == RTLLIB_LINKED) /*&& !MgntInitAdapterInProgress(pMgntInfo)*/)
+               {
+                       if (    ((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod +ieee->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
+                               (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2) )
+                       {
+                               if (ieee->LeisurePSLeave)
+                                       ieee->LeisurePSLeave(ieee->dev);
+                       }
+               }
+       }
+#endif
+       ieee->last_rx_ps_time = jiffies;
+}
+void rtllib_rx_indicate_pkt_legacy(
+               struct rtllib_device *ieee,
+               struct rtllib_rx_stats *rx_stats,
+               struct rtllib_rxb* rxb,
+               u8 *dst,
+               u8 *src)
+{
+       struct net_device *dev = ieee->dev;
+       u16 ethertype;
+       int i = 0;
+
+       if (rxb == NULL){
+               printk("%s: rxb is NULL!!\n", __func__);
+               return ;
+       }
+
+       for (i = 0; i<rxb->nr_subframes; i++) {
+               struct sk_buff *sub_skb = rxb->subframes[i];
+
+               if (sub_skb) {
+                       /* convert hdr + possible LLC headers into Ethernet header */
+                       ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
+                       if (sub_skb->len >= 8 &&
+                                       ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
+                                         ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
+                                        memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
+                               /* remove RFC1042 or Bridge-Tunnel encapsulation and
+                                * replace EtherType */
+                               skb_pull(sub_skb, SNAP_SIZE);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
+                       } else {
+                               u16 len;
+                               /* Leave Ethernet header part of hdr and full payload */
+                               len = htons(sub_skb->len);
+                               memcpy(skb_push(sub_skb, 2), &len, 2);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
+                               memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
+                       }
+
+                       ieee->stats.rx_packets++;
+                       ieee->stats.rx_bytes += sub_skb->len;
+
+                       if (is_multicast_ether_addr(dst)) {
+                               ieee->stats.multicast++;
+                       }
+
+                       /* Indicat the packets to upper layer */
+                       memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
+                       sub_skb->protocol = eth_type_trans(sub_skb, dev);
+                       sub_skb->dev = dev;
+                       sub_skb->dev->stats.rx_packets++;
+                       sub_skb->dev->stats.rx_bytes += sub_skb->len;
+#ifdef TCP_CSUM_OFFLOAD_RX
+                       if ( rx_stats->tcp_csum_valid)
+                               sub_skb->ip_summed = CHECKSUM_UNNECESSARY;
+                       else
+                               sub_skb->ip_summed = CHECKSUM_NONE;
+#else
+                       sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
+#endif
+                       netif_rx(sub_skb);
+               }
+       }
+       kfree(rxb);
+       rxb = NULL;
+}
+int rtllib_rx_InfraAdhoc(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       struct net_device *dev = ieee->dev;
+       struct rtllib_hdr_4addr *hdr = (struct rtllib_hdr_4addr *)skb->data;
+       struct rtllib_crypt_data *crypt = NULL;
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       struct sta_info * psta = NULL;
+#endif
+       struct rtllib_rxb* rxb = NULL;
+       PRX_TS_RECORD pTS = NULL;
+       u16 fc, sc, SeqNum = 0;
+       u8 type, stype, multicast = 0, unicast = 0, nr_subframes = 0, TID = 0;
+       u8 dst[ETH_ALEN], src[ETH_ALEN], bssid[ETH_ALEN] = {0}, *payload;
+       size_t hdrlen = 0;
+       bool bToOtherSTA = false;
+       int ret = 0, i = 0;
+
+       hdr = (struct rtllib_hdr_4addr *)skb->data;
+       fc = le16_to_cpu(hdr->frame_ctl);
+       type = WLAN_FC_GET_TYPE(fc);
+       stype = WLAN_FC_GET_STYPE(fc);
+       sc = le16_to_cpu(hdr->seq_ctl);
+
+       /*Filter pkt not to me*/
+       multicast = is_multicast_ether_addr(hdr->addr1)|is_broadcast_ether_addr(hdr->addr1);
+       unicast = !multicast;
+       if (unicast && (compare_ether_addr(dev->dev_addr, hdr->addr1) != 0)) {
+               if (ieee->bNetPromiscuousMode)
+                       bToOtherSTA = true;
+               else
+                       goto rx_dropped;
+       }
+
+       /*Filter pkt has too small length */
+       hdrlen = rtllib_rx_get_hdrlen(ieee, skb, rx_stats);
+       if (skb->len < hdrlen){
+               printk("%s():ERR!!! skb->len is smaller than hdrlen\n",__func__);
+               goto rx_dropped;
+       }
+
+       /* Filter Duplicate pkt */
+       ret = rtllib_rx_check_duplicate(ieee, skb, multicast);
+       if (ret < 0)
+               goto rx_dropped;
+
+       /* Filter CTRL Frame */
+       if (type == RTLLIB_FTYPE_CTL) {
+               goto rx_dropped;
+       }
+
+       /* Filter MGNT Frame */
+       if (type == RTLLIB_FTYPE_MGMT) {
+               if (bToOtherSTA)
+                       goto rx_dropped;
+               if (rtllib_rx_frame_mgmt(ieee, skb, rx_stats, type, stype))
+                       goto rx_dropped;
+               else
+                       goto rx_exit;
+       }
+
+       /* Filter WAPI DATA Frame */
+
+       /* Update statstics for AP roaming */
+       if (!bToOtherSTA){
+               ieee->LinkDetectInfo.NumRecvDataInPeriod++;
+               ieee->LinkDetectInfo.NumRxOkInPeriod++;
+       }
+       dev->last_rx = jiffies;
+
+       /* Data frame - extract src/dst addresses */
+       rtllib_rx_extract_addr(ieee, hdr, dst, src, bssid);
+
+       /* Filter Data frames */
+       ret = rtllib_rx_data_filter(ieee, fc, dst, src, bssid, hdr->addr2);
+       if (ret < 0)
+               goto rx_dropped;
+
+       if (skb->len == hdrlen){
+               goto rx_dropped;
+       }
+
+       /* Send pspoll based on moredata */
+       if ((ieee->iw_mode == IW_MODE_INFRA)  && (ieee->sta_sleep == LPS_IS_SLEEP)
+               && (ieee->polling) && (!bToOtherSTA)) {
+               if (WLAN_FC_MORE_DATA(fc)) {
+                       /* more data bit is set, let's request a new frame from the AP */
+                       rtllib_sta_ps_send_pspoll_frame(ieee);
+               } else {
+                       ieee->polling =  false;
+               }
+       }
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (ieee->iw_mode == IW_MODE_ADHOC){
+               psta = GetStaInfo(ieee, src);
+               if (NULL != psta)
+                       psta->LastActiveTime = jiffies;
+       }
+#endif
+
+       /* Get crypt if encrypted */
+       ret = rtllib_rx_get_crypt(ieee, skb, &crypt, hdrlen);
+       if (ret == -1)
+               goto rx_dropped;
+
+       /* Decrypt data frame (including reassemble) */
+       ret = rtllib_rx_decrypt(ieee, skb, rx_stats, crypt, hdrlen);
+       if (ret == -1)
+               goto rx_dropped;
+       else if (ret == -2)
+               goto rx_exit;
+
+       /* Get TS for Rx Reorder  */
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       if (ieee->current_network.qos_data.active && IsQoSDataFrame(skb->data)
+               && !is_multicast_ether_addr(hdr->addr1) && !is_broadcast_ether_addr(hdr->addr1)
+               && (!bToOtherSTA))
+       {
+               TID = Frame_QoSTID(skb->data);
+               SeqNum = WLAN_GET_SEQ_SEQ(sc);
+               GetTs(ieee,(PTS_COMMON_INFO*) &pTS,hdr->addr2,TID,RX_DIR,true);
+               if (TID !=0 && TID !=3){
+                       ieee->bis_any_nonbepkts = true;
+               }
+       }
+
+       /* Parse rx data frame (For AMSDU) */
+       /* skb: hdr + (possible reassembled) full plaintext payload */
+       payload = skb->data + hdrlen;
+       rxb = (struct rtllib_rxb*)kmalloc(sizeof(struct rtllib_rxb),GFP_ATOMIC);
+       if (rxb == NULL)
+       {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR,"%s(): kmalloc rxb error\n",__func__);
+               goto rx_dropped;
+       }
+       /* to parse amsdu packets */
+       /* qos data packets & reserved bit is 1 */
+       if (parse_subframe(ieee,skb,rx_stats,rxb,src,dst) == 0) {
+               /* only to free rxb, and not submit the packets to upper layer */
+               for (i =0; i < rxb->nr_subframes; i++) {
+                       dev_kfree_skb(rxb->subframes[i]);
+               }
+               kfree(rxb);
+               rxb = NULL;
+               goto rx_dropped;
+       }
+
+       /* Update WAPI PN */
+
+       /* Check if leave LPS */
+       if (!bToOtherSTA){
+               if (ieee->bIsAggregateFrame)
+                       nr_subframes = rxb->nr_subframes;
+               else
+                       nr_subframes = 1;
+               if (unicast)
+                       ieee->LinkDetectInfo.NumRxUnicastOkInPeriod += nr_subframes;
+               rtllib_rx_check_leave_lps(ieee, unicast, nr_subframes);
+       }
+
+       /* Indicate packets to upper layer or Rx Reorder */
+       if (ieee->pHTInfo->bCurRxReorderEnable == false ||pTS == NULL || bToOtherSTA){
+               rtllib_rx_indicate_pkt_legacy(ieee, rx_stats, rxb, dst, src);
+       }else{
+#ifdef TCP_CSUM_OFFLOAD_RX
+               rxb->tcp_csum_valid = rx_stats->tcp_csum_valid;
+#endif
+               RxReorderIndicatePacket(ieee, rxb, pTS, SeqNum);
+       }
+
+       dev_kfree_skb(skb);
+
+ rx_exit:
+       return 1;
+
+ rx_dropped:
+       if (rxb != NULL)
+       {
+               kfree(rxb);
+               rxb = NULL;
+       }
+       ieee->stats.rx_dropped++;
+
+       /* Returning 0 indicates to caller that we have not handled the SKB--
+        * so it is still allocated and can be used again by underlying
+        * hardware as a DMA target */
+       return 0;
+}
+
+int rtllib_rx_Master(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       return 0;
+}
+int rtllib_rx_Monitor(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       struct rtllib_hdr_4addr *hdr = (struct rtllib_hdr_4addr *)skb->data;
+       u16 fc = le16_to_cpu(hdr->frame_ctl);
+       size_t hdrlen = rtllib_get_hdrlen(fc);
+
+       if (skb->len < hdrlen){
+               printk("%s():ERR!!! skb->len is smaller than hdrlen\n", __func__);
+               return 0;
+       }
+
+       if (HTCCheck(ieee, skb->data)) {
+               if (net_ratelimit())
+                       printk("%s: Find HTCControl!\n", __func__);
+               hdrlen += 4;
+       }
+
+#if WIRELESS_EXT > 15
+       rtllib_monitor_rx(ieee, skb, rx_stats, hdrlen);
+       ieee->stats.rx_packets++;
+       ieee->stats.rx_bytes += skb->len;
+#endif
+       return 1;
+}
+
+int rtllib_rx_Mesh(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       return 0;
+}
+
+#if 1
+/* All received frames are sent to this function. @skb contains the frame in
+ * IEEE 802.11 format, i.e., in the format it was sent over air.
+ * This function is called only as a tasklet (software IRQ). */
+int rtllib_rx(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       int ret = 0;
+
+       if ((NULL==ieee) || (NULL==skb) || (NULL==rx_stats)){
+               printk(KERN_INFO "%s: Input parameters NULL!\n", __func__);
+               goto rx_dropped;
+       }
+       if (skb->len < 10) {
+               printk(KERN_INFO "%s: SKB length < 10 \n", __func__);
+               goto rx_dropped;
+       }
+
+       switch (ieee->iw_mode) {
+       case IW_MODE_ADHOC:
+       case IW_MODE_INFRA:
+               ret = rtllib_rx_InfraAdhoc(ieee, skb, rx_stats);
+               break;
+       case IW_MODE_MASTER:
+       case IW_MODE_REPEAT:
+               ret = rtllib_rx_Master(ieee, skb, rx_stats);
+               break;
+       case IW_MODE_MONITOR:
+               ret = rtllib_rx_Monitor(ieee, skb, rx_stats);
+               break;
+       case IW_MODE_MESH:
+               ret = rtllib_rx_Mesh(ieee, skb, rx_stats);
+               break;
+       default:
+               printk(KERN_INFO"%s: ERR iw mode!!!\n", __func__);
+               break;
+       }
+
+       return ret;
+
+ rx_dropped:
+       ieee->stats.rx_dropped++;
+       return 0;
+}
+#else
+int rtllib_rx(struct rtllib_device *ieee, struct sk_buff *skb,
+                struct rtllib_rx_stats *rx_stats)
+{
+       struct net_device *dev = ieee->dev;
+       struct rtllib_hdr_4addr *hdr;
+       size_t hdrlen;
+       u16 fc, type, stype, sc;
+       struct net_device_stats *stats = NULL;
+       unsigned int frag;
+       u8 *payload;
+       u16 ethertype;
+       u8      TID = 0;
+       u16     SeqNum = 0;
+       PRX_TS_RECORD pTS = NULL;
+#ifdef NOT_YET
+       struct net_device *wds = NULL;
+       struct sk_buff *skb2 = NULL;
+       struct net_device *wds = NULL;
+       int frame_authorized = 0;
+       int from_assoc_ap = 0;
+       void *sta = NULL;
+#endif
+       u8 dst[ETH_ALEN];
+       u8 src[ETH_ALEN];
+       u8 bssid[ETH_ALEN] = {0};
+       u8 zero_addr[ETH_ALEN] = {0};
+       struct rtllib_crypt_data *crypt = NULL;
+       int keyidx = 0;
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       struct sta_info * psta = NULL;
+#endif
+       bool unicast_packet = false;
+       int i;
+       struct rtllib_rxb* rxb = NULL;
+       int multicast = 0;
+       bool tmp_dump = false;
+       bool bToOtherSTA = false;
+       hdr = (struct rtllib_hdr_4addr *)skb->data;
+       stats = &ieee->stats;
+
+       multicast = is_multicast_ether_addr(hdr->addr1)|is_broadcast_ether_addr(hdr->addr1);
+       if (!multicast && (compare_ether_addr(dev->dev_addr, hdr->addr1) != 0)) {
+               if ((ieee->iw_mode == IW_MODE_MONITOR) || ieee->bNetPromiscuousMode){
+                       bToOtherSTA = true;
+               }else{
+                       goto rx_dropped;
+               }
+       }
+
+       fc = le16_to_cpu(hdr->frame_ctl);
+       type = WLAN_FC_GET_TYPE(fc);
+       stype = WLAN_FC_GET_STYPE(fc);
+       sc = le16_to_cpu(hdr->seq_ctl);
+       frag = WLAN_GET_SEQ_FRAG(sc);
+
+       ieee->need_sw_enc = 0;
+
+       hdrlen = rtllib_get_hdrlen(fc);
+       if (skb->len < hdrlen){
+               printk("%s():ERR!!! skb->len is smaller than hdrlen\n",__func__);
+               goto rx_dropped;
+       }
+
+       if (HTCCheck(ieee, skb->data)) {
+               if (net_ratelimit())
+                       printk("find HTCControl\n");
+               hdrlen += 4;
+               rx_stats->bContainHTC = 1;
+       }
+       if (RTLLIB_QOS_HAS_SEQ(fc))
+               rx_stats->bIsQosData = 1;
+       if ((0) && (type == RTLLIB_FTYPE_DATA) && ((is_broadcast_ether_addr(hdr->addr1)) || (compare_ether_addr(dev->dev_addr, hdr->addr1) == 0))) {
+               printk("===>RX data before decrypt\n");
+               tmp_dump = true;
+               dump_buf(skb->data,skb->len);
+       }
+#ifdef NOT_YET
+       hostap_update_rx_stats(local->ap, hdr, rx_stats);
+#endif
+
+       if (ieee->host_decrypt) {
+               int idx = 0;
+               if (skb->len >= hdrlen + 3)
+                       idx = skb->data[hdrlen + 3] >> 6;
+               crypt = ieee->crypt[idx];
+#ifdef NOT_YET
+               sta = NULL;
+
+               /* Use station specific key to override default keys if the
+                * receiver address is a unicast address ("individual RA"). If
+                * bcrx_sta_key parameter is set, station specific key is used
+                * even with broad/multicast targets (this is against IEEE
+                * 802.11, but makes it easier to use different keys with
+                * stations that do not support WEP key mapping). */
+
+               if (!(hdr->addr1[0] & 0x01) || local->bcrx_sta_key)
+                       (void) hostap_handle_sta_crypto(local, hdr, &crypt,
+                                                       &sta);
+#endif
+
+               /* allow NULL decrypt to indicate an station specific override
+                * for default encryption */
+               if (crypt && (crypt->ops == NULL ||
+                             crypt->ops->decrypt_mpdu == NULL))
+                       crypt = NULL;
+
+               if (!crypt && (fc & RTLLIB_FCTL_WEP)) {
+                       /* This seems to be triggered by some (multicast?)
+                        * frames from other than current BSS, so just drop the
+                        * frames silently instead of filling system log with
+                        * these reports. */
+                       RTLLIB_DEBUG_DROP("Decryption failed (not set)"
+                                            " (SA=" MAC_FMT ")\n",
+                                            MAC_ARG(hdr->addr2));
+                       ieee->ieee_stats.rx_discards_undecryptable++;
+                       goto rx_dropped;
+               }
+       }
+
+       if (skb->len < RTLLIB_DATA_HDR3_LEN)
+               goto rx_dropped;
+
+       if ( (ieee->pHTInfo->bCurRxReorderEnable == false) ||
+               !ieee->current_network.qos_data.active ||
+               !IsDataFrame(skb->data) ||
+               IsLegacyDataFrame(skb->data)) {
+               if (!((type == RTLLIB_FTYPE_MGMT) && (stype == RTLLIB_STYPE_BEACON))){
+                       if (is_duplicate_packet(ieee, hdr)){
+                               goto rx_dropped;
+                       }
+               }
+       } else {
+               PRX_TS_RECORD pRxTS = NULL;
+               if (GetTs(ieee, (PTS_COMMON_INFO*) &pRxTS, hdr->addr2,
+                       (u8)Frame_QoSTID((u8*)(skb->data)), RX_DIR, true)) {
+                       if ((fc & (1<<11)) && (frag == pRxTS->RxLastFragNum) &&
+                           (WLAN_GET_SEQ_SEQ(sc) == pRxTS->RxLastSeqNum)) {
+                               goto rx_dropped;
+                       } else {
+                               pRxTS->RxLastFragNum = frag;
+                               pRxTS->RxLastSeqNum = WLAN_GET_SEQ_SEQ(sc);
+                       }
+               } else {
+                       RTLLIB_DEBUG(RTLLIB_DL_ERR, "ERR!!%s(): No TS!! Skip the check!!\n",__func__);
+                       goto rx_dropped;
+               }
+       }
+       if (type == RTLLIB_FTYPE_MGMT) {
+               if (bToOtherSTA)
+                       goto rx_dropped;
+               if (rtllib_rx_frame_mgmt(ieee, skb, rx_stats, type, stype))
+                       goto rx_dropped;
+               else
+                       goto rx_exit;
+       }
+       if (type == RTLLIB_FTYPE_CTL) {
+               goto rx_dropped;
+       }
+       /* Data frame - extract src/dst addresses */
+       switch (fc & (RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS)) {
+       case RTLLIB_FCTL_FROMDS:
+               memcpy(dst, hdr->addr1, ETH_ALEN);
+               memcpy(src, hdr->addr3, ETH_ALEN);
+               memcpy(bssid, hdr->addr2, ETH_ALEN);
+               break;
+       case RTLLIB_FCTL_TODS:
+               memcpy(dst, hdr->addr3, ETH_ALEN);
+               memcpy(src, hdr->addr2, ETH_ALEN);
+               memcpy(bssid, hdr->addr1, ETH_ALEN);
+               break;
+       case RTLLIB_FCTL_FROMDS | RTLLIB_FCTL_TODS:
+               if (skb->len < RTLLIB_DATA_HDR4_LEN)
+                       goto rx_dropped;
+               memcpy(dst, hdr->addr3, ETH_ALEN);
+               memcpy(src, hdr->addr4, ETH_ALEN);
+               memcpy(bssid, ieee->current_network.bssid, ETH_ALEN);
+               break;
+       case 0:
+               memcpy(dst, hdr->addr1, ETH_ALEN);
+               memcpy(src, hdr->addr2, ETH_ALEN);
+               memcpy(bssid, hdr->addr3, ETH_ALEN);
+               break;
+       }
+
+       /* Filter frames from different BSS */
+       if ((type != RTLLIB_FTYPE_CTL) && ((fc & RTLLIB_FCTL_DSTODS) != RTLLIB_FCTL_DSTODS)
+                && (compare_ether_addr(ieee->current_network.bssid, bssid) != 0) && memcmp(ieee->current_network.bssid, zero_addr, ETH_ALEN)) {
+               goto rx_dropped;
+       }
+
+       /* Filter packets sent by an STA that will be forwarded by AP */
+       if ( ieee->IntelPromiscuousModeInfo.bPromiscuousOn  &&
+                ieee->IntelPromiscuousModeInfo.bFilterSourceStationFrame ) {
+               if ((fc & RTLLIB_FCTL_TODS) && !(fc & RTLLIB_FCTL_FROMDS) &&
+                       (compare_ether_addr(dst, ieee->current_network.bssid) != 0) &&
+                       (compare_ether_addr(bssid, ieee->current_network.bssid) == 0)) {
+                       goto rx_dropped;
+               }
+       }
+
+#ifdef NOT_YET
+       if (hostap_rx_frame_wds(ieee, hdr, fc, &wds))
+               goto rx_dropped;
+       if (wds) {
+               skb->dev = dev = wds;
+               stats = hostap_get_stats(dev);
+       }
+
+       if (ieee->iw_mode == IW_MODE_MASTER && !wds &&
+           (fc & (RTLLIB_FCTL_TODS | RTLLIB_FCTL_FROMDS)) == RTLLIB_FCTL_FROMDS &&
+           ieee->stadev &&
+           memcmp(hdr->addr2, ieee->assoc_ap_addr, ETH_ALEN) == 0) {
+               /* Frame from BSSID of the AP for which we are a client */
+               skb->dev = dev = ieee->stadev;
+               stats = hostap_get_stats(dev);
+               from_assoc_ap = 1;
+       }
+#endif
+
+       dev->last_rx = jiffies;
+
+#ifdef NOT_YET
+       if ((ieee->iw_mode == IW_MODE_MASTER ||
+            ieee->iw_mode == IW_MODE_REPEAT) &&
+           !from_assoc_ap) {
+               switch (hostap_handle_sta_rx(ieee, dev, skb, rx_stats,
+                                            wds != NULL)) {
+               case AP_RX_CONTINUE_NOT_AUTHORIZED:
+                       frame_authorized = 0;
+                       break;
+               case AP_RX_CONTINUE:
+                       frame_authorized = 1;
+                       break;
+               case AP_RX_DROP:
+                       goto rx_dropped;
+               case AP_RX_EXIT:
+                       goto rx_exit;
+               }
+       }
+#endif
+       /* Nullfunc frames may have PS-bit set, so they must be passed to
+        * hostap_handle_sta_rx() before being dropped here. */
+       if (stype != RTLLIB_STYPE_DATA &&
+           stype != RTLLIB_STYPE_DATA_CFACK &&
+           stype != RTLLIB_STYPE_DATA_CFPOLL &&
+           stype != RTLLIB_STYPE_DATA_CFACKPOLL&&
+           stype != RTLLIB_STYPE_QOS_DATA
+           ) {
+               if (stype != RTLLIB_STYPE_NULLFUNC)
+                       RTLLIB_DEBUG_DROP(
+                               "RX: dropped data frame "
+                               "with no data (type=0x%02x, "
+                               "subtype=0x%02x, len=%d)\n",
+                               type, stype, skb->len);
+               goto rx_dropped;
+       }
+
+       if (skb->len == hdrlen){
+               goto rx_dropped;
+       }
+
+       {
+               /* network filter more precisely */
+               switch (ieee->iw_mode) {
+               case IW_MODE_ADHOC:
+                       /* packets from our adapter are dropped (echo) */
+                       if (!memcmp(hdr->addr2, dev->dev_addr, ETH_ALEN))
+                               goto rx_dropped;
+
+                       /* {broad,multi}cast packets to our BSSID go through */
+                       if (is_multicast_ether_addr(hdr->addr1)) {
+                               if (!memcmp(hdr->addr3, ieee->current_network.bssid, ETH_ALEN))
+                                       break;
+                               else
+                                       goto rx_dropped;
+                       }
+
+                       /* packets not to our adapter, just discard it */
+                       if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) {
+                               if (bToOtherSTA)
+                                       break;
+                               else
+                                       goto rx_dropped;
+                       }
+
+                       break;
+
+               case IW_MODE_INFRA:
+                       /* packets from our adapter are dropped (echo) */
+                       if (!memcmp(hdr->addr3, dev->dev_addr, ETH_ALEN))
+                               goto rx_dropped;
+
+                       /* {broad,multi}cast packets to our BSS go through */
+                       if (is_multicast_ether_addr(hdr->addr1)) {
+                               if (!memcmp(hdr->addr2, ieee->current_network.bssid, ETH_ALEN))
+                                       break;
+                               else
+                                       goto rx_dropped;
+                       }
+
+                       /* packets to our adapter go through */
+                       if (memcmp(hdr->addr1, dev->dev_addr, ETH_ALEN)) {
+                               if (bToOtherSTA)
+                                       break;
+                               else
+                                       goto rx_dropped;
+                       }
+
+                       break;
+               }
+
+
+       }
+
+       if ((ieee->iw_mode == IW_MODE_INFRA)  && (ieee->sta_sleep == LPS_IS_SLEEP)
+               && (ieee->polling)) {
+               if (WLAN_FC_MORE_DATA(fc)) {
+                       /* more data bit is set, let's request a new frame from the AP */
+                       rtllib_sta_ps_send_pspoll_frame(ieee);
+               } else {
+                       ieee->polling =  false;
+               }
+       }
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (ieee->iw_mode == IW_MODE_ADHOC){
+               psta = GetStaInfo(ieee, src);
+               if (NULL != psta)
+                       psta->LastActiveTime = jiffies;
+       }
+#endif
+       /* skb: hdr + (possibly fragmented, possibly encrypted) payload */
+       if ((!rx_stats->Decrypted)){
+               ieee->need_sw_enc = 1;
+       }
+
+       if (ieee->host_decrypt && (fc & RTLLIB_FCTL_WEP) &&
+           ((keyidx = rtllib_rx_frame_decrypt(ieee, skb, crypt)) < 0)) {
+               printk("decrypt frame error\n");
+               goto rx_dropped;
+       }
+       if (tmp_dump) {
+               printk("************after decrypt\n");
+               dump_buf(skb->data,skb->len);
+       }
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+
+       /* skb: hdr + (possibly fragmented) plaintext payload */
+       if ((frag != 0 || (fc & RTLLIB_FCTL_MOREFRAGS))) {
+               int flen;
+               struct sk_buff *frag_skb = rtllib_frag_cache_get(ieee, hdr);
+               RTLLIB_DEBUG_FRAG("Rx Fragment received (%u)\n", frag);
+
+               if (!frag_skb) {
+                       RTLLIB_DEBUG(RTLLIB_DL_RX | RTLLIB_DL_FRAG,
+                                       "Rx cannot get skb from fragment "
+                                       "cache (morefrag=%d seq=%u frag=%u)\n",
+                                       (fc & RTLLIB_FCTL_MOREFRAGS) != 0,
+                                       WLAN_GET_SEQ_SEQ(sc), frag);
+                       goto rx_dropped;
+               }
+               flen = skb->len;
+               if (frag != 0)
+                       flen -= hdrlen;
+
+               if (frag_skb->tail + flen > frag_skb->end) {
+                       printk(KERN_WARNING "%s: host decrypted and "
+                              "reassembled frame did not fit skb\n",
+                              dev->name);
+                       rtllib_frag_cache_invalidate(ieee, hdr);
+                       goto rx_dropped;
+               }
+
+               if (frag == 0) {
+                       /* copy first fragment (including full headers) into
+                        * beginning of the fragment cache skb */
+                       memcpy(skb_put(frag_skb, flen), skb->data, flen);
+               } else {
+                       /* append frame payload to the end of the fragment
+                        * cache skb */
+                       memcpy(skb_put(frag_skb, flen), skb->data + hdrlen,
+                              flen);
+               }
+               dev_kfree_skb_any(skb);
+               skb = NULL;
+
+               if (fc & RTLLIB_FCTL_MOREFRAGS) {
+                       /* more fragments expected - leave the skb in fragment
+                        * cache for now; it will be delivered to upper layers
+                        * after all fragments have been received */
+                       goto rx_exit;
+               }
+
+               /* this was the last fragment and the frame will be
+                * delivered, so remove skb from fragment cache */
+               skb = frag_skb;
+               hdr = (struct rtllib_hdr_4addr *) skb->data;
+               rtllib_frag_cache_invalidate(ieee, hdr);
+       }
+
+       /* skb: hdr + (possible reassembled) full MSDU payload; possibly still
+        * encrypted/authenticated */
+       if (ieee->host_decrypt && (fc & RTLLIB_FCTL_WEP) &&
+           rtllib_rx_frame_decrypt_msdu(ieee, skb, keyidx, crypt)) {
+               printk("==>decrypt msdu error\n");
+               goto rx_dropped;
+       }
+
+       ieee->LinkDetectInfo.NumRecvDataInPeriod++;
+       ieee->LinkDetectInfo.NumRxOkInPeriod++;
+
+       hdr = (struct rtllib_hdr_4addr *) skb->data;
+       if ((!is_multicast_ether_addr(hdr->addr1)) && (!is_broadcast_ether_addr(hdr->addr1)))
+               unicast_packet = true;
+       if (crypt && !(fc & RTLLIB_FCTL_WEP) && !ieee->open_wep) {
+               if (/*ieee->ieee802_1x &&*/
+                   rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+
+#ifdef CONFIG_RTLLIB_DEBUG
+                       /* pass unencrypted EAPOL frames even if encryption is
+                        * configured */
+                       struct eapol *eap = (struct eapol *)(skb->data +
+                               24);
+                       RTLLIB_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
+                                               eap_get_type(eap->type));
+#endif
+               } else {
+                       RTLLIB_DEBUG_DROP(
+                               "encryption configured, but RX "
+                               "frame not encrypted (SA=" MAC_FMT ")\n",
+                               MAC_ARG(hdr->addr2));
+                       goto rx_dropped;
+               }
+       }
+
+#ifdef CONFIG_RTLLIB_DEBUG
+       if (crypt && !(fc & RTLLIB_FCTL_WEP) &&
+           rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+                       struct eapol *eap = (struct eapol *)(skb->data +
+                               24);
+                       RTLLIB_DEBUG_EAP("RX: IEEE 802.1X EAPOL frame: %s\n",
+                                               eap_get_type(eap->type));
+       }
+#endif
+
+       if (crypt && !(fc & RTLLIB_FCTL_WEP) && !ieee->open_wep &&
+           !rtllib_is_eapol_frame(ieee, skb, hdrlen)) {
+               RTLLIB_DEBUG_DROP(
+                       "dropped unencrypted RX data "
+                       "frame from " MAC_FMT
+                       " (drop_unencrypted=1)\n",
+                       MAC_ARG(hdr->addr2));
+               goto rx_dropped;
+       }
+       if (ieee->current_network.qos_data.active && IsQoSDataFrame(skb->data)
+           && !is_multicast_ether_addr(hdr->addr1) && !is_broadcast_ether_addr(hdr->addr1)) {
+               TID = Frame_QoSTID(skb->data);
+               SeqNum = WLAN_GET_SEQ_SEQ(sc);
+               GetTs(ieee,(PTS_COMMON_INFO*) &pTS,hdr->addr2,TID,RX_DIR,true);
+               if (TID !=0 && TID !=3)
+                       ieee->bis_any_nonbepkts = true;
+       }
+       /* skb: hdr + (possible reassembled) full plaintext payload */
+       payload = skb->data + hdrlen;
+       rxb = (struct rtllib_rxb*)kmalloc(sizeof(struct rtllib_rxb),GFP_ATOMIC);
+       if (rxb == NULL) {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR,"%s(): kmalloc rxb error\n",__func__);
+               goto rx_dropped;
+       }
+       /* to parse amsdu packets */
+       /* qos data packets & reserved bit is 1 */
+       if (parse_subframe(ieee,skb,rx_stats,rxb,src,dst) == 0) {
+               /* only to free rxb, and not submit the packets to upper layer */
+               for (i =0; i < rxb->nr_subframes; i++) {
+                       dev_kfree_skb(rxb->subframes[i]);
+               }
+               kfree(rxb);
+               rxb = NULL;
+               goto rx_dropped;
+       }
+#if !defined(RTL8192SU) && !defined(RTL8192U)
+               if (unicast_packet) {
+                       if (type == RTLLIB_FTYPE_DATA) {
+                               if (ieee->bIsAggregateFrame)
+                                       ieee->LinkDetectInfo.NumRxUnicastOkInPeriod+=rxb->nr_subframes;
+                               else
+                                       ieee->LinkDetectInfo.NumRxUnicastOkInPeriod++;
+
+                               if ((ieee->state == RTLLIB_LINKED) /*&& !MgntInitAdapterInProgress(pMgntInfo)*/) {
+                                       if (((ieee->LinkDetectInfo.NumRxUnicastOkInPeriod +ieee->LinkDetectInfo.NumTxOkInPeriod) > 8 ) ||
+                                          (ieee->LinkDetectInfo.NumRxUnicastOkInPeriod > 2)) {
+                                               if (ieee->LeisurePSLeave)
+                                                       ieee->LeisurePSLeave(dev);
+                                       }
+                               }
+                       }
+               }
+#endif
+               ieee->last_rx_ps_time = jiffies;
+               if (ieee->pHTInfo->bCurRxReorderEnable == false ||pTS == NULL || bToOtherSTA ){
+                       for (i = 0; i<rxb->nr_subframes; i++) {
+                               struct sk_buff *sub_skb = rxb->subframes[i];
+
+                               if (sub_skb) {
+                                       /* convert hdr + possible LLC headers into Ethernet header */
+                                       ethertype = (sub_skb->data[6] << 8) | sub_skb->data[7];
+                                       if (sub_skb->len >= 8 &&
+                                                       ((memcmp(sub_skb->data, rfc1042_header, SNAP_SIZE) == 0 &&
+                                                         ethertype != ETH_P_AARP && ethertype != ETH_P_IPX) ||
+                                                        memcmp(sub_skb->data, bridge_tunnel_header, SNAP_SIZE) == 0)) {
+                                               /* remove RFC1042 or Bridge-Tunnel encapsulation and
+                                                * replace EtherType */
+                                               skb_pull(sub_skb, SNAP_SIZE);
+                                               memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
+                                               memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
+                                       } else {
+                                               u16 len;
+                                               /* Leave Ethernet header part of hdr and full payload */
+                                               len = htons(sub_skb->len);
+                                               memcpy(skb_push(sub_skb, 2), &len, 2);
+                                               memcpy(skb_push(sub_skb, ETH_ALEN), src, ETH_ALEN);
+                                               memcpy(skb_push(sub_skb, ETH_ALEN), dst, ETH_ALEN);
+                                       }
+
+                                       stats->rx_packets++;
+                                       stats->rx_bytes += sub_skb->len;
+
+                                       if (is_multicast_ether_addr(dst)) {
+                                               stats->multicast++;
+                                       }
+
+                                       /* Indicat the packets to upper layer */
+                                       memset(sub_skb->cb, 0, sizeof(sub_skb->cb));
+                                       sub_skb->protocol = eth_type_trans(sub_skb, dev);
+                                       sub_skb->dev = dev;
+                                       sub_skb->dev->stats.rx_packets++;
+                                       sub_skb->dev->stats.rx_bytes += sub_skb->len;
+#ifdef TCP_CSUM_OFFLOAD_RX
+                                       if ( rx_stats->tcp_csum_valid)
+                                               sub_skb->ip_summed = CHECKSUM_UNNECESSARY;
+                                       else
+                                               sub_skb->ip_summed = CHECKSUM_NONE;
+#else
+                                       sub_skb->ip_summed = CHECKSUM_NONE; /* 802.11 crc not sufficient */
+#endif
+
+                                       netif_rx(sub_skb);
+                               }
+                       }
+                       kfree(rxb);
+                       rxb = NULL;
+
+               }
+               else
+               {
+                       RTLLIB_DEBUG(RTLLIB_DL_REORDER,"%s(): REORDER ENABLE AND PTS not NULL, and we will enter RxReorderIndicatePacket()\n",__func__);
+#ifdef TCP_CSUM_OFFLOAD_RX
+                       rxb->tcp_csum_valid = rx_stats->tcp_csum_valid;
+#endif
+                       RxReorderIndicatePacket(ieee, rxb, pTS, SeqNum);
+               }
+#ifndef JOHN_NOCPY
+       dev_kfree_skb(skb);
+#endif
+
+ rx_exit:
+#ifdef NOT_YET
+       if (sta)
+               hostap_handle_sta_release(sta);
+#endif
+       return 1;
+
+ rx_dropped:
+       if (rxb != NULL)
+       {
+               kfree(rxb);
+               rxb = NULL;
+       }
+       stats->rx_dropped++;
+
+       /* Returning 0 indicates to caller that we have not handled the SKB--
+        * so it is still allocated and can be used again by underlying
+        * hardware as a DMA target */
+       return 0;
+}
+#endif
+
+#define MGMT_FRAME_FIXED_PART_LENGTH            0x24
+
+static u8 qos_oui[QOS_OUI_LEN] = { 0x00, 0x50, 0xF2 };
+
+/*
+* Make ther structure we read from the beacon packet has
+* the right values
+*/
+static int rtllib_verify_qos_info(struct rtllib_qos_information_element
+                                     *info_element, int sub_type)
+{
+
+        if (info_element->qui_subtype != sub_type)
+                return -1;
+        if (memcmp(info_element->qui, qos_oui, QOS_OUI_LEN))
+                return -1;
+        if (info_element->qui_type != QOS_OUI_TYPE)
+                return -1;
+        if (info_element->version != QOS_VERSION_1)
+                return -1;
+
+        return 0;
+}
+
+
+/*
+ * Parse a QoS parameter element
+ */
+static int rtllib_read_qos_param_element(struct rtllib_qos_parameter_info
+                                            *element_param, struct rtllib_info_element
+                                            *info_element)
+{
+        int ret = 0;
+        u16 size = sizeof(struct rtllib_qos_parameter_info) - 2;
+
+        if ((info_element == NULL) || (element_param == NULL))
+                return -1;
+
+        if (info_element->id == QOS_ELEMENT_ID && info_element->len == size) {
+                memcpy(element_param->info_element.qui, info_element->data,
+                       info_element->len);
+                element_param->info_element.elementID = info_element->id;
+                element_param->info_element.length = info_element->len;
+        } else
+                ret = -1;
+        if (ret == 0)
+                ret = rtllib_verify_qos_info(&element_param->info_element,
+                                                QOS_OUI_PARAM_SUB_TYPE);
+        return ret;
+}
+
+/*
+ * Parse a QoS information element
+ */
+static int rtllib_read_qos_info_element(struct
+                                           rtllib_qos_information_element
+                                           *element_info, struct rtllib_info_element
+                                           *info_element)
+{
+        int ret = 0;
+        u16 size = sizeof(struct rtllib_qos_information_element) - 2;
+
+        if (element_info == NULL)
+                return -1;
+        if (info_element == NULL)
+                return -1;
+
+        if ((info_element->id == QOS_ELEMENT_ID) && (info_element->len == size)) {
+                memcpy(element_info->qui, info_element->data,
+                       info_element->len);
+                element_info->elementID = info_element->id;
+                element_info->length = info_element->len;
+        } else
+                ret = -1;
+
+        if (ret == 0)
+                ret = rtllib_verify_qos_info(element_info,
+                                                QOS_OUI_INFO_SUB_TYPE);
+        return ret;
+}
+
+
+/*
+ * Write QoS parameters from the ac parameters.
+ */
+static int rtllib_qos_convert_ac_to_parameters(struct rtllib_qos_parameter_info *param_elm,
+               struct rtllib_qos_data *qos_data)
+{
+        struct rtllib_qos_ac_parameter *ac_params;
+       struct rtllib_qos_parameters *qos_param = &(qos_data->parameters);
+        int rc = 0;
+        int i;
+       u8 aci;
+       u8 acm;
+
+       qos_data->wmm_acm = 0;
+        for (i = 0; i < QOS_QUEUE_NUM; i++) {
+                ac_params = &(param_elm->ac_params_record[i]);
+
+               aci = (ac_params->aci_aifsn & 0x60) >> 5;
+               acm = (ac_params->aci_aifsn & 0x10) >> 4;
+
+               if (aci >= QOS_QUEUE_NUM)
+                       continue;
+               switch (aci) {
+                       case 1:
+                               /* BIT(0) | BIT(3) */
+                               if (acm)
+                                       qos_data->wmm_acm |= (0x01<<0)|(0x01<<3);
+                               break;
+                       case 2:
+                               /* BIT(4) | BIT(5) */
+                               if (acm)
+                                       qos_data->wmm_acm |= (0x01<<4)|(0x01<<5);
+                               break;
+                       case 3:
+                               /* BIT(6) | BIT(7) */
+                               if (acm)
+                                       qos_data->wmm_acm |= (0x01<<6)|(0x01<<7);
+                               break;
+                       case 0:
+                       default:
+                               /* BIT(1) | BIT(2) */
+                               if (acm)
+                                       qos_data->wmm_acm |= (0x01<<1)|(0x01<<2);
+                               break;
+               }
+
+                qos_param->aifs[aci] = (ac_params->aci_aifsn) & 0x0f;
+
+               /* WMM spec P.11: The minimum value for AIFSN shall be 2 */
+                qos_param->aifs[aci] = (qos_param->aifs[aci] < 2) ? 2:qos_param->aifs[aci];
+
+                qos_param->cw_min[aci] = ac_params->ecw_min_max & 0x0F;
+
+                qos_param->cw_max[aci] = (ac_params->ecw_min_max & 0xF0) >> 4;
+
+                qos_param->flag[aci] =
+                    (ac_params->aci_aifsn & 0x10) ? 0x01 : 0x00;
+                qos_param->tx_op_limit[aci] = le16_to_cpu(ac_params->tx_op_limit);
+        }
+        return rc;
+}
+
+/*
+ * we have a generic data element which it may contain QoS information or
+ * parameters element. check the information element length to decide
+ * which type to read
+ */
+static int rtllib_parse_qos_info_param_IE(struct rtllib_info_element
+                                             *info_element,
+                                             struct rtllib_network *network)
+{
+        int rc = 0;
+        struct rtllib_qos_information_element qos_info_element;
+
+        rc = rtllib_read_qos_info_element(&qos_info_element, info_element);
+
+        if (rc == 0) {
+                network->qos_data.param_count = qos_info_element.ac_info & 0x0F;
+                network->flags |= NETWORK_HAS_QOS_INFORMATION;
+        } else {
+                struct rtllib_qos_parameter_info param_element;
+
+                rc = rtllib_read_qos_param_element(&param_element,
+                                                      info_element);
+                if (rc == 0) {
+                        rtllib_qos_convert_ac_to_parameters(&param_element,
+                                                               &(network->qos_data));
+                        network->flags |= NETWORK_HAS_QOS_PARAMETERS;
+                        network->qos_data.param_count =
+                            param_element.info_element.ac_info & 0x0F;
+                }
+        }
+
+        if (rc == 0) {
+                RTLLIB_DEBUG_QOS("QoS is supported\n");
+                network->qos_data.supported = 1;
+        }
+        return rc;
+}
+
+#ifdef CONFIG_RTLLIB_DEBUG
+#define MFIE_STRING(x) case MFIE_TYPE_ ##x: return #x
+
+static const char *get_info_element_string(u16 id)
+{
+        switch (id) {
+                MFIE_STRING(SSID);
+                MFIE_STRING(RATES);
+                MFIE_STRING(FH_SET);
+                MFIE_STRING(DS_SET);
+                MFIE_STRING(CF_SET);
+                MFIE_STRING(TIM);
+                MFIE_STRING(IBSS_SET);
+                MFIE_STRING(COUNTRY);
+                MFIE_STRING(HOP_PARAMS);
+                MFIE_STRING(HOP_TABLE);
+                MFIE_STRING(REQUEST);
+                MFIE_STRING(CHALLENGE);
+                MFIE_STRING(POWER_CONSTRAINT);
+                MFIE_STRING(POWER_CAPABILITY);
+                MFIE_STRING(TPC_REQUEST);
+                MFIE_STRING(TPC_REPORT);
+                MFIE_STRING(SUPP_CHANNELS);
+                MFIE_STRING(CSA);
+                MFIE_STRING(MEASURE_REQUEST);
+                MFIE_STRING(MEASURE_REPORT);
+                MFIE_STRING(QUIET);
+                MFIE_STRING(IBSS_DFS);
+                MFIE_STRING(RSN);
+                MFIE_STRING(RATES_EX);
+                MFIE_STRING(GENERIC);
+                MFIE_STRING(QOS_PARAMETER);
+        default:
+                return "UNKNOWN";
+        }
+}
+#endif
+
+#ifdef ENABLE_DOT11D
+static inline void rtllib_extract_country_ie(
+       struct rtllib_device *ieee,
+       struct rtllib_info_element *info_element,
+       struct rtllib_network *network,
+       u8 * addr2)
+{
+       if (IS_DOT11D_ENABLE(ieee)) {
+               if (info_element->len!= 0) {
+                       memcpy(network->CountryIeBuf, info_element->data, info_element->len);
+                       network->CountryIeLen = info_element->len;
+
+                       if (!IS_COUNTRY_IE_VALID(ieee))
+                       {
+                               if ((rtllib_act_scanning(ieee,false) == true) && (ieee->FirstIe_InScan == 1))
+                                       printk("Received beacon ContryIE, SSID: <%s>\n",network->ssid);
+                               Dot11d_UpdateCountryIe(ieee, addr2, info_element->len, info_element->data);
+                       }
+               }
+
+               if (IS_EQUAL_CIE_SRC(ieee, addr2)) {
+                       UPDATE_CIE_WATCHDOG(ieee);
+               }
+       }
+
+}
+#endif
+
+int rtllib_parse_info_param(struct rtllib_device *ieee,
+               struct rtllib_info_element *info_element,
+               u16 length,
+               struct rtllib_network *network,
+               struct rtllib_rx_stats *stats)
+{
+       u8 i;
+       short offset;
+        u16    tmp_htcap_len=0;
+       u16     tmp_htinfo_len=0;
+       u16 ht_realtek_agg_len=0;
+       u8  ht_realtek_agg_buf[MAX_IE_LEN];
+#ifdef CONFIG_RTLLIB_DEBUG
+       char rates_str[64];
+       char *p;
+#endif
+       while (length >= sizeof(*info_element)) {
+               if (sizeof(*info_element) + info_element->len > length) {
+                       RTLLIB_DEBUG_MGMT("Info elem: parse failed: "
+                                            "info_element->len + 2 > left : "
+                                            "info_element->len+2=%zd left=%d, id=%d.\n",
+                                            info_element->len +
+                                            sizeof(*info_element),
+                                            length, info_element->id);
+                       /* We stop processing but don't return an error here
+                        * because some misbehaviour APs break this rule. ie.
+                        * Orinoco AP1000. */
+                       break;
+               }
+
+               switch (info_element->id) {
+               case MFIE_TYPE_SSID:
+                       if (rtllib_is_empty_essid(info_element->data,
+                                                    info_element->len)) {
+                               network->flags |= NETWORK_EMPTY_ESSID;
+                               break;
+                       }
+
+                       network->ssid_len = min(info_element->len,
+                                               (u8) IW_ESSID_MAX_SIZE);
+                       memcpy(network->ssid, info_element->data, network->ssid_len);
+                       if (network->ssid_len < IW_ESSID_MAX_SIZE)
+                               memset(network->ssid + network->ssid_len, 0,
+                                      IW_ESSID_MAX_SIZE - network->ssid_len);
+
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_SSID: '%s' len=%d.\n",
+                                            network->ssid, network->ssid_len);
+                       break;
+
+               case MFIE_TYPE_RATES:
+#ifdef CONFIG_RTLLIB_DEBUG
+                       p = rates_str;
+#endif
+                       network->rates_len = min(info_element->len,
+                                                MAX_RATES_LENGTH);
+                       for (i = 0; i < network->rates_len; i++) {
+                               network->rates[i] = info_element->data[i];
+#ifdef CONFIG_RTLLIB_DEBUG
+                               p += snprintf(p, sizeof(rates_str) -
+                                             (p - rates_str), "%02X ",
+                                             network->rates[i]);
+#endif
+                               if (rtllib_is_ofdm_rate
+                                   (info_element->data[i])) {
+                                       network->flags |= NETWORK_HAS_OFDM;
+                                       if (info_element->data[i] &
+                                           RTLLIB_BASIC_RATE_MASK)
+                                               network->flags &=
+                                                   ~NETWORK_HAS_CCK;
+                               }
+
+                               if (rtllib_is_cck_rate
+                                   (info_element->data[i])) {
+                                       network->flags |= NETWORK_HAS_CCK;
+                               }
+                       }
+
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_RATES: '%s' (%d)\n",
+                                            rates_str, network->rates_len);
+                       break;
+
+               case MFIE_TYPE_RATES_EX:
+#ifdef CONFIG_RTLLIB_DEBUG
+                       p = rates_str;
+#endif
+                       network->rates_ex_len = min(info_element->len,
+                                                   MAX_RATES_EX_LENGTH);
+                       for (i = 0; i < network->rates_ex_len; i++) {
+                               network->rates_ex[i] = info_element->data[i];
+#ifdef CONFIG_RTLLIB_DEBUG
+                               p += snprintf(p, sizeof(rates_str) -
+                                             (p - rates_str), "%02X ",
+                                             network->rates[i]);
+#endif
+                               if (rtllib_is_ofdm_rate
+                                   (info_element->data[i])) {
+                                       network->flags |= NETWORK_HAS_OFDM;
+                                       if (info_element->data[i] &
+                                           RTLLIB_BASIC_RATE_MASK)
+                                               network->flags &=
+                                                   ~NETWORK_HAS_CCK;
+                               }
+                       }
+
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_RATES_EX: '%s' (%d)\n",
+                                            rates_str, network->rates_ex_len);
+                       break;
+
+               case MFIE_TYPE_DS_SET:
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_DS_SET: %d\n",
+                                            info_element->data[0]);
+                       network->channel = info_element->data[0];
+                       break;
+
+               case MFIE_TYPE_FH_SET:
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_FH_SET: ignored\n");
+                       break;
+
+               case MFIE_TYPE_CF_SET:
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_CF_SET: ignored\n");
+                       break;
+
+               case MFIE_TYPE_TIM:
+                       if (info_element->len < 4)
+                               break;
+
+                       network->tim.tim_count = info_element->data[0];
+                       network->tim.tim_period = info_element->data[1];
+
+                        network->dtim_period = info_element->data[1];
+                        if (ieee->state != RTLLIB_LINKED)
+                                break;
+                       network->last_dtim_sta_time[0] = jiffies;
+                        network->last_dtim_sta_time[1] = stats->mac_time[1];
+
+                        network->dtim_data = RTLLIB_DTIM_VALID;
+
+
+                        if (info_element->data[2] & 1)
+                                network->dtim_data |= RTLLIB_DTIM_MBCAST;
+
+#if 1
+                        offset = (info_element->data[2] >> 1)*2;
+
+
+                        if (ieee->assoc_id < 8*offset ||
+                                ieee->assoc_id > 8*(offset + info_element->len -3))
+
+                                break;
+
+                        offset = (ieee->assoc_id / 8) - offset;
+                        if (info_element->data[3+offset] & (1<<(ieee->assoc_id%8)))
+                                network->dtim_data |= RTLLIB_DTIM_UCAST;
+#else
+                       {
+                               u16 numSta = 0;
+                               u16 offset_byte = 0;
+                               u16 offset_bit = 0;
+
+                               numSta = (info_element->data[2] &0xFE)*8;
+
+                               if (ieee->assoc_id < numSta ||
+                                               ieee->assoc_id > (numSta + (info_element->len -3)*8))
+                                       break;
+
+                               offset = ieee->assoc_id - numSta;
+                               offset_byte = offset / 8;
+                               offset_bit = offset % 8;
+                               if (info_element->data[3+offset_byte] & (0x01<<offset_bit))
+                                       network->dtim_data |= RTLLIB_DTIM_UCAST;
+                       }
+#endif
+
+                       network->listen_interval = network->dtim_period;
+                       break;
+
+               case MFIE_TYPE_ERP:
+                       network->erp_value = info_element->data[0];
+                       network->flags |= NETWORK_HAS_ERP_VALUE;
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_ERP_SET: %d\n",
+                                            network->erp_value);
+                       break;
+               case MFIE_TYPE_IBSS_SET:
+                       network->atim_window = info_element->data[0];
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_IBSS_SET: %d\n",
+                                            network->atim_window);
+                       break;
+
+               case MFIE_TYPE_CHALLENGE:
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_CHALLENGE: ignored\n");
+                       break;
+
+               case MFIE_TYPE_GENERIC:
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_GENERIC: %d bytes\n",
+                                            info_element->len);
+                       if (!rtllib_parse_qos_info_param_IE(info_element,
+                                                              network))
+                               break;
+                       if (info_element->len >= 4 &&
+                           info_element->data[0] == 0x00 &&
+                           info_element->data[1] == 0x50 &&
+                           info_element->data[2] == 0xf2 &&
+                           info_element->data[3] == 0x01) {
+                               network->wpa_ie_len = min(info_element->len + 2,
+                                                         MAX_WPA_IE_LEN);
+                               memcpy(network->wpa_ie, info_element,
+                                      network->wpa_ie_len);
+                               break;
+                       }
+                        if (info_element->len == 7 &&
+                            info_element->data[0] == 0x00 &&
+                            info_element->data[1] == 0xe0 &&
+                            info_element->data[2] == 0x4c &&
+                            info_element->data[3] == 0x01 &&
+                            info_element->data[4] == 0x02)
+                                network->Turbo_Enable = 1;
+
+                       if (tmp_htcap_len == 0) {
+                               if (info_element->len >= 4 &&
+                                  info_element->data[0] == 0x00 &&
+                                  info_element->data[1] == 0x90 &&
+                                  info_element->data[2] == 0x4c &&
+                                  info_element->data[3] == 0x033) {
+
+                                               tmp_htcap_len = min(info_element->len,(u8)MAX_IE_LEN);
+                                               if (tmp_htcap_len != 0){
+                                                       network->bssht.bdHTSpecVer = HT_SPEC_VER_EWC;
+                                                       network->bssht.bdHTCapLen = tmp_htcap_len > sizeof(network->bssht.bdHTCapBuf)?\
+                                                               sizeof(network->bssht.bdHTCapBuf):tmp_htcap_len;
+                                                       memcpy(network->bssht.bdHTCapBuf,info_element->data,network->bssht.bdHTCapLen);
+                                               }
+                               }
+                               if (tmp_htcap_len != 0){
+                                       network->bssht.bdSupportHT = true;
+                                       network->bssht.bdHT1R = ((((PHT_CAPABILITY_ELE)(network->bssht.bdHTCapBuf))->MCS[1]) == 0);
+                               }else{
+                                       network->bssht.bdSupportHT = false;
+                                       network->bssht.bdHT1R = false;
+                               }
+                       }
+
+
+                       if (tmp_htinfo_len == 0){
+                               if (info_element->len >= 4 &&
+                                       info_element->data[0] == 0x00 &&
+                                       info_element->data[1] == 0x90 &&
+                                       info_element->data[2] == 0x4c &&
+                                       info_element->data[3] == 0x034){
+
+                                               tmp_htinfo_len = min(info_element->len,(u8)MAX_IE_LEN);
+                                               if (tmp_htinfo_len != 0){
+                                                       network->bssht.bdHTSpecVer = HT_SPEC_VER_EWC;
+                                                       if (tmp_htinfo_len){
+                                                               network->bssht.bdHTInfoLen = tmp_htinfo_len > sizeof(network->bssht.bdHTInfoBuf)?\
+                                                                       sizeof(network->bssht.bdHTInfoBuf):tmp_htinfo_len;
+                                                               memcpy(network->bssht.bdHTInfoBuf,info_element->data,network->bssht.bdHTInfoLen);
+                                                       }
+
+                                               }
+
+                               }
+                       }
+
+                       if (ieee->aggregation){
+                               if (network->bssht.bdSupportHT){
+                                       if (info_element->len >= 4 &&
+                                               info_element->data[0] == 0x00 &&
+                                               info_element->data[1] == 0xe0 &&
+                                               info_element->data[2] == 0x4c &&
+                                               info_element->data[3] == 0x02){
+
+                                               ht_realtek_agg_len = min(info_element->len,(u8)MAX_IE_LEN);
+                                               memcpy(ht_realtek_agg_buf,info_element->data,info_element->len);
+
+                                       }
+                                       if (ht_realtek_agg_len >= 5){
+                                               network->realtek_cap_exit = true;
+                                               network->bssht.bdRT2RTAggregation = true;
+
+                                               if ((ht_realtek_agg_buf[4] == 1) && (ht_realtek_agg_buf[5] & 0x02))
+                                               network->bssht.bdRT2RTLongSlotTime = true;
+
+                                               if ((ht_realtek_agg_buf[4]==1) && (ht_realtek_agg_buf[5] & RT_HT_CAP_USE_92SE))
+                                               {
+                                                       network->bssht.RT2RT_HT_Mode |= RT_HT_CAP_USE_92SE;
+                                               }
+                                       }
+                               }
+                               if (ht_realtek_agg_len >= 5){
+                                       if ((ht_realtek_agg_buf[5] & RT_HT_CAP_USE_SOFTAP))
+                                               network->bssht.RT2RT_HT_Mode |= RT_HT_CAP_USE_SOFTAP;
+                               }
+                       }
+
+                       {
+                               if ((info_element->len >= 3 &&
+                                        info_element->data[0] == 0x00 &&
+                                        info_element->data[1] == 0x05 &&
+                                        info_element->data[2] == 0xb5) ||
+                                        (info_element->len >= 3 &&
+                                        info_element->data[0] == 0x00 &&
+                                        info_element->data[1] == 0x0a &&
+                                        info_element->data[2] == 0xf7) ||
+                                        (info_element->len >= 3 &&
+                                        info_element->data[0] == 0x00 &&
+                                        info_element->data[1] == 0x10 &&
+                                        info_element->data[2] == 0x18)){
+
+                                               network->broadcom_cap_exist = true;
+
+                               }
+                       }
+                       if (info_element->len >= 3 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x0c &&
+                               info_element->data[2] == 0x43)
+                       {
+                               network->ralink_cap_exist = true;
+                       }
+                       if ((info_element->len >= 3 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x03 &&
+                               info_element->data[2] == 0x7f) ||
+                               (info_element->len >= 3 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x13 &&
+                               info_element->data[2] == 0x74))
+                       {
+                               network->atheros_cap_exist = true;
+                       }
+
+                       if ((info_element->len >= 3 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x50 &&
+                               info_element->data[2] == 0x43) )
+                               {
+                                       network->marvell_cap_exist = true;
+                               }
+                       if (info_element->len >= 3 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x40 &&
+                               info_element->data[2] == 0x96)
+                       {
+                               network->cisco_cap_exist = true;
+                       }
+
+
+                       if (info_element->len >= 3 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x0a &&
+                               info_element->data[2] == 0xf5)
+                       {
+                               network->airgo_cap_exist = true;
+                       }
+
+                       if (info_element->len > 4 &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x40 &&
+                               info_element->data[2] == 0x96 &&
+                               info_element->data[3] == 0x01)
+                       {
+                               if (info_element->len == 6)
+                               {
+                                       memcpy(network->CcxRmState, &info_element[4], 2);
+                                       if (network->CcxRmState[0] != 0)
+                                       {
+                                               network->bCcxRmEnable = true;
+                                       }
+                                       else
+                                               network->bCcxRmEnable = false;
+                                       network->MBssidMask = network->CcxRmState[1] & 0x07;
+                                       if (network->MBssidMask != 0)
+                                       {
+                                               network->bMBssidValid = true;
+                                               network->MBssidMask = 0xff << (network->MBssidMask);
+                                               memcpy(network->MBssid, network->bssid, ETH_ALEN);
+                                               network->MBssid[5] &= network->MBssidMask;
+                                       }
+                                       else
+                                       {
+                                               network->bMBssidValid = false;
+                                       }
+                               }
+                               else
+                               {
+                                       network->bCcxRmEnable = false;
+                               }
+                       }
+                       if (info_element->len > 4  &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x40 &&
+                               info_element->data[2] == 0x96 &&
+                               info_element->data[3] == 0x03)
+                       {
+                               if (info_element->len == 5)
+                               {
+                                       network->bWithCcxVerNum = true;
+                                       network->BssCcxVerNumber = info_element->data[4];
+                               }
+                               else
+                               {
+                                       network->bWithCcxVerNum = false;
+                                       network->BssCcxVerNumber = 0;
+                               }
+                       }
+                       if (info_element->len > 4  &&
+                               info_element->data[0] == 0x00 &&
+                               info_element->data[1] == 0x50 &&
+                               info_element->data[2] == 0xf2 &&
+                               info_element->data[3] == 0x04)
+                       {
+                               RTLLIB_DEBUG_MGMT("MFIE_TYPE_WZC: %d bytes\n",
+                                                    info_element->len);
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+                               network->wzc_ie_len = min(info_element->len+2,
+                                                         MAX_WZC_IE_LEN);
+                               memcpy(network->wzc_ie, info_element,
+                                               network->wzc_ie_len);
+#endif
+                       }
+                       break;
+
+               case MFIE_TYPE_RSN:
+                       RTLLIB_DEBUG_MGMT("MFIE_TYPE_RSN: %d bytes\n",
+                                            info_element->len);
+                       network->rsn_ie_len = min(info_element->len + 2,
+                                                 MAX_WPA_IE_LEN);
+                       memcpy(network->rsn_ie, info_element,
+                              network->rsn_ie_len);
+                       break;
+
+               case MFIE_TYPE_HT_CAP:
+                       RTLLIB_DEBUG_SCAN("MFIE_TYPE_HT_CAP: %d bytes\n",
+                                            info_element->len);
+                       tmp_htcap_len = min(info_element->len,(u8)MAX_IE_LEN);
+                       if (tmp_htcap_len != 0){
+                               network->bssht.bdHTSpecVer = HT_SPEC_VER_EWC;
+                               network->bssht.bdHTCapLen = tmp_htcap_len > sizeof(network->bssht.bdHTCapBuf)?\
+                                       sizeof(network->bssht.bdHTCapBuf):tmp_htcap_len;
+                               memcpy(network->bssht.bdHTCapBuf,info_element->data,network->bssht.bdHTCapLen);
+
+                               network->bssht.bdSupportHT = true;
+                               network->bssht.bdHT1R = ((((PHT_CAPABILITY_ELE)(network->bssht.bdHTCapBuf))->MCS[1]) == 0);
+
+                               network->bssht.bdBandWidth = (HT_CHANNEL_WIDTH)(((PHT_CAPABILITY_ELE)(network->bssht.bdHTCapBuf))->ChlWidth);
+                       }
+                       else{
+                               network->bssht.bdSupportHT = false;
+                               network->bssht.bdHT1R = false;
+                               network->bssht.bdBandWidth = HT_CHANNEL_WIDTH_20 ;
+                       }
+                       break;
+
+
+               case MFIE_TYPE_HT_INFO:
+                       RTLLIB_DEBUG_SCAN("MFIE_TYPE_HT_INFO: %d bytes\n",
+                                            info_element->len);
+                       tmp_htinfo_len = min(info_element->len,(u8)MAX_IE_LEN);
+                       if (tmp_htinfo_len){
+                               network->bssht.bdHTSpecVer = HT_SPEC_VER_IEEE;
+                               network->bssht.bdHTInfoLen = tmp_htinfo_len > sizeof(network->bssht.bdHTInfoBuf)?\
+                                       sizeof(network->bssht.bdHTInfoBuf):tmp_htinfo_len;
+                               memcpy(network->bssht.bdHTInfoBuf,info_element->data,network->bssht.bdHTInfoLen);
+                       }
+                       break;
+
+               case MFIE_TYPE_AIRONET:
+                       RTLLIB_DEBUG_SCAN("MFIE_TYPE_AIRONET: %d bytes\n",
+                                            info_element->len);
+                       if (info_element->len >IE_CISCO_FLAG_POSITION)
+                       {
+                               network->bWithAironetIE = true;
+
+                               if (    (info_element->data[IE_CISCO_FLAG_POSITION]&SUPPORT_CKIP_MIC)   ||
+                                       (info_element->data[IE_CISCO_FLAG_POSITION]&SUPPORT_CKIP_PK)    )
+                               {
+                                       network->bCkipSupported = true;
+                               }
+                               else
+                               {
+                                       network->bCkipSupported = false;
+                               }
+                       }
+                       else
+                       {
+                               network->bWithAironetIE = false;
+                               network->bCkipSupported = false;
+                       }
+                       break;
+               case MFIE_TYPE_QOS_PARAMETER:
+                       printk(KERN_ERR
+                              "QoS Error need to parse QOS_PARAMETER IE\n");
+                       break;
+
+#ifdef ENABLE_DOT11D
+               case MFIE_TYPE_COUNTRY:
+                       RTLLIB_DEBUG_SCAN("MFIE_TYPE_COUNTRY: %d bytes\n",
+                                            info_element->len);
+                       rtllib_extract_country_ie(ieee, info_element, network, network->bssid);
+                       break;
+#endif
+/* TODO */
+               default:
+                       RTLLIB_DEBUG_MGMT
+                           ("Unsupported info element: %s (%d)\n",
+                            get_info_element_string(info_element->id),
+                            info_element->id);
+                       break;
+               }
+
+               length -= sizeof(*info_element) + info_element->len;
+               info_element =
+                   (struct rtllib_info_element *)&info_element->
+                   data[info_element->len];
+       }
+
+       if (!network->atheros_cap_exist && !network->broadcom_cap_exist &&
+               !network->cisco_cap_exist && !network->ralink_cap_exist && !network->bssht.bdRT2RTAggregation)
+       {
+               network->unknown_cap_exist = true;
+       }
+       else
+       {
+               network->unknown_cap_exist = false;
+       }
+       return 0;
+}
+
+static inline u8 rtllib_SignalStrengthTranslate(
+       u8  CurrSS
+       )
+{
+       u8 RetSS;
+
+       if (CurrSS >= 71 && CurrSS <= 100)
+       {
+               RetSS = 90 + ((CurrSS - 70) / 3);
+       }
+       else if (CurrSS >= 41 && CurrSS <= 70)
+       {
+               RetSS = 78 + ((CurrSS - 40) / 3);
+       }
+       else if (CurrSS >= 31 && CurrSS <= 40)
+       {
+               RetSS = 66 + (CurrSS - 30);
+       }
+       else if (CurrSS >= 21 && CurrSS <= 30)
+       {
+               RetSS = 54 + (CurrSS - 20);
+       }
+       else if (CurrSS >= 5 && CurrSS <= 20)
+       {
+               RetSS = 42 + (((CurrSS - 5) * 2) / 3);
+       }
+       else if (CurrSS == 4)
+       {
+               RetSS = 36;
+       }
+       else if (CurrSS == 3)
+       {
+               RetSS = 27;
+       }
+       else if (CurrSS == 2)
+       {
+               RetSS = 18;
+       }
+       else if (CurrSS == 1)
+       {
+               RetSS = 9;
+       }
+       else
+       {
+               RetSS = CurrSS;
+       }
+
+
+
+       return RetSS;
+}
+
+long rtllib_translate_todbm(u8 signal_strength_index   )
+{
+       long    signal_power;
+
+       signal_power = (long)((signal_strength_index + 1) >> 1);
+       signal_power -= 95;
+
+       return signal_power;
+}
+
+static inline int rtllib_network_init(
+       struct rtllib_device *ieee,
+       struct rtllib_probe_response *beacon,
+       struct rtllib_network *network,
+       struct rtllib_rx_stats *stats)
+{
+#ifdef CONFIG_RTLLIB_DEBUG
+#endif
+
+       /*
+        network->qos_data.active = 0;
+        network->qos_data.supported = 0;
+        network->qos_data.param_count = 0;
+        network->qos_data.old_param_count = 0;
+       */
+       memset(&network->qos_data, 0, sizeof(struct rtllib_qos_data));
+
+       /* Pull out fixed field data */
+       memcpy(network->bssid, beacon->header.addr3, ETH_ALEN);
+       network->capability = le16_to_cpu(beacon->capability);
+       network->last_scanned = jiffies;
+       network->time_stamp[0] = le32_to_cpu(beacon->time_stamp[0]);
+       network->time_stamp[1] = le32_to_cpu(beacon->time_stamp[1]);
+       network->beacon_interval = le32_to_cpu(beacon->beacon_interval);
+       /* Where to pull this? beacon->listen_interval;*/
+       network->listen_interval = 0x0A;
+       network->rates_len = network->rates_ex_len = 0;
+       network->last_associate = 0;
+       network->ssid_len = 0;
+       network->hidden_ssid_len = 0;
+       memset(network->hidden_ssid, 0, sizeof(network->hidden_ssid));
+       network->flags = 0;
+       network->atim_window = 0;
+       network->erp_value = (network->capability & WLAN_CAPABILITY_IBSS) ?
+            0x3 : 0x0;
+       network->berp_info_valid = false;
+        network->broadcom_cap_exist = false;
+       network->ralink_cap_exist = false;
+       network->atheros_cap_exist = false;
+       network->cisco_cap_exist = false;
+       network->unknown_cap_exist = false;
+       network->realtek_cap_exit = false;
+       network->marvell_cap_exist = false;
+       network->airgo_cap_exist = false;
+       network->Turbo_Enable = 0;
+       network->SignalStrength = stats->SignalStrength;
+       network->RSSI = stats->SignalStrength;
+#ifdef ENABLE_DOT11D
+       network->CountryIeLen = 0;
+       memset(network->CountryIeBuf, 0, MAX_IE_LEN);
+#endif
+       HTInitializeBssDesc(&network->bssht);
+       if (stats->freq == RTLLIB_52GHZ_BAND) {
+               /* for A band (No DS info) */
+               network->channel = stats->received_channel;
+       } else
+               network->flags |= NETWORK_HAS_CCK;
+
+       network->wpa_ie_len = 0;
+       network->rsn_ie_len = 0;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       network->wzc_ie_len = 0;
+#endif
+
+        if (rtllib_parse_info_param(ieee,
+                       beacon->info_element,
+                       (stats->len - sizeof(*beacon)),
+                       network,
+                       stats))
+                return 1;
+
+       network->mode = 0;
+       if (stats->freq == RTLLIB_52GHZ_BAND)
+               network->mode = IEEE_A;
+       else {
+               if (network->flags & NETWORK_HAS_OFDM)
+                       network->mode |= IEEE_G;
+               if (network->flags & NETWORK_HAS_CCK)
+                       network->mode |= IEEE_B;
+       }
+
+       if (network->mode == 0) {
+               RTLLIB_DEBUG_SCAN("Filtered out '%s (" MAC_FMT ")' "
+                                    "network.\n",
+                                    escape_essid(network->ssid,
+                                                 network->ssid_len),
+                                    MAC_ARG(network->bssid));
+               return 1;
+       }
+
+       if (network->bssht.bdSupportHT){
+               if (network->mode == IEEE_A)
+                       network->mode = IEEE_N_5G;
+               else if (network->mode & (IEEE_G | IEEE_B))
+                       network->mode = IEEE_N_24G;
+       }
+       if (rtllib_is_empty_essid(network->ssid, network->ssid_len))
+               network->flags |= NETWORK_EMPTY_ESSID;
+       stats->signal = 30 + (stats->SignalStrength * 70) / 100;
+       stats->noise = rtllib_translate_todbm((u8)(100-stats->signal)) -25;
+
+       memcpy(&network->stats, stats, sizeof(network->stats));
+
+       return 0;
+}
+
+static inline int is_same_network(struct rtllib_network *src,
+                                 struct rtllib_network *dst, u8 ssidbroad)
+{
+       /* A network is only a duplicate if the channel, BSSID, ESSID
+        * and the capability field (in particular IBSS and BSS) all match.
+        * We treat all <hidden> with the same BSSID and channel
+        * as one network */
+       return
+               (((src->ssid_len == dst->ssid_len) || (!ssidbroad)) &&
+               (src->channel == dst->channel) &&
+               !memcmp(src->bssid, dst->bssid, ETH_ALEN) &&
+               (!memcmp(src->ssid, dst->ssid, src->ssid_len) || (!ssidbroad)) &&
+               ((src->capability & WLAN_CAPABILITY_IBSS) ==
+               (dst->capability & WLAN_CAPABILITY_IBSS)) &&
+               ((src->capability & WLAN_CAPABILITY_ESS) ==
+               (dst->capability & WLAN_CAPABILITY_ESS)));
+}
+
+static inline void update_ibss_network(struct rtllib_network *dst,
+                                 struct rtllib_network *src)
+{
+       memcpy(&dst->stats, &src->stats, sizeof(struct rtllib_rx_stats));
+       dst->last_scanned = jiffies;
+}
+
+
+static inline void update_network(struct rtllib_network *dst,
+                                 struct rtllib_network *src)
+{
+       int qos_active;
+       u8 old_param;
+
+       memcpy(&dst->stats, &src->stats, sizeof(struct rtllib_rx_stats));
+       dst->capability = src->capability;
+       memcpy(dst->rates, src->rates, src->rates_len);
+       dst->rates_len = src->rates_len;
+       memcpy(dst->rates_ex, src->rates_ex, src->rates_ex_len);
+       dst->rates_ex_len = src->rates_ex_len;
+       if (src->ssid_len > 0)
+       {
+               if (dst->ssid_len == 0)
+               {
+                       memset(dst->hidden_ssid, 0, sizeof(dst->hidden_ssid));
+                       dst->hidden_ssid_len = src->ssid_len;
+                       memcpy(dst->hidden_ssid, src->ssid, src->ssid_len);
+               }else{
+                       memset(dst->ssid, 0, dst->ssid_len);
+                       dst->ssid_len = src->ssid_len;
+                       memcpy(dst->ssid, src->ssid, src->ssid_len);
+               }
+       }
+       dst->mode = src->mode;
+       dst->flags = src->flags;
+       dst->time_stamp[0] = src->time_stamp[0];
+       dst->time_stamp[1] = src->time_stamp[1];
+       if (src->flags & NETWORK_HAS_ERP_VALUE)
+       {
+               dst->erp_value = src->erp_value;
+               dst->berp_info_valid = src->berp_info_valid = true;
+       }
+       dst->beacon_interval = src->beacon_interval;
+       dst->listen_interval = src->listen_interval;
+       dst->atim_window = src->atim_window;
+       dst->dtim_period = src->dtim_period;
+       dst->dtim_data = src->dtim_data;
+       dst->last_dtim_sta_time[0] = src->last_dtim_sta_time[0];
+       dst->last_dtim_sta_time[1] = src->last_dtim_sta_time[1];
+       memcpy(&dst->tim, &src->tim, sizeof(struct rtllib_tim_parameters));
+
+        dst->bssht.bdSupportHT = src->bssht.bdSupportHT;
+       dst->bssht.bdRT2RTAggregation = src->bssht.bdRT2RTAggregation;
+       dst->bssht.bdHTCapLen= src->bssht.bdHTCapLen;
+       memcpy(dst->bssht.bdHTCapBuf,src->bssht.bdHTCapBuf,src->bssht.bdHTCapLen);
+       dst->bssht.bdHTInfoLen= src->bssht.bdHTInfoLen;
+       memcpy(dst->bssht.bdHTInfoBuf,src->bssht.bdHTInfoBuf,src->bssht.bdHTInfoLen);
+       dst->bssht.bdHTSpecVer = src->bssht.bdHTSpecVer;
+       dst->bssht.bdRT2RTLongSlotTime = src->bssht.bdRT2RTLongSlotTime;
+       dst->broadcom_cap_exist = src->broadcom_cap_exist;
+       dst->ralink_cap_exist = src->ralink_cap_exist;
+       dst->atheros_cap_exist = src->atheros_cap_exist;
+       dst->realtek_cap_exit = src->realtek_cap_exit;
+       dst->marvell_cap_exist = src->marvell_cap_exist;
+       dst->cisco_cap_exist = src->cisco_cap_exist;
+       dst->airgo_cap_exist = src->airgo_cap_exist;
+       dst->unknown_cap_exist = src->unknown_cap_exist;
+       memcpy(dst->wpa_ie, src->wpa_ie, src->wpa_ie_len);
+       dst->wpa_ie_len = src->wpa_ie_len;
+       memcpy(dst->rsn_ie, src->rsn_ie, src->rsn_ie_len);
+       dst->rsn_ie_len = src->rsn_ie_len;
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       memcpy(dst->wzc_ie, src->wzc_ie, src->wzc_ie_len);
+       dst->wzc_ie_len = src->wzc_ie_len;
+#endif
+
+       dst->last_scanned = jiffies;
+       /* qos related parameters */
+       qos_active = dst->qos_data.active;
+       old_param = dst->qos_data.param_count;
+       dst->qos_data.supported = src->qos_data.supported;
+       if (dst->flags & NETWORK_HAS_QOS_PARAMETERS)
+               memcpy(&dst->qos_data, &src->qos_data, sizeof(struct rtllib_qos_data));
+       if (dst->qos_data.supported == 1) {
+               if (dst->ssid_len)
+                       RTLLIB_DEBUG_QOS
+                               ("QoS the network %s is QoS supported\n",
+                               dst->ssid);
+               else
+                       RTLLIB_DEBUG_QOS
+                               ("QoS the network is QoS supported\n");
+       }
+       dst->qos_data.active = qos_active;
+       dst->qos_data.old_param_count = old_param;
+
+       /* dst->last_associate is not overwritten */
+       dst->wmm_info = src->wmm_info;
+       if (src->wmm_param[0].ac_aci_acm_aifsn|| \
+          src->wmm_param[1].ac_aci_acm_aifsn|| \
+          src->wmm_param[2].ac_aci_acm_aifsn|| \
+          src->wmm_param[1].ac_aci_acm_aifsn) {
+         memcpy(dst->wmm_param, src->wmm_param, WME_AC_PRAM_LEN);
+       }
+
+       dst->SignalStrength = src->SignalStrength;
+       dst->RSSI = src->RSSI;
+       dst->Turbo_Enable = src->Turbo_Enable;
+
+#ifdef ENABLE_DOT11D
+       dst->CountryIeLen = src->CountryIeLen;
+       memcpy(dst->CountryIeBuf, src->CountryIeBuf, src->CountryIeLen);
+#endif
+
+       dst->bWithAironetIE = src->bWithAironetIE;
+       dst->bCkipSupported = src->bCkipSupported;
+       memcpy(dst->CcxRmState,src->CcxRmState,2);
+       dst->bCcxRmEnable = src->bCcxRmEnable;
+       dst->MBssidMask = src->MBssidMask;
+       dst->bMBssidValid = src->bMBssidValid;
+       memcpy(dst->MBssid,src->MBssid,6);
+       dst->bWithCcxVerNum = src->bWithCcxVerNum;
+       dst->BssCcxVerNumber = src->BssCcxVerNumber;
+
+}
+static inline int is_beacon(__le16 fc)
+{
+       return (WLAN_FC_GET_STYPE(le16_to_cpu(fc)) == RTLLIB_STYPE_BEACON);
+}
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+u8 AsocEntry_ComputeSum(u8 *paddr)
+{
+       u32 sum;
+
+       sum =   paddr[0]+
+                       paddr[1]+
+                       paddr[2]+
+                       paddr[3]+
+                       paddr[4]+
+                       paddr[5];
+
+       return (u8)(sum % PEER_MAX_ASSOC);
+}
+u8 AsocEntry_AssignAvailableAID(struct rtllib_device *ieee, u8 *paddr)
+{
+       int             i;
+
+       for (i = 0; i < PEER_MAX_ASSOC; i++)
+       {
+               if (ieee->AvailableAIDTable[i] == 99)
+               {
+                       ieee->AvailableAIDTable[i] = AsocEntry_ComputeSum(paddr);
+                       return i+1;
+               }
+       }
+
+       return 1;
+}
+
+void InitStaInfo(struct rtllib_device *ieee,int index)
+{
+       int idx = index;
+       ieee->peer_assoc_list[idx]->StaDataRate = 0;
+       ieee->peer_assoc_list[idx]->StaSS = 0;
+       ieee->peer_assoc_list[idx]->RetryFrameCnt = 0;
+       ieee->peer_assoc_list[idx]->NoRetryFrameCnt = 0;
+       ieee->peer_assoc_list[idx]->LastRetryCnt = 0;
+       ieee->peer_assoc_list[idx]->LastNoRetryCnt = 0;
+       ieee->peer_assoc_list[idx]->AvgRetryRate = 0;
+       ieee->peer_assoc_list[idx]->LastRetryRate = 0;
+       ieee->peer_assoc_list[idx]->txRateIndex = 11;
+       ieee->peer_assoc_list[idx]->APDataRate = 0x2;
+       ieee->peer_assoc_list[idx]->ForcedDataRate = 0x2;
+
+}
+static u8 IsStaInfoExist(struct rtllib_device *ieee, u8 *addr)
+{
+       int k=0;
+       struct sta_info * psta = NULL;
+       u8 sta_idx = PEER_MAX_ASSOC;
+
+       for (k=0; k<PEER_MAX_ASSOC; k++)
+       {
+               psta = ieee->peer_assoc_list[k];
+               if (NULL != psta)
+               {
+                       if (memcmp(addr, psta->macaddr, ETH_ALEN) == 0)
+                       {
+                               sta_idx = k;
+                               break;
+                       }
+               }
+       }
+       return sta_idx;
+}
+static u8 GetFreeStaInfoIdx(struct rtllib_device *ieee, u8 *addr)
+{
+       int k = 0;
+       while((ieee->peer_assoc_list[k] != NULL) && (k < PEER_MAX_ASSOC))
+               k++;
+       printk("%s: addr:"MAC_FMT" index: %d\n", __func__, MAC_ARG(addr), k);
+       return k;
+}
+struct sta_info *GetStaInfo(struct rtllib_device *ieee, u8 *addr)
+{
+       int k=0;
+       struct sta_info * psta = NULL;
+       struct sta_info * psta_find = NULL;
+
+       for (k=0; k<PEER_MAX_ASSOC; k++)
+       {
+               psta = ieee->peer_assoc_list[k];
+               if (NULL != psta)
+               {
+                       if (memcmp(addr, psta->macaddr, ETH_ALEN) == 0)
+                       {
+                               psta_find = psta;
+                               break;
+                       }
+               }
+       }
+       return psta_find;
+}
+void DelStaInfoList(struct rtllib_device *ieee)
+{
+       int idx = 0;
+       struct sta_info * AsocEntry = NULL;
+
+       atomic_set(&ieee->AsocEntryNum, 0);
+       for (idx=0; idx<PEER_MAX_ASSOC; idx++){
+               AsocEntry = ieee->peer_assoc_list[idx];
+               if (NULL != AsocEntry){
+                       kfree(AsocEntry);
+                       ieee->peer_assoc_list[idx] = NULL;
+               }
+               ieee->AvailableAIDTable[idx] = 99;
+       }
+}
+void DelStaInfo(struct rtllib_device *ieee, u8 *addr)
+{
+       struct sta_info * psta = NULL;
+       int k=0;
+
+       for (k=0; k<PEER_MAX_ASSOC; k++)
+       {
+               psta = ieee->peer_assoc_list[k];
+               if (NULL != psta){
+                       if (memcmp(addr, psta->macaddr, ETH_ALEN) == 0){
+                               if (psta->aid > 0 && psta->aid-1 < PEER_MAX_ASSOC)
+                                       ieee->AvailableAIDTable[psta->aid-1] = 99;
+                               else
+                                       printk("%s(): clear non-existing entry AID\n", __func__);
+
+                               kfree(psta);
+                               ieee->peer_assoc_list[k] = NULL;
+                               atomic_dec(&ieee->AsocEntryNum);
+                       }
+               }
+       }
+}
+void IbssAgeFunction(struct rtllib_device *ieee)
+{
+       struct sta_info*        AsocEntry = NULL;
+       int                             idx;
+       unsigned long           CurrentTime;
+       signed long             TimeDifference;
+       struct rtllib_network *target;
+
+       CurrentTime = jiffies;
+
+       for (idx = 0; idx < PEER_MAX_ASSOC; idx++)
+       {
+               AsocEntry = ieee->peer_assoc_list[idx];
+               if (AsocEntry)
+               {
+                       TimeDifference = jiffies_to_msecs(CurrentTime - AsocEntry->LastActiveTime);
+
+                       if (TimeDifference > 20000)
+                       {
+                               printk("IbssAgeFunction(): "MAC_FMT" timeout\n", MAC_ARG(AsocEntry->macaddr));
+                               kfree(AsocEntry);
+                               ieee->peer_assoc_list[idx] = NULL;
+                               atomic_dec(&ieee->AsocEntryNum);
+
+                               if (atomic_read(&ieee->AsocEntryNum) == 0){
+
+                                       down(&ieee->wx_sem);
+                                       rtllib_stop_protocol(ieee,true);
+
+                                       list_for_each_entry(target, &ieee->network_list, list) {
+                                               if (is_same_network(target, &ieee->current_network,(target->ssid_len?1:0))){
+                                                       printk("delete sta of previous Ad-hoc\n");
+                                                       list_del(&target->list);
+                                                       break;
+                                               }
+                                       }
+
+                                       rtllib_start_protocol(ieee);
+                                       up(&ieee->wx_sem);
+                               }
+                       }
+               }
+       }
+
+#ifdef TO_DO_LIST
+       if (AsocEntry_AnyStationAssociated(pMgntInfo)==false)
+               DrvIFIndicateDisassociation(Adapter, unspec_reason);
+
+       if (pMgntInfo->dot11CurrentWirelessMode == WIRELESS_MODE_G ||
+               (IS_WIRELESS_MODE_N_24G(Adapter) && pMgntInfo->pHTInfo->bCurSuppCCK)    )
+       {
+               if (nBModeStaCnt == 0)
+               {
+                       pMgntInfo->bUseProtection = false;
+                       ActUpdate_mCapInfo(Adapter, pMgntInfo->mCap);
+               }
+       }
+
+       if (IS_WIRELESS_MODE_N_24G(Adapter) || IS_WIRELESS_MODE_N_5G(Adapter) )
+       {
+               if (nLegacyStaCnt > 0)
+               {
+                       pMgntInfo->pHTInfo->CurrentOpMode = HT_OPMODE_MIXED;
+               }
+               else
+               {
+                       if ((pMgntInfo->pHTInfo->bCurBW40MHz) && (n20MHzStaCnt > 0))
+                               pMgntInfo->pHTInfo->CurrentOpMode = HT_OPMODE_40MHZ_PROTECT;
+                       else
+                               pMgntInfo->pHTInfo->CurrentOpMode = HT_OPMODE_NO_PROTECT;
+
+               }
+       }
+
+       if (IS_WIRELESS_MODE_G(Adapter) ||
+               (IS_WIRELESS_MODE_N_24G(Adapter) && pMgntInfo->pHTInfo->bCurSuppCCK))
+       {
+               if (pMgntInfo->bUseProtection)
+               {
+                       u8 CckRate[4] = { MGN_1M, MGN_2M, MGN_5_5M, MGN_11M };
+                       OCTET_STRING osCckRate;
+                       FillOctetString(osCckRate, CckRate, 4);
+                       FilterSupportRate(pMgntInfo->mBrates, &osCckRate, false);
+                       Adapter->HalFunc.SetHwRegHandler(Adapter, HW_VAR_BASIC_RATE, (pu1Byte)&osCckRate);
+               }
+               else
+               {
+                       Adapter->HalFunc.SetHwRegHandler( Adapter, HW_VAR_BASIC_RATE, (pu1Byte)(&pMgntInfo->mBrates) );
+               }
+       }
+#endif
+}
+#endif
+
+static int IsPassiveChannel( struct rtllib_device *rtllib, u8 channel)
+{
+       if (MAX_CHANNEL_NUMBER < channel) {
+               printk("%s(): Invalid Channel\n", __func__);
+               return 0;
+       }
+
+       if (rtllib->active_channel_map[channel] == 2)
+               return 1;
+
+       return 0;
+}
+
+int IsLegalChannel( struct rtllib_device *rtllib, u8 channel)
+{
+       if (MAX_CHANNEL_NUMBER < channel) {
+               printk("%s(): Invalid Channel\n", __func__);
+               return 0;
+       }
+       if (rtllib->active_channel_map[channel] > 0)
+               return 1;
+
+       return 0;
+}
+
+
+static inline void rtllib_process_probe_response(
+       struct rtllib_device *ieee,
+       struct rtllib_probe_response *beacon,
+       struct rtllib_rx_stats *stats)
+{
+       struct rtllib_network *target;
+       struct rtllib_network *oldest = NULL;
+#ifdef CONFIG_RTLLIB_DEBUG
+       struct rtllib_info_element *info_element = &beacon->info_element[0];
+#endif
+       unsigned long flags;
+       short renew;
+#if (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,13))
+       struct rtllib_network *network = kzalloc(sizeof(struct rtllib_network), GFP_ATOMIC);
+#else
+       struct rtllib_network *network = kmalloc(sizeof(*network), GFP_ATOMIC);
+       memset(network,0,sizeof(*network));
+#endif
+
+       if (!network) {
+               return;
+       }
+
+       RTLLIB_DEBUG_SCAN(
+               "'%s' (" MAC_FMT "): %c%c%c%c %c%c%c%c-%c%c%c%c %c%c%c%c\n",
+               escape_essid(info_element->data, info_element->len),
+               MAC_ARG(beacon->header.addr3),
+               (beacon->capability & (1<<0xf)) ? '1' : '0',
+               (beacon->capability & (1<<0xe)) ? '1' : '0',
+               (beacon->capability & (1<<0xd)) ? '1' : '0',
+               (beacon->capability & (1<<0xc)) ? '1' : '0',
+               (beacon->capability & (1<<0xb)) ? '1' : '0',
+               (beacon->capability & (1<<0xa)) ? '1' : '0',
+               (beacon->capability & (1<<0x9)) ? '1' : '0',
+               (beacon->capability & (1<<0x8)) ? '1' : '0',
+               (beacon->capability & (1<<0x7)) ? '1' : '0',
+               (beacon->capability & (1<<0x6)) ? '1' : '0',
+               (beacon->capability & (1<<0x5)) ? '1' : '0',
+               (beacon->capability & (1<<0x4)) ? '1' : '0',
+               (beacon->capability & (1<<0x3)) ? '1' : '0',
+               (beacon->capability & (1<<0x2)) ? '1' : '0',
+               (beacon->capability & (1<<0x1)) ? '1' : '0',
+               (beacon->capability & (1<<0x0)) ? '1' : '0');
+
+       if (rtllib_network_init(ieee, beacon, network, stats)) {
+               RTLLIB_DEBUG_SCAN("Dropped '%s' (" MAC_FMT ") via %s.\n",
+                                    escape_essid(info_element->data,
+                                                 info_element->len),
+                                    MAC_ARG(beacon->header.addr3),
+                                    WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
+                                    RTLLIB_STYPE_PROBE_RESP ?
+                                    "PROBE RESPONSE" : "BEACON");
+               goto free_network;
+       }
+
+
+       if (!IsLegalChannel(ieee, network->channel))
+               goto free_network;
+
+       if (WLAN_FC_GET_STYPE(beacon->header.frame_ctl) == RTLLIB_STYPE_PROBE_RESP) {
+               if (IsPassiveChannel(ieee, network->channel)) {
+                       printk("GetScanInfo(): For Global Domain, "
+                              "filter probe response at channel(%d).\n", network->channel);
+                       goto free_network;
+               }
+       }
+
+       /* The network parsed correctly -- so now we scan our known networks
+        * to see if we can find it in our list.
+        *
+        * NOTE:  This search is definitely not optimized.  Once its doing
+        *        the "right thing" we'll optimize it for efficiency if
+        *        necessary */
+
+       /* Search for this entry in the list and update it if it is
+        * already there. */
+
+       spin_lock_irqsave(&ieee->lock, flags);
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (is_beacon(beacon->header.frame_ctl)){
+               if ((ieee->iw_mode == IW_MODE_ADHOC) && (ieee->state == RTLLIB_LINKED))
+               {
+                       if ((network->ssid_len == ieee->current_network.ssid_len)
+                               && (!memcmp(network->ssid,ieee->current_network.ssid,ieee->current_network.ssid_len))
+                               && (network->channel == ieee->current_network.channel)
+                               && (ieee->current_network.channel > 0)
+                               && (ieee->current_network.channel <= 14))
+                       {
+                               if (!memcmp(ieee->current_network.bssid,network->bssid,6))
+                               {
+                                       int idx = 0;
+                                       struct rtllib_hdr_3addr* header = NULL;
+                                       int idx_exist = 0;
+                                       if (timer_pending(&ieee->ibss_wait_timer))
+                                               del_timer_sync(&ieee->ibss_wait_timer);
+                                       header = (struct rtllib_hdr_3addr*)&(beacon->header);
+                                       idx_exist = IsStaInfoExist(ieee,header->addr2);
+                                       if (idx_exist >= PEER_MAX_ASSOC) {
+                                               idx = GetFreeStaInfoIdx(ieee, header->addr2);
+                                       } else {
+                                               ieee->peer_assoc_list[idx_exist]->LastActiveTime = jiffies;
+                                               goto no_alloc;
+                                       }
+                                       if (idx >= PEER_MAX_ASSOC - 1) {
+                                               printk("\n%s():ERR!!!Buffer overflow - could not append!!!",__func__);
+                                               goto free_network;
+                                       } else {
+                                               ieee->peer_assoc_list[idx] = (struct sta_info *)kmalloc(sizeof(struct sta_info), GFP_ATOMIC);
+                                               memset(ieee->peer_assoc_list[idx], 0, sizeof(struct sta_info));
+                                               ieee->peer_assoc_list[idx]->LastActiveTime = jiffies;
+                                               memcpy(ieee->peer_assoc_list[idx]->macaddr,header->addr2,ETH_ALEN);
+                                               ieee->peer_assoc_list[idx]->ratr_index = 8;
+                                               InitStaInfo(ieee,idx);
+                                               atomic_inc(&ieee->AsocEntryNum);
+                                               ieee->peer_assoc_list[idx]->aid = AsocEntry_AssignAvailableAID(ieee, ieee->peer_assoc_list[idx]->macaddr);
+                                               ieee->check_ht_cap(ieee->dev,ieee->peer_assoc_list[idx],network);
+                                               queue_delayed_work_rsl(ieee->wq, &ieee->update_assoc_sta_info_wq, 0);
+                                               ieee->Adhoc_InitRateAdaptive(ieee->dev,ieee->peer_assoc_list[idx]);
+                                       }
+                               }
+                       }
+               }
+       }
+       if (ieee->iw_mode == IW_MODE_ADHOC){
+               if ((network->ssid_len == ieee->current_network.ssid_len)
+                       && (!memcmp(network->ssid,ieee->current_network.ssid,ieee->current_network.ssid_len))
+                       && (network->capability & WLAN_CAPABILITY_IBSS)
+                       && (ieee->state == RTLLIB_LINKED_SCANNING))
+               {
+                       if (memcmp(ieee->current_network.bssid,network->bssid,6))
+                       {
+                               printk("%s(): SSID matched but BSSID mismatched.\n",__func__);
+
+                               ieee->TargetTsf = beacon->time_stamp[1];
+                               ieee->TargetTsf <<= 32;
+                               ieee->TargetTsf |= beacon->time_stamp[0];
+
+                               ieee->CurrTsf = stats->TimeStampLow;
+
+                               queue_delayed_work_rsl(ieee->wq, &ieee->check_tsf_wq, 0);
+                       }
+               }
+       }
+#endif
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+no_alloc:
+       if (ieee->iw_mode == IW_MODE_INFRA)
+#endif
+       {
+               if (is_same_network(&ieee->current_network, network, (network->ssid_len?1:0))) {
+                       update_network(&ieee->current_network, network);
+                       if ((ieee->current_network.mode == IEEE_N_24G || ieee->current_network.mode == IEEE_G)
+                       && ieee->current_network.berp_info_valid){
+                       if (ieee->current_network.erp_value& ERP_UseProtection)
+                               ieee->current_network.buseprotection = true;
+               else
+                       ieee->current_network.buseprotection = false;
+               }
+               if (is_beacon(beacon->header.frame_ctl))
+               {
+                               if (ieee->state >= RTLLIB_LINKED)
+                                       ieee->LinkDetectInfo.NumRecvBcnInPeriod++;
+                       }
+               }
+       }
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       else if (ieee->iw_mode == IW_MODE_ADHOC)
+       {
+               if (is_same_network(&ieee->current_network, network, (network->ssid_len?1:0))) {
+                       update_ibss_network(&ieee->current_network, network);
+               }
+       }
+#endif
+       list_for_each_entry(target, &ieee->network_list, list) {
+               if (is_same_network(target, network,(target->ssid_len?1:0)))
+                       break;
+               if ((oldest == NULL) ||
+                   (target->last_scanned < oldest->last_scanned))
+                       oldest = target;
+       }
+
+       /* If we didn't find a match, then get a new network slot to initialize
+        * with this beacon's information */
+       if (&target->list == &ieee->network_list) {
+               if (list_empty(&ieee->network_free_list)) {
+                       /* If there are no more slots, expire the oldest */
+                       list_del(&oldest->list);
+                       target = oldest;
+                       RTLLIB_DEBUG_SCAN("Expired '%s' (" MAC_FMT ") from "
+                                            "network list.\n",
+                                            escape_essid(target->ssid,
+                                                         target->ssid_len),
+                                            MAC_ARG(target->bssid));
+               } else {
+                       /* Otherwise just pull from the free list */
+                       target = list_entry(ieee->network_free_list.next,
+                                           struct rtllib_network, list);
+                       list_del(ieee->network_free_list.next);
+               }
+
+
+#ifdef CONFIG_RTLLIB_DEBUG
+               RTLLIB_DEBUG_SCAN("Adding '%s' (" MAC_FMT ") via %s.\n",
+                                    escape_essid(network->ssid,
+                                                 network->ssid_len),
+                                    MAC_ARG(network->bssid),
+                                    WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
+                                    RTLLIB_STYPE_PROBE_RESP ?
+                                    "PROBE RESPONSE" : "BEACON");
+#endif
+               memcpy(target, network, sizeof(*target));
+               list_add_tail(&target->list, &ieee->network_list);
+               if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE)
+                       rtllib_softmac_new_net(ieee, network);
+       } else {
+               RTLLIB_DEBUG_SCAN("Updating '%s' (" MAC_FMT ") via %s.\n",
+                                    escape_essid(target->ssid,
+                                                 target->ssid_len),
+                                    MAC_ARG(target->bssid),
+                                    WLAN_FC_GET_STYPE(beacon->header.frame_ctl) ==
+                                    RTLLIB_STYPE_PROBE_RESP ?
+                                    "PROBE RESPONSE" : "BEACON");
+
+               /* we have an entry and we are going to update it. But this entry may
+                * be already expired. In this case we do the same as we found a new
+                * net and call the new_net handler
+                */
+               renew = !time_after(target->last_scanned + ieee->scan_age, jiffies);
+               if ((!target->ssid_len) &&
+                       (((network->ssid_len > 0) && (target->hidden_ssid_len == 0))
+                       || ((ieee->current_network.ssid_len == network->ssid_len) &&
+                          (strncmp(ieee->current_network.ssid, network->ssid, network->ssid_len) == 0) &&
+                          (ieee->state == RTLLIB_NOLINK)))
+                       ) {
+                       renew = 1;
+               }
+               update_network(target, network);
+               if (renew && (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE))
+                       rtllib_softmac_new_net(ieee, network);
+       }
+
+       spin_unlock_irqrestore(&ieee->lock, flags);
+       if (is_beacon(beacon->header.frame_ctl)&&is_same_network(&ieee->current_network, network, (network->ssid_len?1:0))&&\
+               (ieee->state == RTLLIB_LINKED)) {
+               if (ieee->handle_beacon != NULL) {
+                       ieee->handle_beacon(ieee->dev,beacon,&ieee->current_network);
+               }
+       }
+free_network:
+       kfree(network);
+       return;
+}
+
+void rtllib_rx_mgt(struct rtllib_device *ieee,
+                      struct sk_buff *skb,
+                     struct rtllib_rx_stats *stats)
+{
+    struct rtllib_hdr_4addr *header = (struct rtllib_hdr_4addr *)skb->data ;
+    if (WLAN_FC_GET_STYPE(header->frame_ctl) != RTLLIB_STYPE_PROBE_RESP &&
+            WLAN_FC_GET_STYPE(header->frame_ctl) != RTLLIB_STYPE_BEACON)
+        ieee->last_rx_ps_time = jiffies;
+
+    switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
+
+        case RTLLIB_STYPE_BEACON:
+            RTLLIB_DEBUG_MGMT("received BEACON (%d)\n",
+                    WLAN_FC_GET_STYPE(header->frame_ctl));
+            RTLLIB_DEBUG_SCAN("Beacon\n");
+            rtllib_process_probe_response(
+                    ieee, (struct rtllib_probe_response *)header, stats);
+
+            if (ieee->sta_sleep || (ieee->ps != RTLLIB_PS_DISABLED &&
+                        ieee->iw_mode == IW_MODE_INFRA &&
+                        ieee->state == RTLLIB_LINKED))
+               tasklet_schedule(&ieee->ps_task);
+
+            break;
+
+        case RTLLIB_STYPE_PROBE_RESP:
+            RTLLIB_DEBUG_MGMT("received PROBE RESPONSE (%d)\n",
+                    WLAN_FC_GET_STYPE(header->frame_ctl));
+            RTLLIB_DEBUG_SCAN("Probe response\n");
+            rtllib_process_probe_response(
+                    ieee, (struct rtllib_probe_response *)header, stats);
+            break;
+        case RTLLIB_STYPE_PROBE_REQ:
+            RTLLIB_DEBUG_MGMT("received PROBE RESQUEST (%d)\n",
+                    WLAN_FC_GET_STYPE(header->frame_ctl));
+            RTLLIB_DEBUG_SCAN("Probe request\n");
+            if ((ieee->softmac_features & IEEE_SOFTMAC_PROBERS) &&
+                    ((ieee->iw_mode == IW_MODE_ADHOC ||
+                      ieee->iw_mode == IW_MODE_MASTER) &&
+                     ieee->state == RTLLIB_LINKED)){
+                rtllib_rx_probe_rq(ieee, skb);
+            }
+            break;
+    }
+
+}
diff --git a/drivers/staging/rtl8192e/rtllib_softmac.c b/drivers/staging/rtl8192e/rtllib_softmac.c
new file mode 100644 (file)
index 0000000..a843de9
--- /dev/null
@@ -0,0 +1,4150 @@
+/* IEEE 802.11 SoftMAC layer
+ * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
+ *
+ * Mostly extracted from the rtl8180-sa2400 driver for the
+ * in-kernel generic ieee802.11 stack.
+ *
+ * Few lines might be stolen from other part of the rtllib
+ * stack. Copyright who own it's copyright
+ *
+ * WPA code stolen from the ipw2200 driver.
+ * Copyright who own it's copyright.
+ *
+ * released under the GPL
+ */
+
+
+#include "rtllib.h"
+#include "rtl_core.h"
+
+#include <linux/random.h>
+#include <linux/delay.h>
+#include <linux/version.h>
+#include <asm/uaccess.h>
+#ifdef ENABLE_DOT11D
+#include "dot11d.h"
+#endif
+
+#ifdef RTK_DMP_PLATFORM
+#include <linux/usb_setting.h>
+#endif
+extern void _setup_timer( struct timer_list*, void*, unsigned long );
+u8 rsn_authen_cipher_suite[16][4] = {
+       {0x00,0x0F,0xAC,0x00},
+       {0x00,0x0F,0xAC,0x01},
+       {0x00,0x0F,0xAC,0x02},
+       {0x00,0x0F,0xAC,0x03},
+       {0x00,0x0F,0xAC,0x04},
+       {0x00,0x0F,0xAC,0x05},
+};
+
+short rtllib_is_54g(struct rtllib_network *net)
+{
+       return ((net->rates_ex_len > 0) || (net->rates_len > 4));
+}
+
+short rtllib_is_shortslot(struct rtllib_network net)
+{
+       return (net.capability & WLAN_CAPABILITY_SHORT_SLOT_TIME);
+}
+
+/* returns the total length needed for pleacing the RATE MFIE
+ * tag and the EXTENDED RATE MFIE tag if needed.
+ * It encludes two bytes per tag for the tag itself and its len
+ */
+unsigned int rtllib_MFIE_rate_len(struct rtllib_device *ieee)
+{
+       unsigned int rate_len = 0;
+
+       if (ieee->modulation & RTLLIB_CCK_MODULATION)
+               rate_len = RTLLIB_CCK_RATE_LEN + 2;
+
+       if (ieee->modulation & RTLLIB_OFDM_MODULATION)
+
+               rate_len += RTLLIB_OFDM_RATE_LEN + 2;
+
+       return rate_len;
+}
+
+/* pleace the MFIE rate, tag to the memory (double) poined.
+ * Then it updates the pointer so that
+ * it points after the new MFIE tag added.
+ */
+void rtllib_MFIE_Brate(struct rtllib_device *ieee, u8 **tag_p)
+{
+       u8 *tag = *tag_p;
+
+       if (ieee->modulation & RTLLIB_CCK_MODULATION){
+               *tag++ = MFIE_TYPE_RATES;
+               *tag++ = 4;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_1MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_2MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_5MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_11MB;
+       }
+
+       /* We may add an option for custom rates that specific HW might support */
+       *tag_p = tag;
+}
+
+void rtllib_MFIE_Grate(struct rtllib_device *ieee, u8 **tag_p)
+{
+       u8 *tag = *tag_p;
+
+               if (ieee->modulation & RTLLIB_OFDM_MODULATION){
+
+               *tag++ = MFIE_TYPE_RATES_EX;
+               *tag++ = 8;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_6MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_9MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_12MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_18MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_24MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_36MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_48MB;
+               *tag++ = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_54MB;
+
+       }
+
+       /* We may add an option for custom rates that specific HW might support */
+       *tag_p = tag;
+}
+
+void rtllib_WMM_Info(struct rtllib_device *ieee, u8 **tag_p) {
+       u8 *tag = *tag_p;
+
+       *tag++ = MFIE_TYPE_GENERIC;
+       *tag++ = 7;
+       *tag++ = 0x00;
+       *tag++ = 0x50;
+       *tag++ = 0xf2;
+       *tag++ = 0x02;
+       *tag++ = 0x00;
+       *tag++ = 0x01;
+#ifdef SUPPORT_USPD
+       if (ieee->current_network.wmm_info & 0x80) {
+               *tag++ = 0x0f|MAX_SP_Len;
+       } else {
+               *tag++ = MAX_SP_Len;
+       }
+#else
+       *tag++ = MAX_SP_Len;
+#endif
+       *tag_p = tag;
+}
+
+void rtllib_TURBO_Info(struct rtllib_device *ieee, u8 **tag_p) {
+       u8 *tag = *tag_p;
+
+        *tag++ = MFIE_TYPE_GENERIC;
+        *tag++ = 7;
+        *tag++ = 0x00;
+        *tag++ = 0xe0;
+        *tag++ = 0x4c;
+        *tag++ = 0x01;
+        *tag++ = 0x02;
+        *tag++ = 0x11;
+       *tag++ = 0x00;
+
+       *tag_p = tag;
+       printk(KERN_ALERT "This is enable turbo mode IE process\n");
+}
+
+void enqueue_mgmt(struct rtllib_device *ieee, struct sk_buff *skb)
+{
+       int nh;
+       nh = (ieee->mgmt_queue_head +1) % MGMT_QUEUE_NUM;
+
+/*
+ * if the queue is full but we have newer frames then
+ * just overwrites the oldest.
+ *
+ * if (nh == ieee->mgmt_queue_tail)
+ *             return -1;
+ */
+       ieee->mgmt_queue_head = nh;
+       ieee->mgmt_queue_ring[nh] = skb;
+
+}
+
+struct sk_buff *dequeue_mgmt(struct rtllib_device *ieee)
+{
+       struct sk_buff *ret;
+
+       if (ieee->mgmt_queue_tail == ieee->mgmt_queue_head)
+               return NULL;
+
+       ret = ieee->mgmt_queue_ring[ieee->mgmt_queue_tail];
+
+       ieee->mgmt_queue_tail =
+               (ieee->mgmt_queue_tail+1) % MGMT_QUEUE_NUM;
+
+       return ret;
+}
+
+void init_mgmt_queue(struct rtllib_device *ieee)
+{
+       ieee->mgmt_queue_tail = ieee->mgmt_queue_head = 0;
+}
+
+
+u8
+MgntQuery_TxRateExcludeCCKRates(struct rtllib_device *ieee)
+{
+       u16     i;
+       u8      QueryRate = 0;
+       u8      BasicRate;
+
+
+       for ( i = 0; i < ieee->current_network.rates_len; i++)
+       {
+               BasicRate = ieee->current_network.rates[i]&0x7F;
+               if (!rtllib_is_cck_rate(BasicRate))
+               {
+                       if (QueryRate == 0)
+                       {
+                               QueryRate = BasicRate;
+                       }
+                       else
+                       {
+                               if (BasicRate < QueryRate)
+                               {
+                                       QueryRate = BasicRate;
+                               }
+                       }
+               }
+       }
+
+       if (QueryRate == 0)
+       {
+               QueryRate = 12;
+               printk("No BasicRate found!!\n");
+       }
+       return QueryRate;
+}
+
+u8 MgntQuery_MgntFrameTxRate(struct rtllib_device *ieee)
+{
+       PRT_HIGH_THROUGHPUT      pHTInfo = ieee->pHTInfo;
+       u8 rate;
+
+       if (pHTInfo->IOTAction & HT_IOT_ACT_MGNT_USE_CCK_6M)
+               rate = 0x0c;
+       else
+               rate = ieee->basic_rate & 0x7f;
+
+       if (rate == 0){
+               if (ieee->mode == IEEE_A||
+                  ieee->mode== IEEE_N_5G||
+                  (ieee->mode== IEEE_N_24G&&!pHTInfo->bCurSuppCCK))
+                       rate = 0x0c;
+               else
+                       rate = 0x02;
+       }
+
+       return rate;
+}
+
+
+void rtllib_sta_wakeup(struct rtllib_device *ieee, short nl);
+
+inline void softmac_mgmt_xmit(struct sk_buff *skb, struct rtllib_device *ieee)
+{
+       unsigned long flags;
+       short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
+       struct rtllib_hdr_3addr  *header=
+               (struct rtllib_hdr_3addr  *) skb->data;
+
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + 8);
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       /* called with 2nd param 0, no mgmt lock required */
+       rtllib_sta_wakeup(ieee,0);
+
+       if (header->frame_ctl == RTLLIB_STYPE_BEACON)
+               tcb_desc->queue_index = BEACON_QUEUE;
+       else
+               tcb_desc->queue_index = MGNT_QUEUE;
+
+       if (ieee->disable_mgnt_queue)
+               tcb_desc->queue_index = HIGH_QUEUE;
+
+       tcb_desc->data_rate = MgntQuery_MgntFrameTxRate(ieee);
+       tcb_desc->RATRIndex = 7;
+       tcb_desc->bTxDisableRateFallBack = 1;
+       tcb_desc->bTxUseDriverAssingedRate = 1;
+       if (single) {
+               if (ieee->queue_stop){
+                       enqueue_mgmt(ieee,skb);
+               }else{
+                       header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4);
+
+                       if (ieee->seq_ctrl[0] == 0xFFF)
+                               ieee->seq_ctrl[0] = 0;
+                       else
+                               ieee->seq_ctrl[0]++;
+
+                       /* avoid watchdog triggers */
+                       ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
+               }
+
+               spin_unlock_irqrestore(&ieee->lock, flags);
+       }else{
+               spin_unlock_irqrestore(&ieee->lock, flags);
+               spin_lock_irqsave(&ieee->mgmt_tx_lock, flags);
+
+               header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
+
+               if (ieee->seq_ctrl[0] == 0xFFF)
+                       ieee->seq_ctrl[0] = 0;
+               else
+                       ieee->seq_ctrl[0]++;
+
+               /* check wether the managed packet queued greater than 5 */
+               if (!ieee->check_nic_enough_desc(ieee->dev,tcb_desc->queue_index)||\
+                               (skb_queue_len(&ieee->skb_waitQ[tcb_desc->queue_index]) != 0)||\
+                               (ieee->queue_stop) ) {
+                       /* insert the skb packet to the management queue */
+                       /* as for the completion function, it does not need
+                        * to check it any more.
+                        * */
+                       printk("%s():insert to waitqueue, queue_index:%d!\n",__func__,tcb_desc->queue_index);
+                       skb_queue_tail(&ieee->skb_waitQ[tcb_desc->queue_index], skb);
+               } else {
+                       ieee->softmac_hard_start_xmit(skb,ieee->dev);
+               }
+               spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags);
+       }
+}
+
+inline void softmac_ps_mgmt_xmit(struct sk_buff *skb,
+               struct rtllib_device *ieee)
+{
+       short single = ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE;
+       struct rtllib_hdr_3addr  *header =
+               (struct rtllib_hdr_3addr  *) skb->data;
+       u16 fc,type,stype;
+       cb_desc *tcb_desc = (cb_desc *)(skb->cb + 8);
+
+       fc = header->frame_ctl;
+       type = WLAN_FC_GET_TYPE(fc);
+       stype = WLAN_FC_GET_STYPE(fc);
+
+
+       if (stype != RTLLIB_STYPE_PSPOLL)
+               tcb_desc->queue_index = MGNT_QUEUE;
+       else
+               tcb_desc->queue_index = HIGH_QUEUE;
+
+       if (ieee->disable_mgnt_queue)
+               tcb_desc->queue_index = HIGH_QUEUE;
+
+
+       tcb_desc->data_rate = MgntQuery_MgntFrameTxRate(ieee);
+       tcb_desc->RATRIndex = 7;
+       tcb_desc->bTxDisableRateFallBack = 1;
+       tcb_desc->bTxUseDriverAssingedRate = 1;
+       if (single) {
+               if (type != RTLLIB_FTYPE_CTL) {
+                       header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
+
+                       if (ieee->seq_ctrl[0] == 0xFFF)
+                               ieee->seq_ctrl[0] = 0;
+                       else
+                               ieee->seq_ctrl[0]++;
+
+               }
+               /* avoid watchdog triggers */
+               ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
+
+       } else {
+               if (type != RTLLIB_FTYPE_CTL) {
+                       header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
+
+                       if (ieee->seq_ctrl[0] == 0xFFF)
+                               ieee->seq_ctrl[0] = 0;
+                       else
+                               ieee->seq_ctrl[0]++;
+               }
+               ieee->softmac_hard_start_xmit(skb,ieee->dev);
+
+       }
+}
+
+inline struct sk_buff *rtllib_probe_req(struct rtllib_device *ieee)
+{
+       unsigned int len,rate_len;
+       u8 *tag;
+       struct sk_buff *skb;
+       struct rtllib_probe_request *req;
+
+       len = ieee->current_network.ssid_len;
+
+       rate_len = rtllib_MFIE_rate_len(ieee);
+
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr;
+        int alignment;
+        skb = dev_alloc_skb(sizeof(struct rtllib_probe_request) +
+                            2 + len + rate_len + ieee->tx_headroom + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(sizeof(struct rtllib_probe_request) +
+                           2 + len + rate_len + ieee->tx_headroom);
+#endif
+
+       if (!skb)
+               return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       req = (struct rtllib_probe_request *) skb_put(skb,sizeof(struct rtllib_probe_request));
+       req->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_PROBE_REQ);
+       req->header.duration_id = 0;
+
+       memset(req->header.addr1, 0xff, ETH_ALEN);
+       memcpy(req->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memset(req->header.addr3, 0xff, ETH_ALEN);
+
+       tag = (u8 *) skb_put(skb,len+2+rate_len);
+
+       *tag++ = MFIE_TYPE_SSID;
+       *tag++ = len;
+       memcpy(tag, ieee->current_network.ssid, len);
+       tag += len;
+
+       rtllib_MFIE_Brate(ieee,&tag);
+       rtllib_MFIE_Grate(ieee,&tag);
+
+       return skb;
+}
+
+struct sk_buff *rtllib_get_beacon_(struct rtllib_device *ieee);
+
+void rtllib_send_beacon(struct rtllib_device *ieee)
+{
+       struct sk_buff *skb;
+       if (!ieee->ieee_up)
+               return;
+       skb = rtllib_get_beacon_(ieee);
+
+       if (skb){
+               softmac_mgmt_xmit(skb, ieee);
+               ieee->softmac_stats.tx_beacons++;
+       }
+
+       if (ieee->beacon_txing && ieee->ieee_up){
+               mod_timer(&ieee->beacon_timer,jiffies+(MSECS(ieee->current_network.beacon_interval-5)));
+       }
+}
+
+
+void rtllib_send_beacon_cb(unsigned long _ieee)
+{
+       struct rtllib_device *ieee =
+               (struct rtllib_device *) _ieee;
+       unsigned long flags;
+
+       spin_lock_irqsave(&ieee->beacon_lock, flags);
+       rtllib_send_beacon(ieee);
+       spin_unlock_irqrestore(&ieee->beacon_lock, flags);
+}
+
+/*
+ * Description:
+ *              Enable network monitor mode, all rx packets will be received.
+ */
+void rtllib_EnableNetMonitorMode(struct net_device* dev,
+                bool bInitState)
+{
+        struct rtllib_device* ieee = netdev_priv_rsl(dev);
+
+        printk("========>Enter Monitor Mode\n");
+
+        ieee->AllowAllDestAddrHandler(dev, true, !bInitState);
+}
+
+
+/*
+ *      Description:
+ *              Disable network network monitor mode, only packets destinated to
+ *              us will be received.
+ */
+void rtllib_DisableNetMonitorMode(struct net_device* dev,
+                bool bInitState)
+{
+       struct rtllib_device* ieee = netdev_priv_rsl(dev);
+
+        printk("========>Exit Monitor Mode\n");
+
+        ieee->AllowAllDestAddrHandler(dev, false, !bInitState);
+}
+
+
+/*
+ * Description:
+ *              This enables the specialized promiscuous mode required by Intel.
+ *              In this mode, Intel intends to hear traffics from/to other STAs in the same BSS.
+ *              Therefore we don't have to disable checking BSSID and we only need to allow all dest.
+ *              BUT: if we enable checking BSSID then we can't recv packets from other STA.
+ */
+void rtllib_EnableIntelPromiscuousMode(struct net_device* dev,
+                bool bInitState)
+{
+        bool bFilterOutNonAssociatedBSSID = false;
+
+       struct rtllib_device* ieee = netdev_priv_rsl(dev);
+
+        printk("========>Enter Intel Promiscuous Mode\n");
+
+        ieee->AllowAllDestAddrHandler(dev, true, !bInitState);
+        ieee->SetHwRegHandler(dev, HW_VAR_CECHK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID);
+
+        ieee->bNetPromiscuousMode = true;
+}
+
+
+/*
+ * Description:
+ *              This disables the specialized promiscuous mode required by Intel.
+ *              See MgntEnableIntelPromiscuousMode for detail.
+ */
+void rtllib_DisableIntelPromiscuousMode(struct net_device* dev,
+                bool bInitState)
+{
+        bool bFilterOutNonAssociatedBSSID = true;
+
+       struct rtllib_device* ieee = netdev_priv_rsl(dev);
+
+        printk("========>Exit Intel Promiscuous Mode\n");
+
+        ieee->AllowAllDestAddrHandler(dev, false, !bInitState);
+        ieee->SetHwRegHandler(dev, HW_VAR_CECHK_BSSID, (u8*)&bFilterOutNonAssociatedBSSID);
+
+        ieee->bNetPromiscuousMode = false;
+}
+
+void rtllib_send_probe(struct rtllib_device *ieee, u8 is_mesh)
+{
+       struct sk_buff *skb;
+       skb = rtllib_probe_req(ieee);
+       if (skb){
+               softmac_mgmt_xmit(skb, ieee);
+               ieee->softmac_stats.tx_probe_rq++;
+       }
+}
+
+
+void rtllib_send_probe_requests(struct rtllib_device *ieee, u8 is_mesh)
+{
+       if (ieee->active_scan && (ieee->softmac_features &
+           IEEE_SOFTMAC_PROBERQ)) {
+               rtllib_send_probe(ieee, 0);
+               rtllib_send_probe(ieee, 0);
+       }
+}
+
+void rtllib_softmac_hint11d_wq(void *data)
+{
+#ifdef CONFIG_CRDA
+       struct rtllib_device *ieee = container_of_dwork_rsl(data, struct rtllib_device, softmac_hint11d_wq);
+       PRT_DOT11D_INFO pDot11dInfo = GET_DOT11D_INFO(ieee);
+       struct wireless_dev *wdev = &ieee->wdev;
+
+       regulatory_hint_11d(wdev->wiphy, pDot11dInfo->CountryIeBuf, pDot11dInfo->CountryIeLen);
+#endif
+}
+
+void rtllib_update_active_chan_map(struct rtllib_device *ieee)
+{
+#ifdef ENABLE_DOT11D
+       memcpy(ieee->active_channel_map, GET_DOT11D_INFO(ieee)->channel_map, MAX_CHANNEL_NUMBER+1);
+#else
+       memcpy(ieee->active_channel_map, ieee->channel_map, MAX_CHANNEL_NUMBER+1);
+#endif
+}
+
+/* this performs syncro scan blocking the caller until all channels
+ * in the allowed channel map has been checked.
+ */
+void rtllib_softmac_scan_syncro(struct rtllib_device *ieee, u8 is_mesh)
+{
+       short ch = 0;
+
+       rtllib_update_active_chan_map(ieee);
+
+       ieee->be_scan_inprogress = true;
+
+       down(&ieee->scan_sem);
+
+       while(1)
+       {
+
+               do {
+                       ch++;
+                       if (ch > MAX_CHANNEL_NUMBER)
+                               goto out; /* scan completed */
+               } while(!ieee->active_channel_map[ch]);
+
+               /* this fuction can be called in two situations
+                * 1- We have switched to ad-hoc mode and we are
+                *    performing a complete syncro scan before conclude
+                *    there are no interesting cell and to create a
+                *    new one. In this case the link state is
+                *    RTLLIB_NOLINK until we found an interesting cell.
+                *    If so the ieee8021_new_net, called by the RX path
+                *    will set the state to RTLLIB_LINKED, so we stop
+                *    scanning
+                * 2- We are linked and the root uses run iwlist scan.
+                *    So we switch to RTLLIB_LINKED_SCANNING to remember
+                *    that we are still logically linked (not interested in
+                *    new network events, despite for updating the net list,
+                *    but we are temporarly 'unlinked' as the driver shall
+                *    not filter RX frames and the channel is changing.
+                * So the only situation in witch are interested is to check
+                * if the state become LINKED because of the #1 situation
+                */
+
+               if (ieee->state == RTLLIB_LINKED)
+                       goto out;
+               if (ieee->sync_scan_hurryup){
+                       printk("============>sync_scan_hurryup out\n");
+                       goto out;
+               }
+
+               ieee->set_chan(ieee->dev, ch);
+               if (ieee->active_channel_map[ch] == 1)
+               rtllib_send_probe_requests(ieee, 0);
+
+               /* this prevent excessive time wait when we
+                * need to wait for a syncro scan to end..
+                */
+               msleep_interruptible_rsl(RTLLIB_SOFTMAC_SCAN_TIME);
+       }
+out:
+       ieee->actscanning = false;
+       ieee->sync_scan_hurryup = 0;
+
+       if (ieee->state >= RTLLIB_LINKED){
+#ifdef ENABLE_DOT11D
+               if (IS_DOT11D_ENABLE(ieee))
+                       DOT11D_ScanComplete(ieee);
+#endif
+       }
+       up(&ieee->scan_sem);
+
+       ieee->be_scan_inprogress = false;
+
+#ifndef FOR_MOBLIN
+       {
+       union iwreq_data wrqu;
+       memset(&wrqu, 0, sizeof(wrqu));
+       wireless_send_event(ieee->dev,SIOCGIWSCAN,&wrqu,NULL);
+       }
+#endif
+}
+
+void rtllib_softmac_scan_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data, struct rtllib_device, softmac_scan_wq);
+       u8 last_channel = ieee->current_network.channel;
+
+       rtllib_update_active_chan_map(ieee);
+
+       if (!ieee->ieee_up)
+               return;
+       if (rtllib_act_scanning(ieee,true) == true)
+               return;
+
+       down(&ieee->scan_sem);
+
+       if (ieee->eRFPowerState == eRfOff)
+       {
+               printk("======>%s():rf state is eRfOff, return\n",__func__);
+               goto out1;
+       }
+
+       do{
+               ieee->current_network.channel =
+                       (ieee->current_network.channel + 1) % MAX_CHANNEL_NUMBER;
+               if (ieee->scan_watch_dog++ > MAX_CHANNEL_NUMBER)
+               {
+                       if (!ieee->active_channel_map[ieee->current_network.channel])
+                               ieee->current_network.channel = 6;
+                       goto out; /* no good chans */
+               }
+       } while(!ieee->active_channel_map[ieee->current_network.channel]);
+
+       if (ieee->scanning_continue == 0 )
+               goto out;
+
+       ieee->set_chan(ieee->dev, ieee->current_network.channel);
+
+       if (ieee->active_channel_map[ieee->current_network.channel] == 1)
+       rtllib_send_probe_requests(ieee, 0);
+
+       queue_delayed_work_rsl(ieee->wq, &ieee->softmac_scan_wq, MSECS(RTLLIB_SOFTMAC_SCAN_TIME));
+
+       up(&ieee->scan_sem);
+       return;
+
+out:
+#ifdef ENABLE_DOT11D
+       if (IS_DOT11D_ENABLE(ieee))
+               DOT11D_ScanComplete(ieee);
+#endif
+       ieee->current_network.channel = last_channel;
+
+out1:
+       ieee->actscanning = false;
+       ieee->scan_watch_dog = 0;
+       ieee->scanning_continue = 0;
+       up(&ieee->scan_sem);
+}
+
+
+
+void rtllib_beacons_start(struct rtllib_device *ieee)
+{
+       unsigned long flags;
+       spin_lock_irqsave(&ieee->beacon_lock,flags);
+
+       ieee->beacon_txing = 1;
+       rtllib_send_beacon(ieee);
+
+       spin_unlock_irqrestore(&ieee->beacon_lock,flags);
+}
+
+void rtllib_beacons_stop(struct rtllib_device *ieee)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ieee->beacon_lock,flags);
+
+       ieee->beacon_txing = 0;
+       del_timer_sync(&ieee->beacon_timer);
+
+       spin_unlock_irqrestore(&ieee->beacon_lock,flags);
+
+}
+
+
+void rtllib_stop_send_beacons(struct rtllib_device *ieee)
+{
+       if (ieee->stop_send_beacons)
+               ieee->stop_send_beacons(ieee->dev);
+       if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS)
+               rtllib_beacons_stop(ieee);
+}
+
+
+void rtllib_start_send_beacons(struct rtllib_device *ieee)
+{
+       if (ieee->start_send_beacons)
+               ieee->start_send_beacons(ieee->dev);
+       if (ieee->softmac_features & IEEE_SOFTMAC_BEACONS)
+               rtllib_beacons_start(ieee);
+}
+
+
+void rtllib_softmac_stop_scan(struct rtllib_device *ieee)
+{
+
+
+       down(&ieee->scan_sem);
+       ieee->scan_watch_dog = 0;
+       if (ieee->scanning_continue == 1){
+               ieee->scanning_continue = 0;
+               ieee->actscanning = 0;
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,40)
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,67)
+               cancel_delayed_work(&ieee->softmac_scan_wq);
+#endif
+#else
+               del_timer_sync(&ieee->scan_timer);
+#endif
+       }
+
+       up(&ieee->scan_sem);
+}
+
+void rtllib_stop_scan(struct rtllib_device *ieee)
+{
+       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){
+               rtllib_softmac_stop_scan(ieee);
+       }else{
+               if (ieee->rtllib_stop_hw_scan)
+                       ieee->rtllib_stop_hw_scan(ieee->dev);
+       }
+}
+
+void rtllib_stop_scan_syncro(struct rtllib_device *ieee)
+{
+       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){
+                       ieee->sync_scan_hurryup = 1;
+       }else{
+               if (ieee->rtllib_stop_hw_scan)
+                       ieee->rtllib_stop_hw_scan(ieee->dev);
+       }
+}
+
+bool rtllib_act_scanning(struct rtllib_device *ieee, bool sync_scan)
+{
+       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){
+               if (sync_scan){
+                       return ieee->be_scan_inprogress;
+               }else{
+                       return (ieee->actscanning ||ieee->be_scan_inprogress);
+               }
+       }else{
+               return test_bit(STATUS_SCANNING, &ieee->status);
+       }
+}
+
+/* called with ieee->lock held */
+void rtllib_start_scan(struct rtllib_device *ieee)
+{
+       RT_TRACE(COMP_DBG, "===>%s()\n",__func__);
+       if (ieee->rtllib_ips_leave_wq != NULL)
+       ieee->rtllib_ips_leave_wq(ieee->dev);
+
+
+#ifdef ENABLE_DOT11D
+       if (IS_DOT11D_ENABLE(ieee) )
+       {
+               if (IS_COUNTRY_IE_VALID(ieee))
+               {
+                       RESET_CIE_WATCHDOG(ieee);
+               }
+       }
+#endif
+       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN) {
+               if (ieee->scanning_continue == 0) {
+                       ieee->actscanning = true;
+                       ieee->scanning_continue = 1;
+                       queue_delayed_work_rsl(ieee->wq, &ieee->softmac_scan_wq, 0);
+               }
+       } else {
+               if (ieee->rtllib_start_hw_scan)
+                       ieee->rtllib_start_hw_scan(ieee->dev);
+       }
+
+}
+
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,40)
+void rtllib_softmac_scan_cb(unsigned long _dev)
+{
+       unsigned long flags;
+       struct rtllib_device *ieee = (struct rtllib_device *)_dev;
+
+       spin_lock_irqsave(&ieee->lock, flags);
+       rtllib_start_scan(ieee);
+       spin_unlock_irqrestore(&ieee->lock, flags);
+}
+#endif
+
+/* called with wx_sem held */
+void rtllib_start_scan_syncro(struct rtllib_device *ieee, u8 is_mesh)
+{
+#ifdef ENABLE_DOT11D
+       if (IS_DOT11D_ENABLE(ieee) )
+       {
+               if (IS_COUNTRY_IE_VALID(ieee))
+               {
+                       RESET_CIE_WATCHDOG(ieee);
+               }
+       }
+#endif
+       ieee->sync_scan_hurryup = 0;
+       if (ieee->softmac_features & IEEE_SOFTMAC_SCAN){
+               rtllib_softmac_scan_syncro(ieee, is_mesh);
+       }else{
+               if (ieee->rtllib_start_hw_scan)
+                       ieee->rtllib_start_hw_scan(ieee->dev);
+       }
+
+}
+
+inline struct sk_buff *rtllib_authentication_req(struct rtllib_network *beacon,
+       struct rtllib_device *ieee, int challengelen,u8 * daddr)
+{
+       struct sk_buff *skb;
+       struct rtllib_authentication *auth;
+       int  len = 0;
+       len = sizeof(struct rtllib_authentication) + challengelen + ieee->tx_headroom + 4;
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr;
+        int alignment;
+        skb = dev_alloc_skb(len + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(len);
+#endif
+
+       if (!skb) return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       auth = (struct rtllib_authentication *)
+               skb_put(skb, sizeof(struct rtllib_authentication));
+
+       auth->header.frame_ctl = RTLLIB_STYPE_AUTH;
+       if (challengelen) auth->header.frame_ctl |= RTLLIB_FCTL_WEP;
+
+       auth->header.duration_id = 0x013a;
+               memcpy(auth->header.addr1, beacon->bssid, ETH_ALEN);
+       memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(auth->header.addr3, beacon->bssid, ETH_ALEN);
+       if (ieee->auth_mode == 0)
+               auth->algorithm = WLAN_AUTH_OPEN;
+       else if (ieee->auth_mode == 1)
+               auth->algorithm = WLAN_AUTH_SHARED_KEY;
+       else if (ieee->auth_mode == 2)
+               auth->algorithm = WLAN_AUTH_OPEN;
+       auth->transaction = cpu_to_le16(ieee->associate_seq);
+       ieee->associate_seq++;
+
+       auth->status = cpu_to_le16(WLAN_STATUS_SUCCESS);
+
+       return skb;
+
+}
+
+void constructWMMIE(u8* wmmie, u8* wmm_len,u8 oui_subtype)
+{
+       u8      szQoSOUI[] ={221, 0, 0x00, 0x50, 0xf2, 0x02, 0, 1};
+
+       if (oui_subtype == OUI_SUBTYPE_QOS_CAPABI)
+       {
+               szQoSOUI[0] = 46;
+               szQoSOUI[1] = *wmm_len;
+               memcpy(wmmie,szQoSOUI,3);
+               *wmm_len = 3;
+       }
+       else
+       {
+               szQoSOUI[1] = *wmm_len + 6;
+               szQoSOUI[6] = oui_subtype;
+               memcpy(wmmie, szQoSOUI, 8);
+               *(wmmie+8) = 0;
+               *wmm_len = 9;
+       }
+}
+
+static struct sk_buff* rtllib_probe_resp(struct rtllib_device *ieee, u8 *dest)
+{
+       u8 *tag;
+       int beacon_size;
+       struct rtllib_probe_response *beacon_buf;
+       struct sk_buff *skb = NULL;
+       int encrypt;
+       int atim_len,erp_len;
+       struct rtllib_crypt_data* crypt;
+
+       char *ssid = ieee->current_network.ssid;
+       int ssid_len = ieee->current_network.ssid_len;
+       int rate_len = ieee->current_network.rates_len+2;
+       int rate_ex_len = ieee->current_network.rates_ex_len;
+       int wpa_ie_len = ieee->wpa_ie_len;
+       u8 erpinfo_content = 0;
+
+       u8* tmp_ht_cap_buf = NULL;
+       u8 tmp_ht_cap_len = 0;
+       u8* tmp_ht_info_buf = NULL;
+       u8 tmp_ht_info_len = 0;
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       u8* tmp_generic_ie_buf = NULL;
+       u8 tmp_generic_ie_len = 0;
+
+       if (rate_ex_len > 0)
+               rate_ex_len+=2;
+
+       if (ieee->current_network.capability & WLAN_CAPABILITY_IBSS)
+               atim_len = 4;
+       else
+               atim_len = 0;
+
+      if ((ieee->current_network.mode == IEEE_G)
+               ||( ieee->current_network.mode == IEEE_N_24G && ieee->pHTInfo->bCurSuppCCK)) {
+               erp_len = 3;
+               erpinfo_content = 0;
+               if (ieee->current_network.buseprotection)
+                       erpinfo_content |= ERP_UseProtection;
+       }
+       else
+               erp_len = 0;
+
+       crypt = ieee->crypt[ieee->tx_keyidx];
+       encrypt = ieee->host_encrypt && crypt && crypt->ops &&
+               ((0 == strcmp(crypt->ops->name, "WEP") || wpa_ie_len));
+       if (ieee->pHTInfo->bCurrentHTSupport){
+               tmp_ht_cap_buf =(u8*) &(ieee->pHTInfo->SelfHTCap);
+               tmp_ht_cap_len = sizeof(ieee->pHTInfo->SelfHTCap);
+               tmp_ht_info_buf =(u8*) &(ieee->pHTInfo->SelfHTInfo);
+               tmp_ht_info_len = sizeof(ieee->pHTInfo->SelfHTInfo);
+               HTConstructCapabilityElement(ieee, tmp_ht_cap_buf, &tmp_ht_cap_len,encrypt, false);
+               HTConstructInfoElement(ieee,tmp_ht_info_buf,&tmp_ht_info_len, encrypt);
+
+
+               if (pHTInfo->bRegRT2RTAggregation)
+               {
+                       tmp_generic_ie_buf = ieee->pHTInfo->szRT2RTAggBuffer;
+                       tmp_generic_ie_len = sizeof(ieee->pHTInfo->szRT2RTAggBuffer);
+                       HTConstructRT2RTAggElement(ieee, tmp_generic_ie_buf, &tmp_generic_ie_len);
+               }
+       }
+
+       beacon_size = sizeof(struct rtllib_probe_response)+2+
+               ssid_len
+               +3
+               +rate_len
+               +rate_ex_len
+               +atim_len
+               +erp_len
+               +wpa_ie_len
+               +ieee->tx_headroom;
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+        skb = dev_alloc_skb(beacon_size + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(beacon_size);
+#endif
+       if (!skb)
+               return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       beacon_buf = (struct rtllib_probe_response*) skb_put(skb, (beacon_size - ieee->tx_headroom));
+       memcpy (beacon_buf->header.addr1, dest,ETH_ALEN);
+       memcpy (beacon_buf->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy (beacon_buf->header.addr3, ieee->current_network.bssid, ETH_ALEN);
+
+       beacon_buf->header.duration_id = 0;
+       beacon_buf->beacon_interval =
+               cpu_to_le16(ieee->current_network.beacon_interval);
+       beacon_buf->capability =
+               cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_IBSS);
+       beacon_buf->capability |=
+               cpu_to_le16(ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE);
+
+       if (ieee->short_slot && (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_SLOT_TIME))
+               cpu_to_le16((beacon_buf->capability |= WLAN_CAPABILITY_SHORT_SLOT_TIME));
+
+       crypt = ieee->crypt[ieee->tx_keyidx];
+       if (encrypt)
+               beacon_buf->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
+
+
+       beacon_buf->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_PROBE_RESP);
+       beacon_buf->info_element[0].id = MFIE_TYPE_SSID;
+       beacon_buf->info_element[0].len = ssid_len;
+
+       tag = (u8*) beacon_buf->info_element[0].data;
+
+       memcpy(tag, ssid, ssid_len);
+
+       tag += ssid_len;
+
+       *(tag++) = MFIE_TYPE_RATES;
+       *(tag++) = rate_len-2;
+       memcpy(tag,ieee->current_network.rates,rate_len-2);
+       tag+=rate_len-2;
+
+       *(tag++) = MFIE_TYPE_DS_SET;
+       *(tag++) = 1;
+       *(tag++) = ieee->current_network.channel;
+
+       if (atim_len){
+       u16 val16;
+               *(tag++) = MFIE_TYPE_IBSS_SET;
+               *(tag++) = 2;
+                val16 = cpu_to_le16(ieee->current_network.atim_window);
+               memcpy((u8 *)tag, (u8 *)&val16, 2);
+               tag+=2;
+       }
+
+       if (erp_len){
+               *(tag++) = MFIE_TYPE_ERP;
+               *(tag++) = 1;
+               *(tag++) = erpinfo_content;
+       }
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (tmp_ht_cap_len){
+               *(tag++) = MFIE_TYPE_HT_CAP;
+               *(tag++) = tmp_ht_cap_len - 2;
+               memcpy(tag, tmp_ht_cap_buf, tmp_ht_cap_len - 2);
+               tag += tmp_ht_cap_len - 2;
+       }
+#endif
+       if (rate_ex_len){
+               *(tag++) = MFIE_TYPE_RATES_EX;
+               *(tag++) = rate_ex_len-2;
+               memcpy(tag,ieee->current_network.rates_ex,rate_ex_len-2);
+               tag+=rate_ex_len-2;
+       }
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (tmp_ht_info_len){
+               *(tag++) = MFIE_TYPE_HT_INFO;
+               *(tag++) = tmp_ht_info_len - 2;
+               memcpy(tag, tmp_ht_info_buf, tmp_ht_info_len -2);
+               tag += tmp_ht_info_len - 2;
+       }
+#endif
+
+       if (wpa_ie_len)
+       {
+               if (ieee->iw_mode == IW_MODE_ADHOC)
+               {
+                       memcpy(&ieee->wpa_ie[14], &ieee->wpa_ie[8], 4);
+               }
+               memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
+               tag += ieee->wpa_ie_len;
+       }
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (tmp_generic_ie_len)
+       {
+               (*tag++) = 0xdd;
+               (*tag++) = tmp_generic_ie_len - 2;
+               memcpy(tag,tmp_generic_ie_buf,tmp_generic_ie_len -2);
+               tag += tmp_generic_ie_len -2;
+
+       }
+#endif
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       if (wmm_len) {
+               memcpy(tag,wmmie,wmm_len);
+               tag += wmm_len;
+       }
+#endif
+       return skb;
+}
+
+struct sk_buff* rtllib_assoc_resp(struct rtllib_device *ieee, u8 *dest)
+{
+       struct sk_buff *skb;
+       u8* tag;
+
+       struct rtllib_crypt_data* crypt;
+       struct rtllib_assoc_response_frame *assoc;
+       short encrypt;
+
+       unsigned int rate_len = rtllib_MFIE_rate_len(ieee);
+       int len = sizeof(struct rtllib_assoc_response_frame) + rate_len + ieee->tx_headroom;
+
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+        skb = dev_alloc_skb(len + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(len);
+#endif
+
+       if (!skb)
+               return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       assoc = (struct rtllib_assoc_response_frame *)
+               skb_put(skb,sizeof(struct rtllib_assoc_response_frame));
+
+       assoc->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_ASSOC_RESP);
+       memcpy(assoc->header.addr1, dest,ETH_ALEN);
+       memcpy(assoc->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(assoc->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       assoc->capability = cpu_to_le16(ieee->iw_mode == IW_MODE_MASTER ?
+               WLAN_CAPABILITY_ESS : WLAN_CAPABILITY_IBSS);
+
+
+       if (ieee->short_slot)
+               assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT_TIME);
+
+       if (ieee->host_encrypt)
+               crypt = ieee->crypt[ieee->tx_keyidx];
+       else
+               crypt = NULL;
+
+       encrypt = ( crypt && crypt->ops);
+
+       if (encrypt)
+               assoc->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
+
+       assoc->status = 0;
+       assoc->aid = cpu_to_le16(ieee->assoc_id);
+       if (ieee->assoc_id == 0x2007)
+               ieee->assoc_id=0;
+       else
+               ieee->assoc_id++;
+
+       tag = (u8*) skb_put(skb, rate_len);
+       rtllib_MFIE_Brate(ieee, &tag);
+       rtllib_MFIE_Grate(ieee, &tag);
+
+       return skb;
+}
+
+struct sk_buff* rtllib_auth_resp(struct rtllib_device *ieee,int status, u8 *dest)
+{
+       struct sk_buff *skb = NULL;
+       struct rtllib_authentication *auth;
+       int len = ieee->tx_headroom + sizeof(struct rtllib_authentication)+1;
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+        skb = dev_alloc_skb(len + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(len);
+#endif
+       if (!skb)
+               return NULL;
+
+       skb->len = sizeof(struct rtllib_authentication);
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       auth = (struct rtllib_authentication *)
+               skb_put(skb, sizeof(struct rtllib_authentication));
+
+       auth->status = cpu_to_le16(status);
+       auth->transaction = cpu_to_le16(2);
+       auth->algorithm = cpu_to_le16(WLAN_AUTH_OPEN);
+
+       memcpy(auth->header.addr3, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(auth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(auth->header.addr1, dest, ETH_ALEN);
+       auth->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_AUTH);
+       return skb;
+
+
+}
+
+struct sk_buff* rtllib_null_func(struct rtllib_device *ieee,short pwr)
+{
+       struct sk_buff *skb;
+       struct rtllib_hdr_3addr* hdr;
+
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+        skb = dev_alloc_skb(sizeof(struct rtllib_hdr_3addr) + ieee->tx_headroom + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(sizeof(struct rtllib_hdr_3addr)+ieee->tx_headroom);
+#endif
+       if (!skb)
+               return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+       skb_reserve(skb, ieee->tx_headroom);
+
+       hdr = (struct rtllib_hdr_3addr*)skb_put(skb,sizeof(struct rtllib_hdr_3addr));
+
+       memcpy(hdr->addr1, ieee->current_network.bssid, ETH_ALEN);
+       memcpy(hdr->addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(hdr->addr3, ieee->current_network.bssid, ETH_ALEN);
+
+       hdr->frame_ctl = cpu_to_le16(RTLLIB_FTYPE_DATA |
+               RTLLIB_STYPE_NULLFUNC | RTLLIB_FCTL_TODS |
+               (pwr ? RTLLIB_FCTL_PM:0));
+
+       return skb;
+
+
+}
+
+struct sk_buff* rtllib_pspoll_func(struct rtllib_device *ieee)
+{
+       struct sk_buff *skb;
+       struct rtllib_pspoll_hdr* hdr;
+
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+        skb = dev_alloc_skb(sizeof(struct rtllib_pspoll_hdr) + ieee->tx_headroom + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(sizeof(struct rtllib_pspoll_hdr)+ieee->tx_headroom);
+#endif
+       if (!skb)
+               return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+       skb_reserve(skb, ieee->tx_headroom);
+
+       hdr = (struct rtllib_pspoll_hdr*)skb_put(skb,sizeof(struct rtllib_pspoll_hdr));
+
+       memcpy(hdr->bssid, ieee->current_network.bssid, ETH_ALEN);
+       memcpy(hdr->ta, ieee->dev->dev_addr, ETH_ALEN);
+
+       hdr->aid = cpu_to_le16(ieee->assoc_id | 0xc000);
+       hdr->frame_ctl = cpu_to_le16(RTLLIB_FTYPE_CTL |RTLLIB_STYPE_PSPOLL | RTLLIB_FCTL_PM);
+
+       return skb;
+
+}
+
+void rtllib_resp_to_assoc_rq(struct rtllib_device *ieee, u8* dest)
+{
+       struct sk_buff *buf = rtllib_assoc_resp(ieee, dest);
+
+       if (buf)
+               softmac_mgmt_xmit(buf, ieee);
+}
+
+
+void rtllib_resp_to_auth(struct rtllib_device *ieee, int s, u8* dest)
+{
+       struct sk_buff *buf = rtllib_auth_resp(ieee, s, dest);
+
+       if (buf)
+               softmac_mgmt_xmit(buf, ieee);
+}
+
+
+void rtllib_resp_to_probe(struct rtllib_device *ieee, u8 *dest)
+{
+
+       struct sk_buff *buf = rtllib_probe_resp(ieee, dest);
+       if (buf)
+               softmac_mgmt_xmit(buf, ieee);
+}
+
+
+inline int SecIsInPMKIDList(struct rtllib_device *ieee, u8 *bssid)
+{
+       int i = 0;
+
+       do
+       {
+               if ((ieee->PMKIDList[i].bUsed) && (memcmp(ieee->PMKIDList[i].Bssid, bssid, ETH_ALEN) == 0))
+               {
+                       break;
+               }
+               else
+               {
+                       i++;
+               }
+       } while (i < NUM_PMKID_CACHE);
+
+       if (i == NUM_PMKID_CACHE)
+       {
+               i = -1;
+       }
+       else
+       {
+       }
+
+       return (i);
+
+}
+
+
+inline struct sk_buff *rtllib_association_req(struct rtllib_network *beacon,struct rtllib_device *ieee)
+{
+       struct sk_buff *skb;
+
+       struct rtllib_assoc_request_frame *hdr;
+       u8 *tag, *ies;
+       int i;
+       u8* ht_cap_buf = NULL;
+       u8 ht_cap_len=0;
+       u8* realtek_ie_buf=NULL;
+       u8 realtek_ie_len=0;
+       int wpa_ie_len= ieee->wpa_ie_len;
+       int wps_ie_len = ieee->wps_ie_len;
+       unsigned int ckip_ie_len=0;
+       unsigned int ccxrm_ie_len=0;
+       unsigned int cxvernum_ie_len=0;
+       struct rtllib_crypt_data* crypt;
+       int encrypt;
+       int     PMKCacheIdx;
+
+       unsigned int rate_len = (beacon->rates_len?(beacon->rates_len+2):0) + (beacon->rates_ex_len?(beacon->rates_ex_len)+2:0);
+
+       unsigned int wmm_info_len = beacon->qos_data.supported?9:0;
+       unsigned int turbo_info_len = beacon->Turbo_Enable?9:0;
+
+       int len = 0;
+       crypt = ieee->crypt[ieee->tx_keyidx];
+       if (crypt != NULL) {
+               encrypt = ieee->host_encrypt && crypt && crypt->ops && ((0 == strcmp(crypt->ops->name,"WEP") || wpa_ie_len));
+       } else {
+               encrypt = 0;
+       }
+
+#ifdef ENABLE_TKIP11N
+       if (ieee->bForcedBgMode == true)
+#else
+       if ((ieee->rtllib_ap_sec_type && (ieee->rtllib_ap_sec_type(ieee)&SEC_ALG_TKIP)) ||(ieee->bForcedBgMode == true))
+#endif
+       {
+               ieee->pHTInfo->bEnableHT = 0;
+               ieee->mode = WIRELESS_MODE_G;
+       }
+
+       if (ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT)
+       {
+               ht_cap_buf = (u8*)&(ieee->pHTInfo->SelfHTCap);
+               ht_cap_len = sizeof(ieee->pHTInfo->SelfHTCap);
+               HTConstructCapabilityElement(ieee, ht_cap_buf, &ht_cap_len, encrypt, true);
+               if (ieee->pHTInfo->bCurrentRT2RTAggregation) {
+                       realtek_ie_buf = ieee->pHTInfo->szRT2RTAggBuffer;
+                       realtek_ie_len = sizeof( ieee->pHTInfo->szRT2RTAggBuffer);
+                       HTConstructRT2RTAggElement(ieee, realtek_ie_buf, &realtek_ie_len);
+
+               }
+       }
+
+       if (beacon->bCkipSupported)
+       {
+               ckip_ie_len = 30+2;
+       }
+       if (beacon->bCcxRmEnable)
+       {
+               ccxrm_ie_len = 6+2;
+       }
+       if ( beacon->BssCcxVerNumber >= 2 )
+       {
+               cxvernum_ie_len = 5+2;
+       }
+
+       PMKCacheIdx = SecIsInPMKIDList(ieee, ieee->current_network.bssid);
+       if (PMKCacheIdx >= 0)
+       {
+               wpa_ie_len += 18;
+               printk("[PMK cache]: WPA2 IE length: %x\n", wpa_ie_len);
+       }
+       len = sizeof(struct rtllib_assoc_request_frame)+ 2
+               + beacon->ssid_len
+               + rate_len
+               + wpa_ie_len
+               + wps_ie_len
+               + wmm_info_len
+               + turbo_info_len
+                + ht_cap_len
+               + realtek_ie_len
+               + ckip_ie_len
+               + ccxrm_ie_len
+               + cxvernum_ie_len
+               + ieee->tx_headroom;
+
+#ifdef USB_USE_ALIGNMENT
+       u32 Tmpaddr=0;
+       int alignment=0;
+       skb = dev_alloc_skb(len + USB_512B_ALIGNMENT_SIZE);
+#else
+       skb = dev_alloc_skb(len);
+#endif
+
+       if (!skb)
+               return NULL;
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+
+       skb_reserve(skb, ieee->tx_headroom);
+
+       hdr = (struct rtllib_assoc_request_frame *)
+               skb_put(skb, sizeof(struct rtllib_assoc_request_frame)+2);
+
+
+       hdr->header.frame_ctl = RTLLIB_STYPE_ASSOC_REQ;
+       hdr->header.duration_id= 37;
+       memcpy(hdr->header.addr1, beacon->bssid, ETH_ALEN);
+       memcpy(hdr->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(hdr->header.addr3, beacon->bssid, ETH_ALEN);
+
+       memcpy(ieee->ap_mac_addr, beacon->bssid, ETH_ALEN);
+
+       hdr->capability = cpu_to_le16(WLAN_CAPABILITY_ESS);
+       if (beacon->capability & WLAN_CAPABILITY_PRIVACY )
+               hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_PRIVACY);
+
+       if (beacon->capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
+               hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_PREAMBLE);
+
+       if (ieee->short_slot && (beacon->capability&WLAN_CAPABILITY_SHORT_SLOT_TIME))
+               hdr->capability |= cpu_to_le16(WLAN_CAPABILITY_SHORT_SLOT_TIME);
+
+
+       hdr->listen_interval = beacon->listen_interval;
+
+       hdr->info_element[0].id = MFIE_TYPE_SSID;
+
+       hdr->info_element[0].len = beacon->ssid_len;
+       tag = skb_put(skb, beacon->ssid_len);
+       memcpy(tag, beacon->ssid, beacon->ssid_len);
+
+       tag = skb_put(skb, rate_len);
+
+       if (beacon->rates_len){
+               *tag++ = MFIE_TYPE_RATES;
+               *tag++ = beacon->rates_len;
+               for (i=0;i<beacon->rates_len;i++){
+                       *tag++ = beacon->rates[i];
+               }
+       }
+
+       if (beacon->rates_ex_len){
+               *tag++ = MFIE_TYPE_RATES_EX;
+               *tag++ = beacon->rates_ex_len;
+               for (i=0;i<beacon->rates_ex_len;i++){
+                       *tag++ = beacon->rates_ex[i];
+               }
+       }
+
+       if ( beacon->bCkipSupported )
+       {
+               static u8       AironetIeOui[] = {0x00, 0x01, 0x66};
+               u8      CcxAironetBuf[30];
+               OCTET_STRING    osCcxAironetIE;
+
+               memset(CcxAironetBuf, 0,30);
+               osCcxAironetIE.Octet = CcxAironetBuf;
+               osCcxAironetIE.Length = sizeof(CcxAironetBuf);
+               memcpy(osCcxAironetIE.Octet, AironetIeOui, sizeof(AironetIeOui));
+
+               osCcxAironetIE.Octet[IE_CISCO_FLAG_POSITION] |=  (SUPPORT_CKIP_PK|SUPPORT_CKIP_MIC) ;
+               tag = skb_put(skb, ckip_ie_len);
+               *tag++ = MFIE_TYPE_AIRONET;
+               *tag++ = osCcxAironetIE.Length;
+               memcpy(tag,osCcxAironetIE.Octet,osCcxAironetIE.Length);
+               tag += osCcxAironetIE.Length;
+       }
+
+       if (beacon->bCcxRmEnable)
+       {
+               static u8 CcxRmCapBuf[] = {0x00, 0x40, 0x96, 0x01, 0x01, 0x00};
+               OCTET_STRING osCcxRmCap;
+
+               osCcxRmCap.Octet = CcxRmCapBuf;
+               osCcxRmCap.Length = sizeof(CcxRmCapBuf);
+               tag = skb_put(skb,ccxrm_ie_len);
+               *tag++ = MFIE_TYPE_GENERIC;
+               *tag++ = osCcxRmCap.Length;
+               memcpy(tag,osCcxRmCap.Octet,osCcxRmCap.Length);
+               tag += osCcxRmCap.Length;
+       }
+
+       if ( beacon->BssCcxVerNumber >= 2 )
+       {
+               u8                      CcxVerNumBuf[] = {0x00, 0x40, 0x96, 0x03, 0x00};
+               OCTET_STRING    osCcxVerNum;
+               CcxVerNumBuf[4] = beacon->BssCcxVerNumber;
+               osCcxVerNum.Octet = CcxVerNumBuf;
+               osCcxVerNum.Length = sizeof(CcxVerNumBuf);
+               tag = skb_put(skb,cxvernum_ie_len);
+               *tag++ = MFIE_TYPE_GENERIC;
+               *tag++ = osCcxVerNum.Length;
+               memcpy(tag,osCcxVerNum.Octet,osCcxVerNum.Length);
+               tag += osCcxVerNum.Length;
+       }
+       if (ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT){
+               if (ieee->pHTInfo->ePeerHTSpecVer != HT_SPEC_VER_EWC)
+               {
+                       tag = skb_put(skb, ht_cap_len);
+                       *tag++ = MFIE_TYPE_HT_CAP;
+                       *tag++ = ht_cap_len - 2;
+                       memcpy(tag, ht_cap_buf,ht_cap_len -2);
+                       tag += ht_cap_len -2;
+               }
+       }
+
+
+       if (wpa_ie_len){
+               tag = skb_put(skb, ieee->wpa_ie_len);
+               memcpy(tag, ieee->wpa_ie, ieee->wpa_ie_len);
+
+               if (PMKCacheIdx >= 0)
+               {
+                       tag = skb_put(skb, 18);
+                       *tag = 1;
+                       *(tag + 1) = 0;
+                       memcpy((tag + 2), &ieee->PMKIDList[PMKCacheIdx].PMKID, 16);
+               }
+       }
+       if (wmm_info_len) {
+               tag = skb_put(skb,wmm_info_len);
+               rtllib_WMM_Info(ieee, &tag);
+       }
+
+       if (wps_ie_len && ieee->wps_ie) {
+               tag = skb_put(skb, wps_ie_len);
+               memcpy(tag, ieee->wps_ie, wps_ie_len);
+       }
+
+       tag = skb_put(skb,turbo_info_len);
+        if (turbo_info_len)
+                rtllib_TURBO_Info(ieee, &tag);
+
+       if (ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT){
+               if (ieee->pHTInfo->ePeerHTSpecVer == HT_SPEC_VER_EWC)
+               {
+                       tag = skb_put(skb, ht_cap_len);
+                       *tag++ = MFIE_TYPE_GENERIC;
+                       *tag++ = ht_cap_len - 2;
+                       memcpy(tag, ht_cap_buf,ht_cap_len - 2);
+                       tag += ht_cap_len -2;
+               }
+
+               if (ieee->pHTInfo->bCurrentRT2RTAggregation){
+                       tag = skb_put(skb, realtek_ie_len);
+                       *tag++ = MFIE_TYPE_GENERIC;
+                       *tag++ = realtek_ie_len - 2;
+                       memcpy(tag, realtek_ie_buf,realtek_ie_len -2 );
+               }
+       }
+
+       if (ieee->assocreq_ies){
+               kfree(ieee->assocreq_ies);
+               ieee->assocreq_ies = NULL;
+       }
+       ies = &(hdr->info_element[0].id);
+       ieee->assocreq_ies_len = (skb->data + skb->len) - ies;
+       ieee->assocreq_ies = kmalloc(ieee->assocreq_ies_len, GFP_ATOMIC);
+       if (ieee->assocreq_ies)
+               memcpy(ieee->assocreq_ies, ies, ieee->assocreq_ies_len);
+       else{
+               printk("%s()Warning: can't alloc memory for assocreq_ies\n", __func__);
+               ieee->assocreq_ies_len = 0;
+       }
+
+       return skb;
+}
+
+void rtllib_associate_abort(struct rtllib_device *ieee)
+{
+
+       unsigned long flags;
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       ieee->associate_seq++;
+
+       /* don't scan, and avoid to have the RX path possibily
+        * try again to associate. Even do not react to AUTH or
+        * ASSOC response. Just wait for the retry wq to be scheduled.
+        * Here we will check if there are good nets to associate
+        * with, so we retry or just get back to NO_LINK and scanning
+        */
+       if (ieee->state == RTLLIB_ASSOCIATING_AUTHENTICATING){
+               RTLLIB_DEBUG_MGMT("Authentication failed\n");
+               ieee->softmac_stats.no_auth_rs++;
+       }else{
+               RTLLIB_DEBUG_MGMT("Association failed\n");
+               ieee->softmac_stats.no_ass_rs++;
+       }
+
+       ieee->state = RTLLIB_ASSOCIATING_RETRY;
+
+       queue_delayed_work_rsl(ieee->wq, &ieee->associate_retry_wq, \
+                           RTLLIB_SOFTMAC_ASSOC_RETRY_TIME);
+
+       spin_unlock_irqrestore(&ieee->lock, flags);
+}
+
+void rtllib_associate_abort_cb(unsigned long dev)
+{
+       rtllib_associate_abort((struct rtllib_device *) dev);
+}
+
+void rtllib_associate_step1(struct rtllib_device *ieee,u8 * daddr)
+{
+       struct rtllib_network *beacon = &ieee->current_network;
+       struct sk_buff *skb;
+
+       RTLLIB_DEBUG_MGMT("Stopping scan\n");
+
+       ieee->softmac_stats.tx_auth_rq++;
+
+       skb=rtllib_authentication_req(beacon, ieee, 0,daddr);
+
+       if (!skb)
+               rtllib_associate_abort(ieee);
+       else{
+               ieee->state = RTLLIB_ASSOCIATING_AUTHENTICATING ;
+               RTLLIB_DEBUG_MGMT("Sending authentication request\n");
+               softmac_mgmt_xmit(skb, ieee);
+               if (!timer_pending(&ieee->associate_timer)){
+                       ieee->associate_timer.expires = jiffies + (HZ / 2);
+                       add_timer(&ieee->associate_timer);
+               }
+       }
+}
+
+void rtllib_auth_challenge(struct rtllib_device *ieee, u8 *challenge, int chlen)
+{
+       u8 *c;
+       struct sk_buff *skb;
+       struct rtllib_network *beacon = &ieee->current_network;
+
+       ieee->associate_seq++;
+       ieee->softmac_stats.tx_auth_rq++;
+
+       skb = rtllib_authentication_req(beacon, ieee, chlen+2,beacon->bssid);
+
+       if (!skb)
+               rtllib_associate_abort(ieee);
+       else{
+               c = skb_put(skb, chlen+2);
+               *(c++) = MFIE_TYPE_CHALLENGE;
+               *(c++) = chlen;
+               memcpy(c, challenge, chlen);
+
+               RTLLIB_DEBUG_MGMT("Sending authentication challenge response\n");
+
+               rtllib_encrypt_fragment(ieee, skb, sizeof(struct rtllib_hdr_3addr  ));
+
+               softmac_mgmt_xmit(skb, ieee);
+               mod_timer(&ieee->associate_timer, jiffies + (HZ/2));
+       }
+       kfree(challenge);
+}
+
+void rtllib_associate_step2(struct rtllib_device *ieee)
+{
+       struct sk_buff* skb;
+       struct rtllib_network *beacon = &ieee->current_network;
+
+       del_timer_sync(&ieee->associate_timer);
+
+       RTLLIB_DEBUG_MGMT("Sending association request\n");
+
+       ieee->softmac_stats.tx_ass_rq++;
+       skb=rtllib_association_req(beacon, ieee);
+       if (!skb)
+               rtllib_associate_abort(ieee);
+       else{
+               softmac_mgmt_xmit(skb, ieee);
+               mod_timer(&ieee->associate_timer, jiffies + (HZ/2));
+       }
+}
+
+#define CANCELLED  2
+void rtllib_associate_complete_wq(void *data)
+{
+       struct rtllib_device *ieee = (struct rtllib_device *)container_of_work_rsl(data, struct rtllib_device, associate_complete_wq);
+       PRT_POWER_SAVE_CONTROL pPSC = (PRT_POWER_SAVE_CONTROL)(&(ieee->PowerSaveControl));
+       printk(KERN_INFO "Associated successfully\n");
+       if (ieee->is_silent_reset == 0){
+            printk("normal associate\n");
+            notify_wx_assoc_event(ieee);
+        }
+
+       netif_carrier_on(ieee->dev);
+       ieee->is_roaming = false;
+       if (rtllib_is_54g(&ieee->current_network) &&
+               (ieee->modulation & RTLLIB_OFDM_MODULATION)){
+
+               ieee->rate = 108;
+               printk(KERN_INFO"Using G rates:%d\n", ieee->rate);
+       }else{
+               ieee->rate = 22;
+               ieee->SetWirelessMode(ieee->dev, IEEE_B);
+               printk(KERN_INFO"Using B rates:%d\n", ieee->rate);
+       }
+       if (ieee->pHTInfo->bCurrentHTSupport&&ieee->pHTInfo->bEnableHT)
+       {
+               printk("Successfully associated, ht enabled\n");
+               HTOnAssocRsp(ieee);
+       } else {
+               printk("Successfully associated, ht not enabled(%d, %d)\n",
+                               ieee->pHTInfo->bCurrentHTSupport, ieee->pHTInfo->bEnableHT);
+               memset(ieee->dot11HTOperationalRateSet, 0, 16);
+       }
+       ieee->LinkDetectInfo.SlotNum = 2 * (1 + ieee->current_network.beacon_interval/500);
+       if (ieee->LinkDetectInfo.NumRecvBcnInPeriod==0||ieee->LinkDetectInfo.NumRecvDataInPeriod==0 )
+       {
+               ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1;
+               ieee->LinkDetectInfo.NumRecvDataInPeriod= 1;
+       }
+       pPSC->LpsIdleCount = 0;
+       ieee->link_change(ieee->dev);
+
+        if (ieee->is_silent_reset == 1) {
+               printk("silent reset associate\n");
+               ieee->is_silent_reset = 0;
+        }
+
+       if (ieee->data_hard_resume)
+               ieee->data_hard_resume(ieee->dev);
+
+#ifdef RTK_DMP_PLATFORM
+       kobject_hotplug(&ieee->dev->class_dev.kobj, KOBJ_LINKUP);
+#endif
+}
+
+static void rtllib_sta_send_associnfo(struct rtllib_device *ieee)
+{
+       char *buf;
+       size_t len;
+       int i;
+       union iwreq_data wrqu;
+
+               return;
+
+
+       buf = kmalloc(50 + 2 * (ieee->assocreq_ies_len + ieee->assocresp_ies_len), GFP_ATOMIC);
+       if (!buf)
+               return;
+
+       len = sprintf(buf, "ASSOCINFO(");
+       if (ieee->assocreq_ies) {
+               len += sprintf(buf + len, "ReqIEs=");
+               for (i = 0; i < ieee->assocreq_ies_len; i++) {
+                       len += sprintf(buf + len, "%02x", ieee->assocreq_ies[i]);
+               }
+       }
+       if (ieee->assocresp_ies) {
+               if (ieee->assocreq_ies)
+                       len += sprintf(buf + len, " ");
+               len += sprintf(buf + len, "RespIEs=");
+               for (i = 0; i < ieee->assocresp_ies_len; i++) {
+                       len += sprintf(buf + len, "%02x", ieee->assocresp_ies[i]);
+               }
+       }
+       len += sprintf(buf + len, ")");
+
+       if (len > IW_CUSTOM_MAX) {
+               len = sprintf(buf, "ASSOCRESPIE=");
+               for (i = 0; i < ieee->assocresp_ies_len; i++) {
+                       len += sprintf(buf + len, "%02x", ieee->assocresp_ies[i]);
+               }
+       }
+
+       if (len <= IW_CUSTOM_MAX) {
+               memset(&wrqu, 0, sizeof(wrqu));
+               wrqu.data.length = len;
+               wireless_send_event(ieee->dev, IWEVCUSTOM, &wrqu, buf);
+       }
+
+       kfree(buf);
+}
+
+void rtllib_associate_complete(struct rtllib_device *ieee)
+{
+       del_timer_sync(&ieee->associate_timer);
+
+       ieee->state = RTLLIB_LINKED;
+       rtllib_sta_send_associnfo(ieee);
+
+       queue_work_rsl(ieee->wq, &ieee->associate_complete_wq);
+}
+
+void rtllib_associate_procedure_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data, struct rtllib_device, associate_procedure_wq);
+       rtllib_stop_scan_syncro(ieee);
+       if (ieee->rtllib_ips_leave != NULL)
+               ieee->rtllib_ips_leave(ieee->dev);
+       down(&ieee->wx_sem);
+
+       if (ieee->data_hard_stop)
+               ieee->data_hard_stop(ieee->dev);
+
+       rtllib_stop_scan(ieee);
+       RT_TRACE(COMP_DBG, "===>%s(), chan:%d\n", __func__, ieee->current_network.channel);
+       HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
+       if (ieee->eRFPowerState == eRfOff)
+       {
+            RT_TRACE(COMP_DBG, "=============>%s():Rf state is eRfOff, schedule ipsleave wq again,return\n",__func__);
+               if (ieee->rtllib_ips_leave_wq != NULL)
+                       ieee->rtllib_ips_leave_wq(ieee->dev);
+               up(&ieee->wx_sem);
+               return;
+       }
+       ieee->associate_seq = 1;
+
+       rtllib_associate_step1(ieee, ieee->current_network.bssid);
+
+       up(&ieee->wx_sem);
+}
+
+inline void rtllib_softmac_new_net(struct rtllib_device *ieee, struct rtllib_network *net)
+{
+       u8 tmp_ssid[IW_ESSID_MAX_SIZE+1];
+       int tmp_ssid_len = 0;
+
+       short apset,ssidset,ssidbroad,apmatch,ssidmatch;
+
+       /* we are interested in new new only if we are not associated
+        * and we are not associating / authenticating
+        */
+       if (ieee->state != RTLLIB_NOLINK)
+               return;
+
+       if ((ieee->iw_mode == IW_MODE_INFRA) && !(net->capability & WLAN_CAPABILITY_ESS))
+               return;
+
+       if ((ieee->iw_mode == IW_MODE_ADHOC) && !(net->capability & WLAN_CAPABILITY_IBSS))
+               return;
+
+       if ((ieee->iw_mode == IW_MODE_ADHOC) && (net->channel > ieee->ibss_maxjoin_chal)) {
+               return;
+       }
+       if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
+               {
+               /* if the user specified the AP MAC, we need also the essid
+                * This could be obtained by beacons or, if the network does not
+                * broadcast it, it can be put manually.
+                */
+               apset = ieee->wap_set;
+               ssidset = ieee->ssid_set;
+               ssidbroad =  !(net->ssid_len == 0 || net->ssid[0]== '\0');
+               apmatch = (memcmp(ieee->current_network.bssid, net->bssid, ETH_ALEN)==0);
+               if (!ssidbroad){
+                       ssidmatch = (ieee->current_network.ssid_len == net->hidden_ssid_len)&&\
+                                       (!strncmp(ieee->current_network.ssid, net->hidden_ssid, net->hidden_ssid_len));
+                       if (net->hidden_ssid_len > 0)
+                        {
+                               strncpy(net->ssid, net->hidden_ssid, net->hidden_ssid_len);
+                               net->ssid_len = net->hidden_ssid_len;
+                                ssidbroad = 1;
+                        }
+               }
+               else
+                       ssidmatch = (ieee->current_network.ssid_len == net->ssid_len)&&\
+                                       (!strncmp(ieee->current_network.ssid, net->ssid, net->ssid_len));
+
+               if (    /* if the user set the AP check if match.
+                        * if the network does not broadcast essid we check the user supplyed ANY essid
+                        * if the network does broadcast and the user does not set essid it is OK
+                        * if the network does broadcast and the user did set essid chech if essid match
+                        */
+                       ( apset && apmatch &&
+                               ((ssidset && ssidbroad && ssidmatch) || (ssidbroad && !ssidset) || (!ssidbroad && ssidset)) )
+                       /* if the ap is not set, check that the user set the bssid
+                        * and the network does bradcast and that those two bssid matches
+                        */
+                        ||  (!apset && ssidset && ssidbroad && ssidmatch) || (ieee->is_roaming && ssidset && ssidbroad && ssidmatch)
+                       ){
+                               /* if the essid is hidden replace it with the
+                               * essid provided by the user.
+                               */
+                               if (!ssidbroad){
+                                       strncpy(tmp_ssid, ieee->current_network.ssid, IW_ESSID_MAX_SIZE);
+                                       tmp_ssid_len = ieee->current_network.ssid_len;
+                               }
+                               memcpy(&ieee->current_network, net, sizeof(struct rtllib_network));
+                               if (!ssidbroad){
+                                       strncpy(ieee->current_network.ssid, tmp_ssid, IW_ESSID_MAX_SIZE);
+                                       ieee->current_network.ssid_len = tmp_ssid_len;
+                               }
+                               printk(KERN_INFO"Linking with %s,channel:%d, qos:%d, myHT:%d, networkHT:%d, mode:%x cur_net.flags:0x%x\n",ieee->current_network.ssid,ieee->current_network.channel, ieee->current_network.qos_data.supported, ieee->pHTInfo->bEnableHT, ieee->current_network.bssht.bdSupportHT, ieee->current_network.mode, ieee->current_network.flags);
+
+                               if ((rtllib_act_scanning(ieee, false)) && !(ieee->softmac_features & IEEE_SOFTMAC_SCAN)){
+                                       rtllib_stop_scan_syncro(ieee);
+                               }
+
+                               ieee->hwscan_ch_bk = ieee->current_network.channel;
+                               HTResetIOTSetting(ieee->pHTInfo);
+                               ieee->wmm_acm = 0;
+                               if (ieee->iw_mode == IW_MODE_INFRA) {
+                                       /* Join the network for the first time */
+                                       ieee->AsocRetryCount = 0;
+                                       if ((ieee->current_network.qos_data.supported == 1) &&
+                                          ieee->current_network.bssht.bdSupportHT)
+                                               HTResetSelfAndSavePeerSetting(ieee, &(ieee->current_network));
+                                       else
+                                               ieee->pHTInfo->bCurrentHTSupport = false;
+
+                                       ieee->state = RTLLIB_ASSOCIATING;
+                                       if (ieee->LedControlHandler != NULL)
+                                               ieee->LedControlHandler(ieee->dev, LED_CTL_START_TO_LINK);
+                                       queue_delayed_work_rsl(ieee->wq, &ieee->associate_procedure_wq, 0);
+                               } else {
+                                       if (rtllib_is_54g(&ieee->current_network) &&
+                                               (ieee->modulation & RTLLIB_OFDM_MODULATION)){
+                                               ieee->rate = 108;
+                                               ieee->SetWirelessMode(ieee->dev, IEEE_G);
+                                               printk(KERN_INFO"Using G rates\n");
+                                       }else{
+                                               ieee->rate = 22;
+                                               ieee->SetWirelessMode(ieee->dev, IEEE_B);
+                                               printk(KERN_INFO"Using B rates\n");
+                                       }
+                                       memset(ieee->dot11HTOperationalRateSet, 0, 16);
+                                       ieee->state = RTLLIB_LINKED;
+                               }
+
+               }
+       }
+
+}
+
+void rtllib_softmac_check_all_nets(struct rtllib_device *ieee)
+{
+       unsigned long flags;
+       struct rtllib_network *target;
+
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       list_for_each_entry(target, &ieee->network_list, list) {
+
+               /* if the state become different that NOLINK means
+                * we had found what we are searching for
+                */
+
+               if (ieee->state != RTLLIB_NOLINK)
+                       break;
+
+               if (ieee->scan_age == 0 || time_after(target->last_scanned + ieee->scan_age, jiffies))
+               rtllib_softmac_new_net(ieee, target);
+       }
+
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+}
+
+
+static inline u16 auth_parse(struct sk_buff *skb, u8** challenge, int *chlen)
+{
+       struct rtllib_authentication *a;
+       u8 *t;
+       if (skb->len <  (sizeof(struct rtllib_authentication)-sizeof(struct rtllib_info_element))){
+               RTLLIB_DEBUG_MGMT("invalid len in auth resp: %d\n",skb->len);
+               return 0xcafe;
+       }
+       *challenge = NULL;
+       a = (struct rtllib_authentication*) skb->data;
+       if (skb->len > (sizeof(struct rtllib_authentication) +3)){
+               t = skb->data + sizeof(struct rtllib_authentication);
+
+               if (*(t++) == MFIE_TYPE_CHALLENGE){
+                       *chlen = *(t++);
+                       *challenge = (u8*)kmalloc(*chlen, GFP_ATOMIC);
+                       memcpy(*challenge, t, *chlen);
+               }
+       }
+
+       return cpu_to_le16(a->status);
+
+}
+
+
+int auth_rq_parse(struct sk_buff *skb,u8* dest)
+{
+       struct rtllib_authentication *a;
+
+       if (skb->len <  (sizeof(struct rtllib_authentication)-sizeof(struct rtllib_info_element))){
+               RTLLIB_DEBUG_MGMT("invalid len in auth request: %d\n",skb->len);
+               return -1;
+       }
+       a = (struct rtllib_authentication*) skb->data;
+
+       memcpy(dest,a->header.addr2, ETH_ALEN);
+
+       if (le16_to_cpu(a->algorithm) != WLAN_AUTH_OPEN)
+               return  WLAN_STATUS_NOT_SUPPORTED_AUTH_ALG;
+
+       return WLAN_STATUS_SUCCESS;
+}
+
+static short probe_rq_parse(struct rtllib_device *ieee, struct sk_buff *skb, u8 *src)
+{
+       u8 *tag;
+       u8 *skbend;
+       u8 *ssid=NULL;
+       u8 ssidlen = 0;
+
+       struct rtllib_hdr_3addr   *header =
+               (struct rtllib_hdr_3addr   *) skb->data;
+
+       if (skb->len < sizeof (struct rtllib_hdr_3addr  ))
+               return -1; /* corrupted */
+        if ((memcmp(header->addr3,ieee->current_network.bssid,ETH_ALEN) != 0)&&
+                (memcmp(header->addr3,"\xff\xff\xff\xff\xff\xff",ETH_ALEN) != 0)) {
+            return -1;
+        }
+
+        if (memcmp(header->addr3,ieee->current_network.bssid,ETH_ALEN) == 0) {
+        }
+
+        if (memcmp(header->addr3,"\xff\xff\xff\xff\xff\xff",ETH_ALEN) == 0) {
+        }
+       memcpy(src,header->addr2, ETH_ALEN);
+
+       skbend = (u8*)skb->data + skb->len;
+
+       tag = skb->data + sizeof (struct rtllib_hdr_3addr  );
+
+       while (tag+1 < skbend){
+               if (*tag == 0){
+                       ssid = tag+2;
+                       ssidlen = *(tag+1);
+                       break;
+               }
+               tag++; /* point to the len field */
+               tag = tag + *(tag); /* point to the last data byte of the tag */
+               tag++; /* point to the next tag */
+       }
+
+       if (ssidlen == 0) return 1;
+
+       if (!ssid) return 1; /* ssid not found in tagged param */
+       return (!strncmp(ssid, ieee->current_network.ssid, ssidlen));
+
+}
+
+int assoc_rq_parse(struct sk_buff *skb,u8* dest)
+{
+       struct rtllib_assoc_request_frame *a;
+
+       if (skb->len < (sizeof(struct rtllib_assoc_request_frame) -
+               sizeof(struct rtllib_info_element))) {
+
+               RTLLIB_DEBUG_MGMT("invalid len in auth request:%d \n", skb->len);
+               return -1;
+       }
+
+       a = (struct rtllib_assoc_request_frame*) skb->data;
+
+       memcpy(dest,a->header.addr2,ETH_ALEN);
+
+       return 0;
+}
+
+static inline u16 assoc_parse(struct rtllib_device *ieee, struct sk_buff *skb, int *aid)
+{
+       struct rtllib_assoc_response_frame *response_head;
+       u16 status_code;
+
+       if (skb->len <  sizeof(struct rtllib_assoc_response_frame)){
+               RTLLIB_DEBUG_MGMT("invalid len in auth resp: %d\n", skb->len);
+               return 0xcafe;
+       }
+
+       response_head = (struct rtllib_assoc_response_frame*) skb->data;
+       *aid = le16_to_cpu(response_head->aid) & 0x3fff;
+
+       status_code = le16_to_cpu(response_head->status);
+       if ((status_code==WLAN_STATUS_ASSOC_DENIED_RATES || \
+          status_code==WLAN_STATUS_CAPS_UNSUPPORTED)&&
+          ((ieee->mode == IEEE_G) &&
+           (ieee->current_network.mode == IEEE_N_24G) &&
+            (ieee->AsocRetryCount++ < (RT_ASOC_RETRY_LIMIT-1)))) {
+                 ieee->pHTInfo->IOTAction |= HT_IOT_ACT_PURE_N_MODE;
+       }else {
+                ieee->AsocRetryCount = 0;
+       }
+
+       return le16_to_cpu(response_head->status);
+}
+
+void rtllib_rx_probe_rq(struct rtllib_device *ieee, struct sk_buff *skb)
+{
+       u8 dest[ETH_ALEN];
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       struct sta_info *psta = NULL;
+#endif
+       ieee->softmac_stats.rx_probe_rq++;
+       if (probe_rq_parse(ieee, skb, dest) > 0){
+               ieee->softmac_stats.tx_probe_rs++;
+               rtllib_resp_to_probe(ieee, dest);
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+               if (ieee->iw_mode == IW_MODE_ADHOC){
+                       psta = GetStaInfo(ieee, dest);
+                       if (NULL != psta)
+                               psta->LastActiveTime = jiffies;
+               }
+#endif
+       }
+}
+
+static inline void rtllib_rx_auth_rq(struct rtllib_device *ieee, struct sk_buff *skb)
+{
+       u8 dest[ETH_ALEN];
+       int status;
+       ieee->softmac_stats.rx_auth_rq++;
+
+       if ((status = auth_rq_parse(skb, dest))!= -1){
+               rtllib_resp_to_auth(ieee, status, dest);
+       }
+
+}
+
+static inline void rtllib_rx_assoc_rq(struct rtllib_device *ieee, struct sk_buff *skb)
+{
+
+       u8 dest[ETH_ALEN];
+
+       ieee->softmac_stats.rx_ass_rq++;
+       if (assoc_rq_parse(skb,dest) != -1){
+               rtllib_resp_to_assoc_rq(ieee, dest);
+       }
+
+       printk(KERN_INFO"New client associated: "MAC_FMT"\n", MAC_ARG(dest));
+}
+
+
+void rtllib_sta_ps_send_null_frame(struct rtllib_device *ieee, short pwr)
+{
+
+       struct sk_buff *buf = rtllib_null_func(ieee, pwr);
+
+       if (buf)
+               softmac_ps_mgmt_xmit(buf, ieee);
+
+}
+
+void rtllib_sta_ps_send_pspoll_frame(struct rtllib_device *ieee)
+{
+
+       struct sk_buff *buf = rtllib_pspoll_func(ieee);
+
+       if (buf)
+               softmac_ps_mgmt_xmit(buf, ieee);
+
+}
+
+short rtllib_sta_ps_sleep(struct rtllib_device *ieee, u32 *time_h, u32 *time_l)
+{
+       int timeout = ieee->ps_timeout;
+       u8 dtim;
+       PRT_POWER_SAVE_CONTROL  pPSC = (PRT_POWER_SAVE_CONTROL)(&(ieee->PowerSaveControl));
+       /*if (ieee->ps == RTLLIB_PS_DISABLED ||
+               ieee->iw_mode != IW_MODE_INFRA ||
+               ieee->state != RTLLIB_LINKED)
+
+               return 0;
+       */
+
+       if (ieee->LPSDelayCnt)
+       {
+               ieee->LPSDelayCnt --;
+               return 0;
+       }
+
+       dtim = ieee->current_network.dtim_data;
+       if (!(dtim & RTLLIB_DTIM_VALID))
+               return 0;
+       timeout = ieee->current_network.beacon_interval;
+       ieee->current_network.dtim_data = RTLLIB_DTIM_INVALID;
+       /* there's no need to nofity AP that I find you buffered with broadcast packet */
+       if (dtim & (RTLLIB_DTIM_UCAST & ieee->ps))
+               return 2;
+
+       if (!time_after(jiffies, ieee->dev->trans_start + MSECS(timeout))){
+               return 0;
+       }
+       if (!time_after(jiffies, ieee->last_rx_ps_time + MSECS(timeout))){
+               return 0;
+       }
+       if ((ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE ) &&
+               (ieee->mgmt_queue_tail != ieee->mgmt_queue_head))
+               return 0;
+
+       if (time_l){
+               if (ieee->bAwakePktSent == true) {
+                       pPSC->LPSAwakeIntvl = 1;
+               } else {
+                       u8              MaxPeriod = 1;
+
+                       if (pPSC->LPSAwakeIntvl == 0)
+                               pPSC->LPSAwakeIntvl = 1;
+                       if (pPSC->RegMaxLPSAwakeIntvl == 0)
+                               MaxPeriod = 1;
+                       else if (pPSC->RegMaxLPSAwakeIntvl == 0xFF)
+                               MaxPeriod = ieee->current_network.dtim_period;
+                       else
+                               MaxPeriod = pPSC->RegMaxLPSAwakeIntvl;
+                       pPSC->LPSAwakeIntvl = (pPSC->LPSAwakeIntvl >= MaxPeriod) ? MaxPeriod : (pPSC->LPSAwakeIntvl + 1);
+               }
+               {
+                       u8 LPSAwakeIntvl_tmp = 0;
+                       u8 period = ieee->current_network.dtim_period;
+                       u8 count = ieee->current_network.tim.tim_count;
+                       if (count == 0 ) {
+                               if (pPSC->LPSAwakeIntvl > period)
+                                       LPSAwakeIntvl_tmp = period + (pPSC->LPSAwakeIntvl - period) -((pPSC->LPSAwakeIntvl-period)%period);
+                               else
+                                       LPSAwakeIntvl_tmp = pPSC->LPSAwakeIntvl;
+
+                       } else {
+                               if (pPSC->LPSAwakeIntvl > ieee->current_network.tim.tim_count)
+                                       LPSAwakeIntvl_tmp = count + (pPSC->LPSAwakeIntvl - count) -((pPSC->LPSAwakeIntvl-count)%period);
+                               else
+                                       LPSAwakeIntvl_tmp = pPSC->LPSAwakeIntvl;
+                       }
+
+               *time_l = ieee->current_network.last_dtim_sta_time[0]
+                       + MSECS(ieee->current_network.beacon_interval * LPSAwakeIntvl_tmp);
+       }
+       }
+
+       if (time_h) {
+               *time_h = ieee->current_network.last_dtim_sta_time[1];
+               if (time_l && *time_l < ieee->current_network.last_dtim_sta_time[0])
+                       *time_h += 1;
+       }
+
+       return 1;
+
+
+}
+
+inline void rtllib_sta_ps(struct rtllib_device *ieee)
+{
+
+       u32 th,tl;
+       short sleep;
+
+       unsigned long flags,flags2;
+
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if ((ieee->ps == RTLLIB_PS_DISABLED ||
+               ieee->iw_mode != IW_MODE_INFRA ||
+               ieee->state != RTLLIB_LINKED)){
+
+               RT_TRACE(COMP_DBG, "=====>%s(): no need to ps,wake up!! ieee->ps is %d,ieee->iw_mode is %d,ieee->state is %d\n",
+                       __func__,ieee->ps,ieee->iw_mode,ieee->state);
+               spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
+
+               rtllib_sta_wakeup(ieee, 1);
+
+               spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
+       }
+
+       sleep = rtllib_sta_ps_sleep(ieee,&th, &tl);
+       /* 2 wake, 1 sleep, 0 do nothing */
+       if (sleep == 0)
+       {
+               goto out;
+       }
+       if (sleep == 1){
+               if (ieee->sta_sleep == LPS_IS_SLEEP){
+                       ieee->enter_sleep_state(ieee->dev,th,tl);
+               }
+
+               else if (ieee->sta_sleep == LPS_IS_WAKE){
+                       spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
+
+                       if (ieee->ps_is_queue_empty(ieee->dev)){
+                               ieee->sta_sleep = LPS_WAIT_NULL_DATA_SEND;
+                               ieee->ack_tx_to_ieee = 1;
+                               rtllib_sta_ps_send_null_frame(ieee,1);
+                               ieee->ps_th = th;
+                               ieee->ps_tl = tl;
+                       }
+                       spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
+
+               }
+
+               ieee->bAwakePktSent = false;
+
+       }else if (sleep == 2){
+               spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
+
+               rtllib_sta_wakeup(ieee,1);
+
+               spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
+       }
+
+out:
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+}
+
+void rtllib_sta_wakeup(struct rtllib_device *ieee, short nl)
+{
+       if (ieee->sta_sleep == LPS_IS_WAKE){
+               if (nl){
+                       if (ieee->pHTInfo->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)
+                       {
+                               ieee->ack_tx_to_ieee = 1;
+                               rtllib_sta_ps_send_null_frame(ieee, 0);
+                       }
+                       else
+                       {
+                               ieee->ack_tx_to_ieee = 1;
+                               rtllib_sta_ps_send_pspoll_frame(ieee);
+                       }
+               }
+               return;
+
+       }
+
+       if (ieee->sta_sleep == LPS_IS_SLEEP)
+               ieee->sta_wake_up(ieee->dev);
+       if (nl){
+               /*
+                       ieee->ack_tx_to_ieee = 1;
+                       printk("%s(3): notify AP we are awaked ++++++++++ SendNullFunctionData\n", __func__);
+                       rtllib_sta_ps_send_null_frame(ieee, 0);
+               */
+               if (ieee->pHTInfo->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)
+               {
+                       ieee->ack_tx_to_ieee = 1;
+                       rtllib_sta_ps_send_null_frame(ieee, 0);
+               }
+               else
+               {
+                       ieee->ack_tx_to_ieee = 1;
+                       ieee->polling = true;
+                       rtllib_sta_ps_send_pspoll_frame(ieee);
+               }
+
+       } else {
+               ieee->sta_sleep = LPS_IS_WAKE;
+               ieee->polling = false;
+       }
+}
+
+void rtllib_ps_tx_ack(struct rtllib_device *ieee, short success)
+{
+       unsigned long flags,flags2;
+
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if (ieee->sta_sleep == LPS_WAIT_NULL_DATA_SEND){
+               /* Null frame with PS bit set */
+               if (success){
+                       ieee->sta_sleep = LPS_IS_SLEEP;
+                       ieee->enter_sleep_state(ieee->dev,ieee->ps_th,ieee->ps_tl);
+               }
+               /* if the card report not success we can't be sure the AP
+                * has not RXed so we can't assume the AP believe us awake
+                */
+       } else {/* 21112005 - tx again null without PS bit if lost */
+
+               if ((ieee->sta_sleep == LPS_IS_WAKE) && !success){
+                       spin_lock_irqsave(&ieee->mgmt_tx_lock, flags2);
+                       if (ieee->pHTInfo->IOTAction & HT_IOT_ACT_NULL_DATA_POWER_SAVING)
+                       {
+                               rtllib_sta_ps_send_null_frame(ieee, 0);
+                       }
+                       else
+                       {
+                               rtllib_sta_ps_send_pspoll_frame(ieee);
+                       }
+                       spin_unlock_irqrestore(&ieee->mgmt_tx_lock, flags2);
+               }
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+}
+
+void rtllib_process_action(struct rtllib_device* ieee, struct sk_buff* skb)
+{
+       struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data;
+       u8* act = rtllib_get_payload((struct rtllib_hdr *)header);
+       u8 category = 0;
+
+       if (act == NULL) {
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "error to get payload of action frame\n");
+               return;
+       }
+
+       category = *act;
+       act ++;
+       switch (category) {
+               case ACT_CAT_BA:
+                       switch (*act) {
+                               case ACT_ADDBAREQ:
+                                       rtllib_rx_ADDBAReq(ieee, skb);
+                                       break;
+                               case ACT_ADDBARSP:
+                                       rtllib_rx_ADDBARsp(ieee, skb);
+                                       break;
+                               case ACT_DELBA:
+                                       rtllib_rx_DELBA(ieee, skb);
+                                       break;
+                       }
+                       break;
+               default:
+                       break;
+       }
+       return;
+}
+
+inline int rtllib_rx_assoc_resp(struct rtllib_device *ieee, struct sk_buff *skb, struct rtllib_rx_stats *rx_stats)
+{
+       u16 errcode;
+       int aid;
+       u8* ies;
+       struct rtllib_assoc_response_frame *assoc_resp;
+       struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data;
+
+       RTLLIB_DEBUG_MGMT("received [RE]ASSOCIATION RESPONSE (%d)\n",
+                                       WLAN_FC_GET_STYPE(header->frame_ctl));
+
+       if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
+               ieee->state == RTLLIB_ASSOCIATING_AUTHENTICATED &&
+               (ieee->iw_mode == IW_MODE_INFRA))
+       {
+               if (0 == (errcode=assoc_parse(ieee,skb, &aid))){
+                       struct rtllib_network *network = kzalloc(sizeof(struct rtllib_network), GFP_ATOMIC);
+
+                       if (!network)
+                               return 1;
+                       memset(network,0,sizeof(*network));
+                       ieee->state=RTLLIB_LINKED;
+                       ieee->assoc_id = aid;
+                       ieee->softmac_stats.rx_ass_ok++;
+                       /* station support qos */
+                       /* Let the register setting defaultly with Legacy station */
+                       assoc_resp = (struct rtllib_assoc_response_frame*)skb->data;
+                       if (ieee->current_network.qos_data.supported == 1) {
+                               if (rtllib_parse_info_param(ieee,assoc_resp->info_element,\
+                                                       rx_stats->len - sizeof(*assoc_resp),\
+                                                       network,rx_stats)){
+                                       kfree(network);
+                                       return 1;
+                               }
+                               else
+                               {
+                                       memcpy(ieee->pHTInfo->PeerHTCapBuf, network->bssht.bdHTCapBuf, network->bssht.bdHTCapLen);
+                                       memcpy(ieee->pHTInfo->PeerHTInfoBuf, network->bssht.bdHTInfoBuf, network->bssht.bdHTInfoLen);
+                               }
+                               if (ieee->handle_assoc_response != NULL)
+                                       ieee->handle_assoc_response(ieee->dev, (struct rtllib_assoc_response_frame*)header, network);
+                               kfree(network);
+                       }
+
+                       if (ieee->assocresp_ies){
+                               kfree(ieee->assocresp_ies);
+                               ieee->assocresp_ies = NULL;
+                       }
+                       ies = &(assoc_resp->info_element[0].id);
+                       ieee->assocresp_ies_len = (skb->data + skb->len) - ies;
+                       ieee->assocresp_ies = kmalloc(ieee->assocresp_ies_len, GFP_ATOMIC);
+                       if (ieee->assocresp_ies)
+                               memcpy(ieee->assocresp_ies, ies, ieee->assocresp_ies_len);
+                       else{
+                               printk("%s()Warning: can't alloc memory for assocresp_ies\n", __func__);
+                               ieee->assocresp_ies_len = 0;
+                       }
+                       rtllib_associate_complete(ieee);
+               } else {
+                       /* aid could not been allocated */
+                       ieee->softmac_stats.rx_ass_err++;
+                       printk(
+                               "Association response status code 0x%x\n",
+                               errcode);
+                       RTLLIB_DEBUG_MGMT(
+                               "Association response status code 0x%x\n",
+                               errcode);
+                       if (ieee->AsocRetryCount < RT_ASOC_RETRY_LIMIT) {
+                               queue_delayed_work_rsl(ieee->wq, &ieee->associate_procedure_wq, 0);
+                       } else {
+                               rtllib_associate_abort(ieee);
+                       }
+               }
+       }
+
+       return 0;
+}
+
+inline int rtllib_rx_auth(struct rtllib_device *ieee, struct sk_buff *skb, struct rtllib_rx_stats *rx_stats)
+{
+       u16 errcode;
+       u8* challenge;
+       int chlen=0;
+       bool bSupportNmode = true, bHalfSupportNmode = false;
+
+       if (ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE){
+               if (ieee->state == RTLLIB_ASSOCIATING_AUTHENTICATING &&
+                   (ieee->iw_mode == IW_MODE_INFRA)) {
+                       RTLLIB_DEBUG_MGMT("Received authentication response");
+
+                       if (0 == (errcode=auth_parse(skb, &challenge, &chlen))) {
+                               if (ieee->open_wep || !challenge){
+                                       ieee->state = RTLLIB_ASSOCIATING_AUTHENTICATED;
+                                       ieee->softmac_stats.rx_auth_rs_ok++;
+                                       if (!(ieee->pHTInfo->IOTAction&HT_IOT_ACT_PURE_N_MODE))
+                                       {
+                                               if (!ieee->GetNmodeSupportBySecCfg(ieee->dev))
+                                               {
+                                                       if (IsHTHalfNmodeAPs(ieee))
+                                                       {
+                                                               bSupportNmode = true;
+                                                               bHalfSupportNmode = true;
+                                                       }
+                                                       else
+                                                       {
+                                                               bSupportNmode = false;
+                                                               bHalfSupportNmode = false;
+                                                       }
+                                               }
+                                       }
+                                       /* Dummy wirless mode setting to avoid encryption issue */
+                                       if (bSupportNmode) {
+                                               ieee->SetWirelessMode(ieee->dev, \
+                                                       ieee->current_network.mode);
+                                       }else{
+                                               /*TODO*/
+                                               ieee->SetWirelessMode(ieee->dev, IEEE_G);
+                                       }
+
+                                       if (ieee->current_network.mode == IEEE_N_24G && bHalfSupportNmode == true)
+                                       {
+                                               printk("===============>entern half N mode\n");
+                                               ieee->bHalfWirelessN24GMode = true;
+                                       }
+                                       else
+                                               ieee->bHalfWirelessN24GMode = false;
+
+                                       rtllib_associate_step2(ieee);
+                               }else{
+                                       rtllib_auth_challenge(ieee, challenge, chlen);
+                               }
+                       }else{
+                               ieee->softmac_stats.rx_auth_rs_err++;
+                               RTLLIB_DEBUG_MGMT("Authentication respose status code 0x%x",errcode);
+
+                               printk("Authentication respose status code 0x%x",errcode);
+                               rtllib_associate_abort(ieee);
+                       }
+
+               }else if (ieee->iw_mode == IW_MODE_MASTER){
+                       rtllib_rx_auth_rq(ieee, skb);
+               }
+       }
+
+       return 0;
+}
+
+inline int rtllib_rx_deauth(struct rtllib_device *ieee, struct sk_buff *skb)
+{
+       struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data;
+
+       if (memcmp(header->addr3, ieee->current_network.bssid, ETH_ALEN) != 0)
+               return 0;
+
+       /* FIXME for now repeat all the association procedure
+       * both for disassociation and deauthentication
+       */
+       if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
+           ieee->state == RTLLIB_LINKED &&
+           (ieee->iw_mode == IW_MODE_INFRA)) {
+               printk(KERN_INFO "==========>received disassoc/deauth(%x) "
+                      "frame, reason code:%x\n",
+                      WLAN_FC_GET_STYPE(header->frame_ctl),
+                      ((struct rtllib_disassoc*)skb->data)->reason);
+               ieee->state = RTLLIB_ASSOCIATING;
+               ieee->softmac_stats.reassoc++;
+               ieee->is_roaming = true;
+               ieee->LinkDetectInfo.bBusyTraffic = false;
+               rtllib_disassociate(ieee);
+               RemovePeerTS(ieee, header->addr2);
+               if (ieee->LedControlHandler != NULL)
+                       ieee->LedControlHandler(ieee->dev, LED_CTL_START_TO_LINK);
+
+               if (!(ieee->rtllib_ap_sec_type(ieee)&(SEC_ALG_CCMP|SEC_ALG_TKIP)))
+               queue_delayed_work_rsl(ieee->wq, &ieee->associate_procedure_wq, 5);
+       }
+
+       return 0;
+}
+
+inline int rtllib_rx_frame_softmac(struct rtllib_device *ieee, struct sk_buff *skb,
+                       struct rtllib_rx_stats *rx_stats, u16 type,
+                       u16 stype)
+{
+       struct rtllib_hdr_3addr *header = (struct rtllib_hdr_3addr *) skb->data;
+
+       if (!ieee->proto_started)
+               return 0;
+
+       switch (WLAN_FC_GET_STYPE(header->frame_ctl)) {
+
+               case RTLLIB_STYPE_ASSOC_RESP:
+               case RTLLIB_STYPE_REASSOC_RESP:
+
+                       if (rtllib_rx_assoc_resp(ieee, skb, rx_stats) == 1)
+                               return 1;
+
+                       break;
+
+               case RTLLIB_STYPE_ASSOC_REQ:
+               case RTLLIB_STYPE_REASSOC_REQ:
+
+                       if ((ieee->softmac_features & IEEE_SOFTMAC_ASSOCIATE) &&
+                               ieee->iw_mode == IW_MODE_MASTER)
+
+                               rtllib_rx_assoc_rq(ieee, skb);
+                       break;
+
+               case RTLLIB_STYPE_AUTH:
+
+                       rtllib_rx_auth(ieee, skb, rx_stats);
+
+                       break;
+               case RTLLIB_STYPE_DISASSOC:
+               case RTLLIB_STYPE_DEAUTH:
+
+                       rtllib_rx_deauth(ieee, skb);
+
+                       break;
+
+               case RTLLIB_STYPE_MANAGE_ACT:
+                       rtllib_process_action(ieee,skb);
+                       break;
+#ifdef COMPATIBLE_WITH_RALINK_MESH
+               case RTLLIB_STYPE_MESH_ACT:
+                       rtllib_process_action_mesh(ieee,skb,rx_stats);
+                       break;
+#endif
+               default:
+                       return -1;
+                       break;
+       }
+
+       return 0;
+}
+
+/* following are for a simplier TX queue management.
+ * Instead of using netif_[stop/wake]_queue the driver
+ * will uses these two function (plus a reset one), that
+ * will internally uses the kernel netif_* and takes
+ * care of the ieee802.11 fragmentation.
+ * So the driver receives a fragment per time and might
+ * call the stop function when it want without take care
+ * to have enought room to TX an entire packet.
+ * This might be useful if each fragment need it's own
+ * descriptor, thus just keep a total free memory > than
+ * the max fragmentation treshold is not enought.. If the
+ * ieee802.11 stack passed a TXB struct then you needed
+ * to keep N free descriptors where
+ * N = MAX_PACKET_SIZE / MIN_FRAG_TRESHOLD
+ * In this way you need just one and the 802.11 stack
+ * will take care of buffering fragments and pass them to
+ * to the driver later, when it wakes the queue.
+ */
+void rtllib_softmac_xmit(struct rtllib_txb *txb, struct rtllib_device *ieee)
+{
+
+       unsigned int queue_index = txb->queue_index;
+       unsigned long flags;
+       int  i;
+       cb_desc *tcb_desc = NULL;
+       unsigned long queue_len = 0;
+
+       spin_lock_irqsave(&ieee->lock,flags);
+
+       /* called with 2nd parm 0, no tx mgmt lock required */
+       rtllib_sta_wakeup(ieee,0);
+
+       /* update the tx status */
+       tcb_desc = (cb_desc *)(txb->fragments[0]->cb + MAX_DEV_ADDR_SIZE);
+       if (tcb_desc->bMulticast) {
+               ieee->stats.multicast++;
+       }
+#if 1
+       /* if xmit available, just xmit it immediately, else just insert it to the wait queue */
+       for (i = 0; i < txb->nr_frags; i++) {
+#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
+               queue_len = skb_queue_len(&ieee->skb_drv_aggQ[queue_index]);
+#else
+               queue_len = skb_queue_len(&ieee->skb_waitQ[queue_index]);
+#endif
+               if ((queue_len  != 0) ||\
+                       (!ieee->check_nic_enough_desc(ieee->dev,queue_index))||\
+                      (ieee->queue_stop)) {
+                       /* insert the skb packet to the wait queue */
+                       /* as for the completion function, it does not need
+                        * to check it any more.
+                        * */
+#ifdef WIFI_TEST
+                       if (1)
+#else
+                       if (queue_len < 200)
+#endif
+                       {
+#ifdef USB_TX_DRIVER_AGGREGATION_ENABLE
+                               skb_queue_tail(&ieee->skb_drv_aggQ[queue_index], txb->fragments[i]);
+#else
+                               skb_queue_tail(&ieee->skb_waitQ[queue_index], txb->fragments[i]);
+#endif
+                       }else{
+                               kfree_skb(txb->fragments[i]);
+                       }
+               }else{
+                       ieee->softmac_data_hard_start_xmit(
+                                       txb->fragments[i],
+                                       ieee->dev,ieee->rate);
+               }
+       }
+#endif
+       rtllib_txb_free(txb);
+
+       spin_unlock_irqrestore(&ieee->lock,flags);
+
+}
+
+/* called with ieee->lock acquired */
+void rtllib_resume_tx(struct rtllib_device *ieee)
+{
+       int i;
+       for (i = ieee->tx_pending.frag; i < ieee->tx_pending.txb->nr_frags; i++) {
+
+               if (ieee->queue_stop){
+                       ieee->tx_pending.frag = i;
+                       return;
+               }else{
+
+                       ieee->softmac_data_hard_start_xmit(
+                               ieee->tx_pending.txb->fragments[i],
+                               ieee->dev,ieee->rate);
+                       ieee->stats.tx_packets++;
+               }
+       }
+
+       rtllib_txb_free(ieee->tx_pending.txb);
+       ieee->tx_pending.txb = NULL;
+}
+
+
+void rtllib_reset_queue(struct rtllib_device *ieee)
+{
+       unsigned long flags;
+
+       spin_lock_irqsave(&ieee->lock,flags);
+       init_mgmt_queue(ieee);
+       if (ieee->tx_pending.txb){
+               rtllib_txb_free(ieee->tx_pending.txb);
+               ieee->tx_pending.txb = NULL;
+       }
+       ieee->queue_stop = 0;
+       spin_unlock_irqrestore(&ieee->lock,flags);
+
+}
+
+void rtllib_wake_queue(struct rtllib_device *ieee)
+{
+
+       unsigned long flags;
+       struct sk_buff *skb;
+       struct rtllib_hdr_3addr  *header;
+
+       spin_lock_irqsave(&ieee->lock,flags);
+       if (! ieee->queue_stop) goto exit;
+
+       ieee->queue_stop = 0;
+
+       if (ieee->softmac_features & IEEE_SOFTMAC_SINGLE_QUEUE){
+               while (!ieee->queue_stop && (skb = dequeue_mgmt(ieee))){
+
+                       header = (struct rtllib_hdr_3addr  *) skb->data;
+
+                       header->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
+
+                       if (ieee->seq_ctrl[0] == 0xFFF)
+                               ieee->seq_ctrl[0] = 0;
+                       else
+                               ieee->seq_ctrl[0]++;
+
+                       ieee->softmac_data_hard_start_xmit(skb,ieee->dev,ieee->basic_rate);
+               }
+       }
+       if (!ieee->queue_stop && ieee->tx_pending.txb)
+               rtllib_resume_tx(ieee);
+
+       if (!ieee->queue_stop && netif_queue_stopped(ieee->dev)){
+               ieee->softmac_stats.swtxawake++;
+               netif_wake_queue(ieee->dev);
+       }
+
+exit :
+       spin_unlock_irqrestore(&ieee->lock,flags);
+}
+
+
+void rtllib_stop_queue(struct rtllib_device *ieee)
+{
+
+       if (! netif_queue_stopped(ieee->dev)){
+               netif_stop_queue(ieee->dev);
+               ieee->softmac_stats.swtxstop++;
+       }
+       ieee->queue_stop = 1;
+
+}
+
+void rtllib_stop_all_queues(struct rtllib_device *ieee)
+{
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,6,30)
+       unsigned int i;
+       for (i=0; i < ieee->dev->num_tx_queues; i++)
+                netdev_get_tx_queue(ieee->dev,i)->trans_start = jiffies;
+#else
+       ieee->dev->trans_start = jiffies;
+#endif
+
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+       netif_carrier_off(ieee->dev);
+#else
+       netif_tx_stop_all_queues(ieee->dev);
+#endif
+}
+
+void rtllib_wake_all_queues(struct rtllib_device *ieee)
+{
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,27)
+       netif_carrier_on(ieee->dev);
+#else
+       netif_tx_wake_all_queues(ieee->dev);
+#endif
+}
+
+inline void rtllib_randomize_cell(struct rtllib_device *ieee)
+{
+
+       get_random_bytes(ieee->current_network.bssid, ETH_ALEN);
+
+       /* an IBSS cell address must have the two less significant
+        * bits of the first byte = 2
+        */
+       ieee->current_network.bssid[0] &= ~0x01;
+       ieee->current_network.bssid[0] |= 0x02;
+}
+
+/* called in user context only */
+void rtllib_start_master_bss(struct rtllib_device *ieee)
+{
+       ieee->assoc_id = 1;
+
+       if (ieee->current_network.ssid_len == 0){
+               strncpy(ieee->current_network.ssid,
+                       RTLLIB_DEFAULT_TX_ESSID,
+                       IW_ESSID_MAX_SIZE);
+
+               ieee->current_network.ssid_len = strlen(RTLLIB_DEFAULT_TX_ESSID);
+               ieee->ssid_set = 1;
+       }
+
+       memcpy(ieee->current_network.bssid, ieee->dev->dev_addr, ETH_ALEN);
+
+       ieee->set_chan(ieee->dev, ieee->current_network.channel);
+       ieee->state = RTLLIB_LINKED;
+       ieee->link_change(ieee->dev);
+       notify_wx_assoc_event(ieee);
+
+       if (ieee->data_hard_resume)
+               ieee->data_hard_resume(ieee->dev);
+
+       netif_carrier_on(ieee->dev);
+}
+
+void rtllib_start_monitor_mode(struct rtllib_device *ieee)
+{
+       /* reset hardware status */
+       if (ieee->raw_tx){
+               if (ieee->data_hard_resume)
+                       ieee->data_hard_resume(ieee->dev);
+
+               netif_carrier_on(ieee->dev);
+       }
+}
+
+void rtllib_start_ibss_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data, struct rtllib_device, start_ibss_wq);
+       /* iwconfig mode ad-hoc will schedule this and return
+        * on the other hand this will block further iwconfig SET
+        * operations because of the wx_sem hold.
+        * Anyway some most set operations set a flag to speed-up
+        * (abort) this wq (when syncro scanning) before sleeping
+        * on the semaphore
+        */
+       if (!ieee->proto_started){
+               printk("==========oh driver down return\n");
+               return;
+       }
+       down(&ieee->wx_sem);
+
+       if (ieee->current_network.ssid_len == 0){
+               strcpy(ieee->current_network.ssid,RTLLIB_DEFAULT_TX_ESSID);
+               ieee->current_network.ssid_len = strlen(RTLLIB_DEFAULT_TX_ESSID);
+               ieee->ssid_set = 1;
+       }
+
+       ieee->state = RTLLIB_NOLINK;
+#ifdef ADHOC_11N
+       ieee->mode = IEEE_N_24G;
+#else
+       ieee->mode = IEEE_G;
+#endif
+       /* check if we have this cell in our network list */
+       rtllib_softmac_check_all_nets(ieee);
+
+
+       /* if not then the state is not linked. Maybe the user swithced to
+        * ad-hoc mode just after being in monitor mode, or just after
+        * being very few time in managed mode (so the card have had no
+        * time to scan all the chans..) or we have just run up the iface
+        * after setting ad-hoc mode. So we have to give another try..
+        * Here, in ibss mode, should be safe to do this without extra care
+        * (in bss mode we had to make sure no-one tryed to associate when
+        * we had just checked the ieee->state and we was going to start the
+        * scan) beacause in ibss mode the rtllib_new_net function, when
+        * finds a good net, just set the ieee->state to RTLLIB_LINKED,
+        * so, at worst, we waste a bit of time to initiate an unneeded syncro
+        * scan, that will stop at the first round because it sees the state
+        * associated.
+        */
+       if (ieee->state == RTLLIB_NOLINK)
+               rtllib_start_scan_syncro(ieee, 0);
+
+       /* the network definitively is not here.. create a new cell */
+       if (ieee->state == RTLLIB_NOLINK){
+               printk("creating new IBSS cell\n");
+               ieee->current_network.channel = ieee->IbssStartChnl;
+               if (!ieee->wap_set)
+                       rtllib_randomize_cell(ieee);
+
+               if (ieee->modulation & RTLLIB_CCK_MODULATION){
+
+                       ieee->current_network.rates_len = 4;
+
+                       ieee->current_network.rates[0] = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_1MB;
+                       ieee->current_network.rates[1] = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_2MB;
+                       ieee->current_network.rates[2] = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_5MB;
+                       ieee->current_network.rates[3] = RTLLIB_BASIC_RATE_MASK | RTLLIB_CCK_RATE_11MB;
+
+               }else
+                       ieee->current_network.rates_len = 0;
+
+               if (ieee->modulation & RTLLIB_OFDM_MODULATION){
+                       ieee->current_network.rates_ex_len = 8;
+
+                       /*ieee->current_network.rates_ex[0] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_6MB;
+                       ieee->current_network.rates_ex[1] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_9MB;
+                       ieee->current_network.rates_ex[2] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_12MB;
+                       ieee->current_network.rates_ex[3] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_18MB;
+                       ieee->current_network.rates_ex[4] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_24MB;
+                       ieee->current_network.rates_ex[5] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_36MB;
+                       ieee->current_network.rates_ex[6] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_48MB;
+                       ieee->current_network.rates_ex[7] = RTLLIB_BASIC_RATE_MASK | RTLLIB_OFDM_RATE_54MB;*/
+
+                       ieee->current_network.rates_ex[0] = RTLLIB_OFDM_RATE_6MB;
+                       ieee->current_network.rates_ex[1] = RTLLIB_OFDM_RATE_9MB;
+                       ieee->current_network.rates_ex[2] = RTLLIB_OFDM_RATE_12MB;
+                       ieee->current_network.rates_ex[3] = RTLLIB_OFDM_RATE_18MB;
+                       ieee->current_network.rates_ex[4] = RTLLIB_OFDM_RATE_24MB;
+                       ieee->current_network.rates_ex[5] = RTLLIB_OFDM_RATE_36MB;
+                       ieee->current_network.rates_ex[6] = RTLLIB_OFDM_RATE_48MB;
+                       ieee->current_network.rates_ex[7] = RTLLIB_OFDM_RATE_54MB;
+
+                       ieee->rate = 108;
+               }else{
+                       ieee->current_network.rates_ex_len = 0;
+                       ieee->rate = 22;
+               }
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+#ifdef ADHOC_11N
+               ieee->current_network.qos_data.supported = 1;
+#else
+               ieee->current_network.qos_data.supported = 0;
+#endif
+               ieee->SetWirelessMode(ieee->dev, ieee->mode);
+#else
+               ieee->current_network.qos_data.supported = 0;
+               ieee->SetWirelessMode(ieee->dev, IEEE_G);
+#endif
+               ieee->current_network.mode = ieee->mode;
+               ieee->current_network.atim_window = 0;
+               ieee->current_network.capability = WLAN_CAPABILITY_IBSS;
+       }
+
+       printk("%s(): ieee->mode = %d\n", __func__, ieee->mode);
+       if ((ieee->mode == IEEE_N_24G) || (ieee->mode == IEEE_N_5G))
+               HTUseDefaultSetting(ieee);
+       else
+               ieee->pHTInfo->bCurrentHTSupport = false;
+
+       ieee->SetHwRegHandler(ieee->dev, HW_VAR_MEDIA_STATUS, (u8 *)(&ieee->state));
+
+       ieee->state = RTLLIB_LINKED;
+       ieee->link_change(ieee->dev);
+
+       HTSetConnectBwMode(ieee, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
+       if (ieee->LedControlHandler != NULL)
+               ieee->LedControlHandler(ieee->dev,LED_CTL_LINK);
+
+       rtllib_start_send_beacons(ieee);
+
+       notify_wx_assoc_event(ieee);
+
+       if (ieee->data_hard_resume)
+               ieee->data_hard_resume(ieee->dev);
+
+       netif_carrier_on(ieee->dev);
+
+       up(&ieee->wx_sem);
+}
+
+inline void rtllib_start_ibss(struct rtllib_device *ieee)
+{
+       queue_delayed_work_rsl(ieee->wq, &ieee->start_ibss_wq, MSECS(150));
+}
+
+/* this is called only in user context, with wx_sem held */
+void rtllib_start_bss(struct rtllib_device *ieee)
+{
+       unsigned long flags;
+#ifdef ENABLE_DOT11D
+       if (IS_DOT11D_ENABLE(ieee) && !IS_COUNTRY_IE_VALID(ieee))
+       {
+               if (! ieee->bGlobalDomain)
+               {
+                       return;
+               }
+       }
+#endif
+       /* check if we have already found the net we
+        * are interested in (if any).
+        * if not (we are disassociated and we are not
+        * in associating / authenticating phase) start the background scanning.
+        */
+       rtllib_softmac_check_all_nets(ieee);
+
+       /* ensure no-one start an associating process (thus setting
+        * the ieee->state to rtllib_ASSOCIATING) while we
+        * have just cheked it and we are going to enable scan.
+        * The rtllib_new_net function is always called with
+        * lock held (from both rtllib_softmac_check_all_nets and
+        * the rx path), so we cannot be in the middle of such function
+        */
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if (ieee->state == RTLLIB_NOLINK) {
+               rtllib_start_scan(ieee);
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+}
+
+void rtllib_link_change_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data, struct rtllib_device, link_change_wq);
+       ieee->link_change(ieee->dev);
+}
+/* called only in userspace context */
+void rtllib_disassociate(struct rtllib_device *ieee)
+{
+       netif_carrier_off(ieee->dev);
+       if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)
+                       rtllib_reset_queue(ieee);
+
+       if (ieee->data_hard_stop)
+                       ieee->data_hard_stop(ieee->dev);
+#ifdef ENABLE_DOT11D
+       if (IS_DOT11D_ENABLE(ieee))
+               Dot11d_Reset(ieee);
+#endif
+       ieee->state = RTLLIB_NOLINK;
+       ieee->is_set_key = false;
+       ieee->wap_set = 0;
+
+       queue_delayed_work_rsl(ieee->wq, &ieee->link_change_wq, 0);
+
+
+#ifndef FOR_ANDROID_X86
+       notify_wx_assoc_event(ieee);
+#endif
+}
+
+void rtllib_associate_retry_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_dwork_rsl(data, struct rtllib_device, associate_retry_wq);
+       unsigned long flags;
+
+       down(&ieee->wx_sem);
+       if (!ieee->proto_started)
+               goto exit;
+
+       if (ieee->state != RTLLIB_ASSOCIATING_RETRY)
+               goto exit;
+
+       /* until we do not set the state to RTLLIB_NOLINK
+       * there are no possibility to have someone else trying
+       * to start an association procdure (we get here with
+       * ieee->state = RTLLIB_ASSOCIATING).
+       * When we set the state to RTLLIB_NOLINK it is possible
+       * that the RX path run an attempt to associate, but
+       * both rtllib_softmac_check_all_nets and the
+       * RX path works with ieee->lock held so there are no
+       * problems. If we are still disassociated then start a scan.
+       * the lock here is necessary to ensure no one try to start
+       * an association procedure when we have just checked the
+       * state and we are going to start the scan.
+       */
+       ieee->beinretry = true;
+       ieee->state = RTLLIB_NOLINK;
+
+       rtllib_softmac_check_all_nets(ieee);
+
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if (ieee->state == RTLLIB_NOLINK)
+       {
+               rtllib_start_scan(ieee);
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+       ieee->beinretry = false;
+exit:
+       up(&ieee->wx_sem);
+}
+
+struct sk_buff *rtllib_get_beacon_(struct rtllib_device *ieee)
+{
+       u8 broadcast_addr[] = {0xff,0xff,0xff,0xff,0xff,0xff};
+
+       struct sk_buff *skb;
+       struct rtllib_probe_response *b;
+       skb = rtllib_probe_resp(ieee, broadcast_addr);
+
+       if (!skb)
+               return NULL;
+
+       b = (struct rtllib_probe_response *) skb->data;
+       b->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_BEACON);
+
+       return skb;
+
+}
+
+struct sk_buff *rtllib_get_beacon(struct rtllib_device *ieee)
+{
+       struct sk_buff *skb;
+       struct rtllib_probe_response *b;
+
+       skb = rtllib_get_beacon_(ieee);
+       if (!skb)
+               return NULL;
+
+       b = (struct rtllib_probe_response *) skb->data;
+       b->header.seq_ctl = cpu_to_le16(ieee->seq_ctrl[0] << 4);
+
+       if (ieee->seq_ctrl[0] == 0xFFF)
+               ieee->seq_ctrl[0] = 0;
+       else
+               ieee->seq_ctrl[0]++;
+
+       return skb;
+}
+
+void rtllib_softmac_stop_protocol(struct rtllib_device *ieee, u8 mesh_flag, u8 shutdown)
+{
+       rtllib_stop_scan_syncro(ieee);
+       down(&ieee->wx_sem);
+       rtllib_stop_protocol(ieee,shutdown);
+       up(&ieee->wx_sem);
+}
+
+
+void rtllib_stop_protocol(struct rtllib_device *ieee, u8 shutdown)
+{
+       if (!ieee->proto_started)
+               return;
+
+       if (shutdown){
+       ieee->proto_started = 0;
+               ieee->proto_stoppping = 1;
+               if (ieee->rtllib_ips_leave != NULL)
+                       ieee->rtllib_ips_leave(ieee->dev);
+       }
+
+       rtllib_stop_send_beacons(ieee);
+       del_timer_sync(&ieee->associate_timer);
+       cancel_delayed_work(&ieee->associate_retry_wq);
+       cancel_delayed_work(&ieee->start_ibss_wq);
+       cancel_delayed_work(&ieee->link_change_wq);
+       rtllib_stop_scan(ieee);
+
+       if (ieee->state <= RTLLIB_ASSOCIATING_AUTHENTICATED)
+               ieee->state = RTLLIB_NOLINK;
+
+       if (ieee->state == RTLLIB_LINKED){
+               if (ieee->iw_mode == IW_MODE_INFRA)
+                       SendDisassociation(ieee,1,deauth_lv_ss);
+               rtllib_disassociate(ieee);
+       }
+
+       if (shutdown){
+               RemoveAllTS(ieee);
+               ieee->proto_stoppping = 0;
+       }
+       if (ieee->assocreq_ies) {
+               kfree(ieee->assocreq_ies);
+               ieee->assocreq_ies = NULL;
+               ieee->assocreq_ies_len = 0;
+       }
+       if (ieee->assocresp_ies) {
+               kfree(ieee->assocresp_ies);
+               ieee->assocresp_ies = NULL;
+               ieee->assocresp_ies_len = 0;
+       }
+}
+
+void rtllib_softmac_start_protocol(struct rtllib_device *ieee, u8 mesh_flag)
+{
+       down(&ieee->wx_sem);
+       rtllib_start_protocol(ieee);
+       up(&ieee->wx_sem);
+}
+
+void rtllib_start_protocol(struct rtllib_device *ieee)
+{
+       short ch = 0;
+       int i = 0;
+
+       rtllib_update_active_chan_map(ieee);
+
+       if (ieee->proto_started)
+               return;
+
+       ieee->proto_started = 1;
+
+       if (ieee->current_network.channel == 0) {
+               do {
+                       ch++;
+                       if (ch > MAX_CHANNEL_NUMBER)
+                               return; /* no channel found */
+               } while(!ieee->active_channel_map[ch]);
+               ieee->current_network.channel = ch;
+       }
+
+       if (ieee->current_network.beacon_interval == 0)
+               ieee->current_network.beacon_interval = 100;
+
+       for (i = 0; i < 17; i++) {
+               ieee->last_rxseq_num[i] = -1;
+               ieee->last_rxfrag_num[i] = -1;
+               ieee->last_packet_time[i] = 0;
+       }
+
+       if (ieee->UpdateBeaconInterruptHandler)
+               ieee->UpdateBeaconInterruptHandler(ieee->dev, false);
+
+       ieee->wmm_acm = 0;
+       /* if the user set the MAC of the ad-hoc cell and then
+        * switch to managed mode, shall we  make sure that association
+        * attempts does not fail just because the user provide the essid
+        * and the nic is still checking for the AP MAC ??
+        */
+       if (ieee->iw_mode == IW_MODE_INFRA) {
+               rtllib_start_bss(ieee);
+       } else if (ieee->iw_mode == IW_MODE_ADHOC) {
+               if (ieee->UpdateBeaconInterruptHandler)
+                       ieee->UpdateBeaconInterruptHandler(ieee->dev, true);
+
+               rtllib_start_ibss(ieee);
+
+       } else if (ieee->iw_mode == IW_MODE_MASTER) {
+               rtllib_start_master_bss(ieee);
+       } else if (ieee->iw_mode == IW_MODE_MONITOR) {
+               rtllib_start_monitor_mode(ieee);
+       }
+}
+
+void rtllib_softmac_init(struct rtllib_device *ieee)
+{
+       int i;
+       memset(&ieee->current_network, 0, sizeof(struct rtllib_network));
+
+       ieee->state = RTLLIB_NOLINK;
+       for (i = 0; i < 5; i++) {
+         ieee->seq_ctrl[i] = 0;
+       }
+#ifdef ENABLE_DOT11D
+       ieee->pDot11dInfo = kmalloc(sizeof(struct rt_dot11d_info), GFP_ATOMIC);
+       if (!ieee->pDot11dInfo)
+               RTLLIB_DEBUG(RTLLIB_DL_ERR, "can't alloc memory for DOT11D\n");
+       memset(ieee->pDot11dInfo, 0, sizeof(struct rt_dot11d_info));
+#endif
+       ieee->LinkDetectInfo.SlotIndex = 0;
+       ieee->LinkDetectInfo.SlotNum = 2;
+       ieee->LinkDetectInfo.NumRecvBcnInPeriod=0;
+        ieee->LinkDetectInfo.NumRecvDataInPeriod=0;
+       ieee->LinkDetectInfo.NumTxOkInPeriod =0;
+       ieee->LinkDetectInfo.NumRxOkInPeriod =0;
+       ieee->LinkDetectInfo.NumRxUnicastOkInPeriod=0;
+       ieee->bIsAggregateFrame = false;
+       ieee->assoc_id = 0;
+       ieee->queue_stop = 0;
+       ieee->scanning_continue = 0;
+       ieee->softmac_features = 0;
+       ieee->wap_set = 0;
+       ieee->ssid_set = 0;
+       ieee->proto_started = 0;
+       ieee->proto_stoppping = 0;
+       ieee->basic_rate = RTLLIB_DEFAULT_BASIC_RATE;
+       ieee->rate = 22;
+       ieee->ps = RTLLIB_PS_DISABLED;
+       ieee->sta_sleep = LPS_IS_WAKE;
+
+       ieee->Regdot11HTOperationalRateSet[0]= 0xff;
+       ieee->Regdot11HTOperationalRateSet[1]= 0xff;
+       ieee->Regdot11HTOperationalRateSet[4]= 0x01;
+
+       ieee->Regdot11TxHTOperationalRateSet[0]= 0xff;
+       ieee->Regdot11TxHTOperationalRateSet[1]= 0xff;
+       ieee->Regdot11TxHTOperationalRateSet[4]= 0x01;
+
+       ieee->FirstIe_InScan = false;
+       ieee->actscanning = false;
+       ieee->beinretry = false;
+       ieee->is_set_key = false;
+       init_mgmt_queue(ieee);
+
+       ieee->sta_edca_param[0] = 0x0000A403;
+       ieee->sta_edca_param[1] = 0x0000A427;
+       ieee->sta_edca_param[2] = 0x005E4342;
+       ieee->sta_edca_param[3] = 0x002F3262;
+       ieee->aggregation = true;
+       ieee->enable_rx_imm_BA = 1;
+#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,5,40)
+       _setup_timer(&ieee->scan_timer,
+                   rtllib_softmac_scan_cb,
+                   (unsigned long) ieee);
+#endif
+       ieee->tx_pending.txb = NULL;
+
+       _setup_timer(&ieee->associate_timer,
+                   rtllib_associate_abort_cb,
+                   (unsigned long) ieee);
+
+       _setup_timer(&ieee->beacon_timer,
+                   rtllib_send_beacon_cb,
+                   (unsigned long) ieee);
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+       _setup_timer(&ieee->ibss_wait_timer,
+                   rtllib_ibss_wait_timeout,
+                   (unsigned long) ieee);
+#endif
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+#ifdef PF_SYNCTHREAD
+       ieee->wq = create_workqueue(DRV_NAME,0);
+#else
+       ieee->wq = create_workqueue(DRV_NAME);
+#endif
+#endif
+
+       INIT_DELAYED_WORK_RSL(&ieee->link_change_wq,(void*)rtllib_link_change_wq,ieee);
+       INIT_DELAYED_WORK_RSL(&ieee->start_ibss_wq,(void*)rtllib_start_ibss_wq,ieee);
+       INIT_WORK_RSL(&ieee->associate_complete_wq, (void*)rtllib_associate_complete_wq,ieee);
+       INIT_DELAYED_WORK_RSL(&ieee->associate_procedure_wq, (void*)rtllib_associate_procedure_wq,ieee);
+       INIT_DELAYED_WORK_RSL(&ieee->softmac_scan_wq,(void*)rtllib_softmac_scan_wq,ieee);
+       INIT_DELAYED_WORK_RSL(&ieee->softmac_hint11d_wq,(void*)rtllib_softmac_hint11d_wq,ieee);
+       INIT_DELAYED_WORK_RSL(&ieee->associate_retry_wq, (void*)rtllib_associate_retry_wq,ieee);
+       INIT_WORK_RSL(&ieee->wx_sync_scan_wq,(void*)rtllib_wx_sync_scan_wq,ieee);
+
+       sema_init(&ieee->wx_sem, 1);
+       sema_init(&ieee->scan_sem, 1);
+       sema_init(&ieee->ips_sem,1);
+
+       spin_lock_init(&ieee->mgmt_tx_lock);
+       spin_lock_init(&ieee->beacon_lock);
+
+       tasklet_init(&ieee->ps_task,
+            (void(*)(unsigned long)) rtllib_sta_ps,
+            (unsigned long)ieee);
+
+}
+
+void rtllib_softmac_free(struct rtllib_device *ieee)
+{
+       down(&ieee->wx_sem);
+#ifdef ENABLE_DOT11D
+       if (NULL != ieee->pDot11dInfo)
+       {
+               kfree(ieee->pDot11dInfo);
+               ieee->pDot11dInfo = NULL;
+       }
+#endif
+       del_timer_sync(&ieee->associate_timer);
+
+#if LINUX_VERSION_CODE > KERNEL_VERSION(2,5,0)
+       cancel_delayed_work(&ieee->associate_retry_wq);
+       destroy_workqueue(ieee->wq);
+#endif
+
+       up(&ieee->wx_sem);
+}
+
+/********************************************************
+ * Start of WPA code.                                   *
+ * this is stolen from the ipw2200 driver               *
+ ********************************************************/
+
+
+static int rtllib_wpa_enable(struct rtllib_device *ieee, int value)
+{
+       /* This is called when wpa_supplicant loads and closes the driver
+        * interface. */
+       printk("%s WPA\n",value ? "enabling" : "disabling");
+       ieee->wpa_enabled = value;
+       memset(ieee->ap_mac_addr, 0, 6);
+       return 0;
+}
+
+
+void rtllib_wpa_assoc_frame(struct rtllib_device *ieee, char *wpa_ie, int wpa_ie_len)
+{
+       /* make sure WPA is enabled */
+       rtllib_wpa_enable(ieee, 1);
+
+       rtllib_disassociate(ieee);
+}
+
+
+static int rtllib_wpa_mlme(struct rtllib_device *ieee, int command, int reason)
+{
+
+       int ret = 0;
+
+       switch (command) {
+       case IEEE_MLME_STA_DEAUTH:
+               break;
+
+       case IEEE_MLME_STA_DISASSOC:
+               rtllib_disassociate(ieee);
+               break;
+
+       default:
+               printk("Unknown MLME request: %d\n", command);
+               ret = -EOPNOTSUPP;
+       }
+
+       return ret;
+}
+
+
+static int rtllib_wpa_set_wpa_ie(struct rtllib_device *ieee,
+                             struct ieee_param *param, int plen)
+{
+       u8 *buf;
+
+       if (param->u.wpa_ie.len > MAX_WPA_IE_LEN ||
+           (param->u.wpa_ie.len && param->u.wpa_ie.data == NULL))
+               return -EINVAL;
+
+       if (param->u.wpa_ie.len) {
+               buf = kmalloc(param->u.wpa_ie.len, GFP_KERNEL);
+               if (buf == NULL)
+                       return -ENOMEM;
+
+               memcpy(buf, param->u.wpa_ie.data, param->u.wpa_ie.len);
+               kfree(ieee->wpa_ie);
+               ieee->wpa_ie = buf;
+               ieee->wpa_ie_len = param->u.wpa_ie.len;
+       } else {
+               kfree(ieee->wpa_ie);
+               ieee->wpa_ie = NULL;
+               ieee->wpa_ie_len = 0;
+       }
+
+       rtllib_wpa_assoc_frame(ieee, ieee->wpa_ie, ieee->wpa_ie_len);
+       return 0;
+}
+
+#define AUTH_ALG_OPEN_SYSTEM                   0x1
+#define AUTH_ALG_SHARED_KEY                    0x2
+#define AUTH_ALG_LEAP                          0x4
+static int rtllib_wpa_set_auth_algs(struct rtllib_device *ieee, int value)
+{
+
+       struct rtllib_security sec = {
+               .flags = SEC_AUTH_MODE,
+       };
+       int ret = 0;
+
+       if (value & AUTH_ALG_SHARED_KEY) {
+               sec.auth_mode = WLAN_AUTH_SHARED_KEY;
+               ieee->open_wep = 0;
+               ieee->auth_mode = 1;
+       } else if (value & AUTH_ALG_OPEN_SYSTEM){
+               sec.auth_mode = WLAN_AUTH_OPEN;
+               ieee->open_wep = 1;
+               ieee->auth_mode = 0;
+       }
+       else if (value & AUTH_ALG_LEAP){
+               sec.auth_mode = WLAN_AUTH_LEAP  >> 6;
+               ieee->open_wep = 1;
+               ieee->auth_mode = 2;
+       }
+
+
+       if (ieee->set_security)
+               ieee->set_security(ieee->dev, &sec);
+
+       return ret;
+}
+
+static int rtllib_wpa_set_param(struct rtllib_device *ieee, u8 name, u32 value)
+{
+       int ret=0;
+       unsigned long flags;
+
+       switch (name) {
+       case IEEE_PARAM_WPA_ENABLED:
+               ret = rtllib_wpa_enable(ieee, value);
+               break;
+
+       case IEEE_PARAM_TKIP_COUNTERMEASURES:
+               ieee->tkip_countermeasures=value;
+               break;
+
+               case IEEE_PARAM_DROP_UNENCRYPTED:
+               {
+               /* HACK:
+                *
+                * wpa_supplicant calls set_wpa_enabled when the driver
+                * is loaded and unloaded, regardless of if WPA is being
+                * used.  No other calls are made which can be used to
+                * determine if encryption will be used or not prior to
+                * association being expected.  If encryption is not being
+                * used, drop_unencrypted is set to false, else true -- we
+                * can use this to determine if the CAP_PRIVACY_ON bit should
+                * be set.
+                */
+               struct rtllib_security sec = {
+                       .flags = SEC_ENABLED,
+                       .enabled = value,
+               };
+               ieee->drop_unencrypted = value;
+               /* We only change SEC_LEVEL for open mode. Others
+                * are set by ipw_wpa_set_encryption.
+                */
+               if (!value) {
+                       sec.flags |= SEC_LEVEL;
+                       sec.level = SEC_LEVEL_0;
+               }
+               else {
+                       sec.flags |= SEC_LEVEL;
+                       sec.level = SEC_LEVEL_1;
+               }
+               if (ieee->set_security)
+                       ieee->set_security(ieee->dev, &sec);
+               break;
+       }
+
+       case IEEE_PARAM_PRIVACY_INVOKED:
+               ieee->privacy_invoked=value;
+               break;
+
+       case IEEE_PARAM_AUTH_ALGS:
+               ret = rtllib_wpa_set_auth_algs(ieee, value);
+               break;
+
+       case IEEE_PARAM_IEEE_802_1X:
+               ieee->ieee802_1x=value;
+               break;
+       case IEEE_PARAM_WPAX_SELECT:
+               spin_lock_irqsave(&ieee->wpax_suitlist_lock,flags);
+               spin_unlock_irqrestore(&ieee->wpax_suitlist_lock,flags);
+               break;
+
+       default:
+               printk("Unknown WPA param: %d\n",name);
+               ret = -EOPNOTSUPP;
+       }
+
+       return ret;
+}
+
+/* implementation borrowed from hostap driver */
+static int rtllib_wpa_set_encryption(struct rtllib_device *ieee,
+                                 struct ieee_param *param, int param_len, u8 is_mesh)
+{
+       int ret = 0;
+       struct rtllib_crypto_ops *ops;
+       struct rtllib_crypt_data **crypt;
+
+       struct rtllib_security sec = {
+               .flags = 0,
+       };
+
+       param->u.crypt.err = 0;
+       param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
+
+       if (param_len !=
+           (int) ((char *) param->u.crypt.key - (char *) param) +
+           param->u.crypt.key_len) {
+               printk("Len mismatch %d, %d\n", param_len,
+                              param->u.crypt.key_len);
+               return -EINVAL;
+       }
+       if (param->sta_addr[0] == 0xff && param->sta_addr[1] == 0xff &&
+           param->sta_addr[2] == 0xff && param->sta_addr[3] == 0xff &&
+           param->sta_addr[4] == 0xff && param->sta_addr[5] == 0xff) {
+               if (param->u.crypt.idx >= WEP_KEYS)
+                       return -EINVAL;
+               crypt = &ieee->crypt[param->u.crypt.idx];
+       } else {
+               return -EINVAL;
+       }
+
+       if (strcmp(param->u.crypt.alg, "none") == 0) {
+               if (crypt) {
+                       sec.enabled = 0;
+                       sec.level = SEC_LEVEL_0;
+                       sec.flags |= SEC_ENABLED | SEC_LEVEL;
+                       rtllib_crypt_delayed_deinit(ieee, crypt);
+               }
+               goto done;
+       }
+       sec.enabled = 1;
+       sec.flags |= SEC_ENABLED;
+
+       /* IPW HW cannot build TKIP MIC, host decryption still needed. */
+       if (!(ieee->host_encrypt || ieee->host_decrypt) &&
+           strcmp(param->u.crypt.alg, "TKIP"))
+               goto skip_host_crypt;
+
+       ops = rtllib_get_crypto_ops(param->u.crypt.alg);
+       if (ops == NULL && strcmp(param->u.crypt.alg, "WEP") == 0) {
+               request_module("rtllib_crypt_wep");
+               ops = rtllib_get_crypto_ops(param->u.crypt.alg);
+       } else if (ops == NULL && strcmp(param->u.crypt.alg, "TKIP") == 0) {
+               request_module("rtllib_crypt_tkip");
+               ops = rtllib_get_crypto_ops(param->u.crypt.alg);
+       } else if (ops == NULL && strcmp(param->u.crypt.alg, "CCMP") == 0) {
+               request_module("rtllib_crypt_ccmp");
+               ops = rtllib_get_crypto_ops(param->u.crypt.alg);
+       }
+       if (ops == NULL) {
+               printk("unknown crypto alg '%s'\n", param->u.crypt.alg);
+               param->u.crypt.err = IEEE_CRYPT_ERR_UNKNOWN_ALG;
+               ret = -EINVAL;
+               goto done;
+       }
+       if (*crypt == NULL || (*crypt)->ops != ops) {
+               struct rtllib_crypt_data *new_crypt;
+
+               rtllib_crypt_delayed_deinit(ieee, crypt);
+
+               new_crypt = (struct rtllib_crypt_data *)
+                       kmalloc(sizeof(*new_crypt), GFP_KERNEL);
+               if (new_crypt == NULL) {
+                       ret = -ENOMEM;
+                       goto done;
+               }
+               memset(new_crypt, 0, sizeof(struct rtllib_crypt_data));
+               new_crypt->ops = ops;
+               if (new_crypt->ops)
+                       new_crypt->priv =
+                               new_crypt->ops->init(param->u.crypt.idx);
+
+               if (new_crypt->priv == NULL) {
+                       kfree(new_crypt);
+                       param->u.crypt.err = IEEE_CRYPT_ERR_CRYPT_INIT_FAILED;
+                       ret = -EINVAL;
+                       goto done;
+               }
+
+               *crypt = new_crypt;
+       }
+
+       if (param->u.crypt.key_len > 0 && (*crypt)->ops->set_key &&
+           (*crypt)->ops->set_key(param->u.crypt.key,
+           param->u.crypt.key_len, param->u.crypt.seq,
+           (*crypt)->priv) < 0) {
+               printk("key setting failed\n");
+               param->u.crypt.err = IEEE_CRYPT_ERR_KEY_SET_FAILED;
+               ret = -EINVAL;
+               goto done;
+       }
+
+ skip_host_crypt:
+       if (param->u.crypt.set_tx) {
+               ieee->tx_keyidx = param->u.crypt.idx;
+               sec.active_key = param->u.crypt.idx;
+               sec.flags |= SEC_ACTIVE_KEY;
+       } else
+               sec.flags &= ~SEC_ACTIVE_KEY;
+
+       if (param->u.crypt.alg != NULL) {
+               memcpy(sec.keys[param->u.crypt.idx],
+                      param->u.crypt.key,
+                      param->u.crypt.key_len);
+               sec.key_sizes[param->u.crypt.idx] = param->u.crypt.key_len;
+               sec.flags |= (1 << param->u.crypt.idx);
+
+               if (strcmp(param->u.crypt.alg, "WEP") == 0) {
+                       sec.flags |= SEC_LEVEL;
+                       sec.level = SEC_LEVEL_1;
+               } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
+                       sec.flags |= SEC_LEVEL;
+                       sec.level = SEC_LEVEL_2;
+               } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
+                       sec.flags |= SEC_LEVEL;
+                       sec.level = SEC_LEVEL_3;
+               }
+       }
+ done:
+       if (ieee->set_security)
+               ieee->set_security(ieee->dev, &sec);
+
+       /* Do not reset port if card is in Managed mode since resetting will
+        * generate new IEEE 802.11 authentication which may end up in looping
+        * with IEEE 802.1X.  If your hardware requires a reset after WEP
+        * configuration (for example... Prism2), implement the reset_port in
+        * the callbacks structures used to initialize the 802.11 stack. */
+       if (ieee->reset_on_keychange &&
+           ieee->iw_mode != IW_MODE_INFRA &&
+           ieee->reset_port &&
+           ieee->reset_port(ieee->dev)) {
+               printk("reset_port failed\n");
+               param->u.crypt.err = IEEE_CRYPT_ERR_CARD_CONF_FAILED;
+               return -EINVAL;
+       }
+
+       return ret;
+}
+
+inline struct sk_buff *rtllib_disauth_skb( struct rtllib_network *beacon,
+               struct rtllib_device *ieee, u16 asRsn)
+{
+       struct sk_buff *skb;
+       struct rtllib_disauth *disauth;
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+       int len = sizeof(struct rtllib_disauth) + ieee->tx_headroom + USB_512B_ALIGNMENT_SIZE;
+#else
+       int len = sizeof(struct rtllib_disauth) + ieee->tx_headroom;
+
+#endif
+       skb = dev_alloc_skb(len);
+       if (!skb) {
+               return NULL;
+       }
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+       skb_reserve(skb, ieee->tx_headroom);
+
+       disauth = (struct rtllib_disauth *) skb_put(skb,sizeof(struct rtllib_disauth));
+       disauth->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_DEAUTH);
+       disauth->header.duration_id = 0;
+
+       memcpy(disauth->header.addr1, beacon->bssid, ETH_ALEN);
+       memcpy(disauth->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(disauth->header.addr3, beacon->bssid, ETH_ALEN);
+
+       disauth->reason = cpu_to_le16(asRsn);
+       return skb;
+}
+
+inline struct sk_buff *rtllib_disassociate_skb( struct rtllib_network *beacon,
+               struct rtllib_device *ieee, u16 asRsn)
+{
+       struct sk_buff *skb;
+       struct rtllib_disassoc *disass;
+#ifdef USB_USE_ALIGNMENT
+        u32 Tmpaddr=0;
+        int alignment=0;
+       int len = sizeof(struct rtllib_disassoc) + ieee->tx_headroom + USB_512B_ALIGNMENT_SIZE;
+#else
+       int len = sizeof(struct rtllib_disassoc) + ieee->tx_headroom;
+#endif
+       skb = dev_alloc_skb(len);
+
+       if (!skb) {
+               return NULL;
+       }
+
+#ifdef USB_USE_ALIGNMENT
+        Tmpaddr = (u32)skb->data;
+        alignment = Tmpaddr & 0x1ff;
+        skb_reserve(skb,(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+       skb_reserve(skb, ieee->tx_headroom);
+
+       disass = (struct rtllib_disassoc *) skb_put(skb,sizeof(struct rtllib_disassoc));
+       disass->header.frame_ctl = cpu_to_le16(RTLLIB_STYPE_DISASSOC);
+       disass->header.duration_id = 0;
+
+       memcpy(disass->header.addr1, beacon->bssid, ETH_ALEN);
+       memcpy(disass->header.addr2, ieee->dev->dev_addr, ETH_ALEN);
+       memcpy(disass->header.addr3, beacon->bssid, ETH_ALEN);
+
+       disass->reason = cpu_to_le16(asRsn);
+       return skb;
+}
+
+void SendDisassociation(struct rtllib_device *ieee, bool deauth, u16 asRsn)
+{
+       struct rtllib_network *beacon = &ieee->current_network;
+       struct sk_buff *skb;
+
+       if (deauth) {
+               skb = rtllib_disauth_skb(beacon,ieee,asRsn);
+       } else {
+               skb = rtllib_disassociate_skb(beacon,ieee,asRsn);
+       }
+
+       if (skb){
+               softmac_mgmt_xmit(skb, ieee);
+       }
+}
+
+u8 rtllib_ap_sec_type(struct rtllib_device *ieee)
+{
+       static u8 ccmp_ie[4] = {0x00,0x50,0xf2,0x04};
+       static u8 ccmp_rsn_ie[4] = {0x00, 0x0f, 0xac, 0x04};
+       int wpa_ie_len= ieee->wpa_ie_len;
+       struct rtllib_crypt_data* crypt;
+       int encrypt;
+
+       crypt = ieee->crypt[ieee->tx_keyidx];
+       encrypt = (ieee->current_network.capability & WLAN_CAPABILITY_PRIVACY) ||\
+                 (ieee->host_encrypt && crypt && crypt->ops && \
+                  (0 == strcmp(crypt->ops->name,"WEP")));
+
+       /* simply judge  */
+       if (encrypt && (wpa_ie_len == 0)) {
+               return SEC_ALG_WEP;
+       } else if ((wpa_ie_len != 0)) {
+               if (((ieee->wpa_ie[0] == 0xdd) && (!memcmp(&(ieee->wpa_ie[14]),ccmp_ie,4))) ||
+                               ((ieee->wpa_ie[0] == 0x30) && (!memcmp(&ieee->wpa_ie[10],ccmp_rsn_ie, 4))))
+                       return SEC_ALG_CCMP;
+               else
+                       return SEC_ALG_TKIP;
+       } else {
+               return SEC_ALG_NONE;
+       }
+}
+
+int rtllib_wpa_supplicant_ioctl(struct rtllib_device *ieee, struct iw_point *p, u8 is_mesh)
+{
+       struct ieee_param *param;
+       int ret=0;
+
+       down(&ieee->wx_sem);
+
+       if (p->length < sizeof(struct ieee_param) || !p->pointer){
+               ret = -EINVAL;
+               goto out;
+       }
+
+       param = (struct ieee_param *)kmalloc(p->length, GFP_KERNEL);
+       if (param == NULL){
+               ret = -ENOMEM;
+               goto out;
+       }
+       if (copy_from_user(param, p->pointer, p->length)) {
+               kfree(param);
+               ret = -EFAULT;
+               goto out;
+       }
+
+       switch (param->cmd) {
+
+       case IEEE_CMD_SET_WPA_PARAM:
+               ret = rtllib_wpa_set_param(ieee, param->u.wpa_param.name,
+                                       param->u.wpa_param.value);
+               break;
+
+       case IEEE_CMD_SET_WPA_IE:
+               ret = rtllib_wpa_set_wpa_ie(ieee, param, p->length);
+               break;
+
+       case IEEE_CMD_SET_ENCRYPTION:
+               ret = rtllib_wpa_set_encryption(ieee, param, p->length, 0);
+               break;
+
+       case IEEE_CMD_MLME:
+               ret = rtllib_wpa_mlme(ieee, param->u.mlme.command,
+                                  param->u.mlme.reason_code);
+               break;
+
+       default:
+               printk("Unknown WPA supplicant request: %d\n",param->cmd);
+               ret = -EOPNOTSUPP;
+               break;
+       }
+
+       if (ret == 0 && copy_to_user(p->pointer, param, p->length))
+               ret = -EFAULT;
+
+       kfree(param);
+out:
+       up(&ieee->wx_sem);
+
+       return ret;
+}
+
+void
+rtllib_MgntDisconnectIBSS(struct rtllib_device* rtllib)
+{
+       u8      OpMode;
+       u8      i;
+       bool    bFilterOutNonAssociatedBSSID = false;
+
+       rtllib->state = RTLLIB_NOLINK;
+
+       for (i=0;i<6;i++)  rtllib->current_network.bssid[i]= 0x55;
+
+       rtllib->OpMode = RT_OP_MODE_NO_LINK;
+       rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_BSSID, rtllib->current_network.bssid);
+       OpMode = RT_OP_MODE_NO_LINK;
+       rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_MEDIA_STATUS, &OpMode);
+       rtllib_stop_send_beacons(rtllib);
+
+       bFilterOutNonAssociatedBSSID = false;
+       rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_CECHK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
+       notify_wx_assoc_event(rtllib);
+
+}
+
+void
+rtllib_MlmeDisassociateRequest(
+       struct rtllib_device* rtllib,
+       u8*             asSta,
+       u8              asRsn
+       )
+{
+       u8 i;
+       u8      OpMode;
+
+       RemovePeerTS(rtllib, asSta);
+
+
+       if (memcpy(rtllib->current_network.bssid,asSta,6) == 0)
+       {
+               rtllib->state = RTLLIB_NOLINK;
+
+               for (i=0;i<6;i++)  rtllib->current_network.bssid[i] = 0x22;
+               OpMode = RT_OP_MODE_NO_LINK;
+               rtllib->OpMode = RT_OP_MODE_NO_LINK;
+               rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_MEDIA_STATUS, (u8 *)(&OpMode) );
+               rtllib_disassociate(rtllib);
+
+               rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_BSSID, rtllib->current_network.bssid);
+
+       }
+
+}
+
+void
+rtllib_MgntDisconnectAP(
+       struct rtllib_device* rtllib,
+       u8 asRsn
+)
+{
+       bool bFilterOutNonAssociatedBSSID = false;
+
+
+#ifdef TO_DO
+       if (   pMgntInfo->SecurityInfo.AuthMode > RT_802_11AuthModeAutoSwitch ||
+               (pMgntInfo->bAPSuportCCKM && pMgntInfo->bCCX8021xenable) )
+       {
+               SecClearAllKeys(rtllib->dev);
+               RT_TRACE(COMP_SEC, DBG_LOUD,("======>CCKM clear key..."))
+       }
+#endif
+       bFilterOutNonAssociatedBSSID = false;
+       rtllib->SetHwRegHandler(rtllib->dev, HW_VAR_CECHK_BSSID, (u8*)(&bFilterOutNonAssociatedBSSID));
+       rtllib_MlmeDisassociateRequest( rtllib, rtllib->current_network.bssid, asRsn );
+
+       rtllib->state = RTLLIB_NOLINK;
+}
+
+bool
+rtllib_MgntDisconnect(
+       struct rtllib_device* rtllib,
+       u8 asRsn
+)
+{
+       if (rtllib->ps != RTLLIB_PS_DISABLED)
+       {
+#ifndef RTL8190P
+                rtllib->sta_wake_up(rtllib->dev);
+#endif
+       }
+
+#ifdef TO_DO
+       if (pMgntInfo->mActingAsAp)
+       {
+               RT_TRACE(COMP_MLME, DBG_LOUD, ("MgntDisconnect() ===> AP_DisassociateAllStation\n"));
+               AP_DisassociateAllStation(rtllib->dev, unspec_reason);
+               return true;
+       }
+#endif
+
+       if ( rtllib->state == RTLLIB_LINKED )
+       {
+               if ( rtllib->iw_mode == IW_MODE_ADHOC )
+               {
+                       rtllib_MgntDisconnectIBSS(rtllib);
+               }
+               if ( rtllib->iw_mode == IW_MODE_INFRA )
+               {
+#ifdef TO_DO_LIST
+                       SecClearAllKeys(Adapter);
+#endif
+                       rtllib_MgntDisconnectAP(rtllib, asRsn);
+               }
+
+       }
+
+       return true;
+}
+
+void notify_wx_assoc_event(struct rtllib_device *ieee)
+{
+       union iwreq_data wrqu;
+
+       if (ieee->cannot_notify)
+               return;
+
+       wrqu.ap_addr.sa_family = ARPHRD_ETHER;
+       if (ieee->state == RTLLIB_LINKED)
+               memcpy(wrqu.ap_addr.sa_data, ieee->current_network.bssid, ETH_ALEN);
+       else{
+
+               printk("%s(): Tell user space disconnected\n",__func__);
+               memset(wrqu.ap_addr.sa_data, 0, ETH_ALEN);
+       }
+       wireless_send_event(ieee->dev, SIOCGIWAP, &wrqu, NULL);
+}
diff --git a/drivers/staging/rtl8192e/rtllib_softmac_wx.c b/drivers/staging/rtl8192e/rtllib_softmac_wx.c
new file mode 100644 (file)
index 0000000..7cda290
--- /dev/null
@@ -0,0 +1,670 @@
+/* IEEE 802.11 SoftMAC layer
+ * Copyright (c) 2005 Andrea Merello <andreamrl@tiscali.it>
+ *
+ * Mostly extracted from the rtl8180-sa2400 driver for the
+ * in-kernel generic ieee802.11 stack.
+ *
+ * Some pieces of code might be stolen from ipw2100 driver
+ * copyright of who own it's copyright ;-)
+ *
+ * PS wx handler mostly stolen from hostap, copyright who
+ * own it's copyright ;-)
+ *
+ * released under the GPL
+ */
+
+
+#include "rtllib.h"
+#include "rtl_core.h"
+#ifdef ENABLE_DOT11D
+#include "dot11d.h"
+#endif
+/* FIXME: add A freqs */
+
+const long rtllib_wlan_frequencies[] = {
+       2412, 2417, 2422, 2427,
+       2432, 2437, 2442, 2447,
+       2452, 2457, 2462, 2467,
+       2472, 2484
+};
+
+
+int rtllib_wx_set_freq(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       int ret;
+       struct iw_freq *fwrq = & wrqu->freq;
+
+       down(&ieee->wx_sem);
+
+       if (ieee->iw_mode == IW_MODE_INFRA){
+               ret = 0;
+               goto out;
+       }
+
+       /* if setting by freq convert to channel */
+       if (fwrq->e == 1) {
+               if ((fwrq->m >= (int) 2.412e8 &&
+                    fwrq->m <= (int) 2.487e8)) {
+                       int f = fwrq->m / 100000;
+                       int c = 0;
+
+                       while ((c < 14) && (f != rtllib_wlan_frequencies[c]))
+                               c++;
+
+                       /* hack to fall through */
+                       fwrq->e = 0;
+                       fwrq->m = c + 1;
+               }
+       }
+
+       if (fwrq->e > 0 || fwrq->m > 14 || fwrq->m < 1 ){
+               ret = -EOPNOTSUPP;
+               goto out;
+
+       }else { /* Set the channel */
+
+#ifdef ENABLE_DOT11D
+               if (ieee->active_channel_map[fwrq->m] != 1) {
+                       ret = -EINVAL;
+                       goto out;
+               }
+#endif
+               ieee->current_network.channel = fwrq->m;
+               ieee->set_chan(ieee->dev, ieee->current_network.channel);
+
+               if (ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER)
+                       if (ieee->state == RTLLIB_LINKED){
+
+                       rtllib_stop_send_beacons(ieee);
+                       rtllib_start_send_beacons(ieee);
+                       }
+       }
+
+       ret = 0;
+out:
+       up(&ieee->wx_sem);
+       return ret;
+}
+
+
+int rtllib_wx_get_freq(struct rtllib_device *ieee,
+                            struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       struct iw_freq *fwrq = & wrqu->freq;
+
+       if (ieee->current_network.channel == 0)
+               return -1;
+       fwrq->m = rtllib_wlan_frequencies[ieee->current_network.channel-1] * 100000;
+       fwrq->e = 1;
+       return 0;
+}
+
+int rtllib_wx_get_wap(struct rtllib_device *ieee,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *extra)
+{
+       unsigned long flags;
+
+       wrqu->ap_addr.sa_family = ARPHRD_ETHER;
+
+       if (ieee->iw_mode == IW_MODE_MONITOR)
+               return -1;
+
+       /* We want avoid to give to the user inconsistent infos*/
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if (ieee->state != RTLLIB_LINKED &&
+               ieee->state != RTLLIB_LINKED_SCANNING &&
+               ieee->wap_set == 0)
+
+               memset(wrqu->ap_addr.sa_data, 0, ETH_ALEN);
+       else
+               memcpy(wrqu->ap_addr.sa_data,
+                      ieee->current_network.bssid, ETH_ALEN);
+
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+       return 0;
+}
+
+
+int rtllib_wx_set_wap(struct rtllib_device *ieee,
+                        struct iw_request_info *info,
+                        union iwreq_data *awrq,
+                        char *extra)
+{
+
+       int ret = 0;
+       u8 zero[] = {0,0,0,0,0,0};
+       unsigned long flags;
+
+       short ifup = ieee->proto_started;
+       struct sockaddr *temp = (struct sockaddr *)awrq;
+
+       rtllib_stop_scan_syncro(ieee);
+
+       down(&ieee->wx_sem);
+       /* use ifconfig hw ether */
+       if (ieee->iw_mode == IW_MODE_MASTER){
+               ret = -1;
+               goto out;
+       }
+
+       if (temp->sa_family != ARPHRD_ETHER){
+               ret = -EINVAL;
+               goto out;
+       }
+
+        if (memcmp(temp->sa_data, zero,ETH_ALEN) == 0){
+                spin_lock_irqsave(&ieee->lock, flags);
+                memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN);
+                ieee->wap_set = 0;
+                spin_unlock_irqrestore(&ieee->lock, flags);
+                ret = -1;
+                goto out;
+        }
+
+
+       if (ifup)
+               rtllib_stop_protocol(ieee,true);
+
+       /* just to avoid to give inconsistent infos in the
+        * get wx method. not really needed otherwise
+        */
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       ieee->cannot_notify = false;
+       memcpy(ieee->current_network.bssid, temp->sa_data, ETH_ALEN);
+       ieee->wap_set = (memcmp(temp->sa_data, zero,ETH_ALEN)!=0);
+
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+       if (ifup)
+               rtllib_start_protocol(ieee);
+out:
+       up(&ieee->wx_sem);
+       return ret;
+}
+
+ int rtllib_wx_get_essid(struct rtllib_device *ieee, struct iw_request_info *a,union iwreq_data *wrqu,char *b)
+{
+       int len,ret = 0;
+       unsigned long flags;
+
+       if (ieee->iw_mode == IW_MODE_MONITOR)
+               return -1;
+
+       /* We want avoid to give to the user inconsistent infos*/
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if (ieee->current_network.ssid[0] == '\0' ||
+               ieee->current_network.ssid_len == 0){
+               ret = -1;
+               goto out;
+       }
+
+       if (ieee->state != RTLLIB_LINKED &&
+               ieee->state != RTLLIB_LINKED_SCANNING &&
+               ieee->ssid_set == 0){
+               ret = -1;
+               goto out;
+       }
+       len = ieee->current_network.ssid_len;
+       wrqu->essid.length = len;
+       strncpy(b,ieee->current_network.ssid,len);
+       wrqu->essid.flags = 1;
+
+out:
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+       return ret;
+
+}
+
+int rtllib_wx_set_rate(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+
+       u32 target_rate = wrqu->bitrate.value;
+
+       ieee->rate = target_rate/100000;
+       return 0;
+}
+
+int rtllib_wx_get_rate(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       u32 tmp_rate = 0;
+#if defined RTL8192SU
+       if (ieee->mode & (IEEE_A | IEEE_B | IEEE_G))
+               tmp_rate = ieee->rate;
+       else if (ieee->mode & IEEE_N_5G)
+               tmp_rate = 580;
+       else if (ieee->mode & IEEE_N_24G) {
+               if (ieee->GetHalfNmodeSupportByAPsHandler(ieee->dev))
+                       tmp_rate = HTHalfMcsToDataRate(ieee, 15);
+               else
+                       tmp_rate = HTMcsToDataRate(ieee, 15);
+       }
+#elif defined RTL8192SE || defined RTL8192CE
+       tmp_rate = ieee->rtl_11n_user_show_rates(ieee->dev);
+#else
+        tmp_rate = TxCountToDataRate(ieee, ieee->softmac_stats.CurrentShowTxate);
+#endif
+       wrqu->bitrate.value = tmp_rate * 500000;
+
+       return 0;
+}
+
+
+int rtllib_wx_set_rts(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       if (wrqu->rts.disabled || !wrqu->rts.fixed)
+               ieee->rts = DEFAULT_RTS_THRESHOLD;
+       else
+       {
+               if (wrqu->rts.value < MIN_RTS_THRESHOLD ||
+                               wrqu->rts.value > MAX_RTS_THRESHOLD)
+                       return -EINVAL;
+               ieee->rts = wrqu->rts.value;
+       }
+       return 0;
+}
+
+int rtllib_wx_get_rts(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       wrqu->rts.value = ieee->rts;
+       wrqu->rts.fixed = 0;    /* no auto select */
+       wrqu->rts.disabled = (wrqu->rts.value == DEFAULT_RTS_THRESHOLD);
+       return 0;
+}
+
+int rtllib_wx_set_mode(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       int set_mode_status = 0;
+
+       rtllib_stop_scan_syncro(ieee);
+       down(&ieee->wx_sem);
+       switch (wrqu->mode) {
+       case IW_MODE_MONITOR:
+       case IW_MODE_ADHOC:
+       case IW_MODE_INFRA:
+               break;
+       case IW_MODE_AUTO:
+               wrqu->mode = IW_MODE_INFRA;
+               break;
+       default:
+               set_mode_status = -EINVAL;
+               goto out;
+       }
+
+       if (wrqu->mode == ieee->iw_mode)
+               goto out;
+
+       if (wrqu->mode == IW_MODE_MONITOR) {
+#if defined(RTLLIB_RADIOTAP) && (LINUX_VERSION_CODE > KERNEL_VERSION(2,6,10))
+               ieee->dev->type = ARPHRD_IEEE80211_RADIOTAP;
+#else
+               ieee->dev->type = ARPHRD_IEEE80211;
+#endif
+               rtllib_EnableNetMonitorMode(ieee->dev,false);
+
+       } else {
+               ieee->dev->type = ARPHRD_ETHER;
+               if (ieee->iw_mode == IW_MODE_MONITOR)
+                       rtllib_DisableNetMonitorMode(ieee->dev,false);
+       }
+
+       if (!ieee->proto_started) {
+               ieee->iw_mode = wrqu->mode;
+       } else {
+               rtllib_stop_protocol(ieee,true);
+               ieee->iw_mode = wrqu->mode;
+               rtllib_start_protocol(ieee);
+       }
+
+out:
+       up(&ieee->wx_sem);
+       return set_mode_status;
+}
+
+void rtllib_wx_sync_scan_wq(void *data)
+{
+       struct rtllib_device *ieee = container_of_work_rsl(data, struct rtllib_device, wx_sync_scan_wq);
+       short chan;
+       HT_EXTCHNL_OFFSET chan_offset=0;
+       HT_CHANNEL_WIDTH bandwidth=0;
+       int b40M = 0;
+       static int count = 0;
+
+       if (!(ieee->softmac_features & IEEE_SOFTMAC_SCAN)){
+               rtllib_start_scan_syncro(ieee, 0);
+               goto out;
+       }
+
+       chan = ieee->current_network.channel;
+
+       if (ieee->LeisurePSLeave)
+               ieee->LeisurePSLeave(ieee->dev);
+       /* notify AP to be in PS mode */
+       rtllib_sta_ps_send_null_frame(ieee, 1);
+       rtllib_sta_ps_send_null_frame(ieee, 1);
+
+       rtllib_stop_all_queues(ieee);
+
+       if (ieee->data_hard_stop)
+               ieee->data_hard_stop(ieee->dev);
+       rtllib_stop_send_beacons(ieee);
+       ieee->state = RTLLIB_LINKED_SCANNING;
+       ieee->link_change(ieee->dev);
+       /* wait for ps packet to be kicked out successfully */
+       msleep(50);
+
+       if (ieee->ScanOperationBackupHandler)
+               ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_BACKUP);
+
+       if (ieee->pHTInfo->bCurrentHTSupport && ieee->pHTInfo->bEnableHT && ieee->pHTInfo->bCurBW40MHz) {
+               b40M = 1;
+               chan_offset = ieee->pHTInfo->CurSTAExtChnlOffset;
+               bandwidth = (HT_CHANNEL_WIDTH)ieee->pHTInfo->bCurBW40MHz;
+               RT_TRACE(COMP_DBG, "Scan in 40M, force to 20M first:%d, %d\n", chan_offset, bandwidth);
+               ieee->SetBWModeHandler(ieee->dev, HT_CHANNEL_WIDTH_20, HT_EXTCHNL_OFFSET_NO_EXT);
+               }
+
+       rtllib_start_scan_syncro(ieee, 0);
+
+       if (b40M) {
+               RT_TRACE(COMP_DBG, "Scan in 20M, back to 40M\n");
+               if (chan_offset == HT_EXTCHNL_OFFSET_UPPER)
+                       ieee->set_chan(ieee->dev, chan + 2);
+               else if (chan_offset == HT_EXTCHNL_OFFSET_LOWER)
+                       ieee->set_chan(ieee->dev, chan - 2);
+               else
+                       ieee->set_chan(ieee->dev, chan);
+               ieee->SetBWModeHandler(ieee->dev, bandwidth, chan_offset);
+       } else {
+               ieee->set_chan(ieee->dev, chan);
+       }
+
+       if (ieee->ScanOperationBackupHandler)
+               ieee->ScanOperationBackupHandler(ieee->dev,SCAN_OPT_RESTORE);
+
+       ieee->state = RTLLIB_LINKED;
+       ieee->link_change(ieee->dev);
+
+       /* Notify AP that I wake up again */
+       rtllib_sta_ps_send_null_frame(ieee, 0);
+
+       if (ieee->LinkDetectInfo.NumRecvBcnInPeriod == 0 ||
+           ieee->LinkDetectInfo.NumRecvDataInPeriod == 0 ) {
+               ieee->LinkDetectInfo.NumRecvBcnInPeriod = 1;
+               ieee->LinkDetectInfo.NumRecvDataInPeriod= 1;
+       }
+
+       if (ieee->data_hard_resume)
+               ieee->data_hard_resume(ieee->dev);
+
+       if (ieee->iw_mode == IW_MODE_ADHOC || ieee->iw_mode == IW_MODE_MASTER)
+               rtllib_start_send_beacons(ieee);
+
+       rtllib_wake_all_queues(ieee);
+
+       count = 0;
+out:
+       up(&ieee->wx_sem);
+
+}
+
+int rtllib_wx_set_scan(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       int ret = 0;
+
+       down(&ieee->wx_sem);
+
+       if (ieee->iw_mode == IW_MODE_MONITOR || !(ieee->proto_started)){
+               ret = -1;
+               goto out;
+       }
+
+       if ( ieee->state == RTLLIB_LINKED){
+               queue_work_rsl(ieee->wq, &ieee->wx_sync_scan_wq);
+               /* intentionally forget to up sem */
+               return 0;
+       }
+
+out:
+       up(&ieee->wx_sem);
+       return ret;
+}
+
+int rtllib_wx_set_essid(struct rtllib_device *ieee,
+                             struct iw_request_info *a,
+                             union iwreq_data *wrqu, char *extra)
+{
+
+       int ret=0,len,i;
+       short proto_started;
+       unsigned long flags;
+
+       rtllib_stop_scan_syncro(ieee);
+       down(&ieee->wx_sem);
+
+       proto_started = ieee->proto_started;
+
+#if (LINUX_VERSION_CODE < KERNEL_VERSION(2,6,20))
+       len = ((wrqu->essid.length-1) < IW_ESSID_MAX_SIZE) ? (wrqu->essid.length-1) : IW_ESSID_MAX_SIZE;
+#else
+       len = (wrqu->essid.length < IW_ESSID_MAX_SIZE) ? wrqu->essid.length : IW_ESSID_MAX_SIZE;
+#endif
+
+       if (len > IW_ESSID_MAX_SIZE){
+               ret= -E2BIG;
+               goto out;
+       }
+
+       if (ieee->iw_mode == IW_MODE_MONITOR){
+               ret= -1;
+               goto out;
+       }
+
+       for (i=0; i<len; i++){
+               if (extra[i] < 0){
+                       ret= -1;
+                       goto out;
+               }
+       }
+
+       if (proto_started)
+               rtllib_stop_protocol(ieee,true);
+
+
+       /* this is just to be sure that the GET wx callback
+        * has consisten infos. not needed otherwise
+        */
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       if (wrqu->essid.flags && wrqu->essid.length) {
+               strncpy(ieee->current_network.ssid, extra, len);
+               ieee->current_network.ssid_len = len;
+               ieee->cannot_notify = false;
+               ieee->ssid_set = 1;
+       }
+       else{
+               ieee->ssid_set = 0;
+               ieee->current_network.ssid[0] = '\0';
+               ieee->current_network.ssid_len = 0;
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+
+       if (proto_started)
+               rtllib_start_protocol(ieee);
+out:
+       up(&ieee->wx_sem);
+       return ret;
+}
+
+ int rtllib_wx_get_mode(struct rtllib_device *ieee, struct iw_request_info *a,
+                            union iwreq_data *wrqu, char *b)
+{
+       wrqu->mode = ieee->iw_mode;
+       return 0;
+}
+
+ int rtllib_wx_set_rawtx(struct rtllib_device *ieee,
+                              struct iw_request_info *info,
+                              union iwreq_data *wrqu, char *extra)
+{
+
+       int *parms = (int *)extra;
+       int enable = (parms[0] > 0);
+       short prev = ieee->raw_tx;
+
+       down(&ieee->wx_sem);
+
+       if (enable)
+               ieee->raw_tx = 1;
+       else
+               ieee->raw_tx = 0;
+
+       printk(KERN_INFO"raw TX is %s\n",
+             ieee->raw_tx ? "enabled" : "disabled");
+
+       if (ieee->iw_mode == IW_MODE_MONITOR)
+       {
+               if (prev == 0 && ieee->raw_tx){
+                       if (ieee->data_hard_resume)
+                               ieee->data_hard_resume(ieee->dev);
+
+                       netif_carrier_on(ieee->dev);
+               }
+
+               if (prev && ieee->raw_tx == 1)
+                       netif_carrier_off(ieee->dev);
+       }
+
+       up(&ieee->wx_sem);
+
+       return 0;
+}
+
+int rtllib_wx_get_name(struct rtllib_device *ieee,
+                            struct iw_request_info *info,
+                            union iwreq_data *wrqu, char *extra)
+{
+       strcpy(wrqu->name, "802.11");
+
+       if (ieee->modulation & RTLLIB_CCK_MODULATION)
+               strcat(wrqu->name, "b");
+       if (ieee->modulation & RTLLIB_OFDM_MODULATION)
+               strcat(wrqu->name, "g");
+       if (ieee->mode & (IEEE_N_24G | IEEE_N_5G))
+               strcat(wrqu->name, "n");
+       return 0;
+}
+
+
+/* this is mostly stolen from hostap */
+int rtllib_wx_set_power(struct rtllib_device *ieee,
+                                struct iw_request_info *info,
+                                union iwreq_data *wrqu, char *extra)
+{
+       int ret = 0;
+#if 1
+       if (
+               (!ieee->sta_wake_up) ||
+               (!ieee->enter_sleep_state) ||
+               (!ieee->ps_is_queue_empty)){
+
+               RTLLIB_DEBUG(RTLLIB_DL_ERR,"%s(): PS mode is tryied to be use but driver missed a callback\n\n",__func__);
+
+               return -1;
+       }
+#endif
+       down(&ieee->wx_sem);
+
+       if (wrqu->power.disabled){
+               RT_TRACE(COMP_DBG, "===>%s(): power disable\n",__func__);
+               ieee->ps = RTLLIB_PS_DISABLED;
+               goto exit;
+       }
+       if (wrqu->power.flags & IW_POWER_TIMEOUT) {
+               ieee->ps_timeout = wrqu->power.value / 1000;
+               RT_TRACE(COMP_DBG, "===>%s():ps_timeout is %d\n",__func__,ieee->ps_timeout);
+       }
+
+       if (wrqu->power.flags & IW_POWER_PERIOD) {
+
+               ieee->ps_period = wrqu->power.value / 1000;
+
+       }
+       switch (wrqu->power.flags & IW_POWER_MODE) {
+       case IW_POWER_UNICAST_R:
+               ieee->ps = RTLLIB_PS_UNICAST;
+               break;
+       case IW_POWER_MULTICAST_R:
+               ieee->ps = RTLLIB_PS_MBCAST;
+               break;
+       case IW_POWER_ALL_R:
+               ieee->ps = RTLLIB_PS_UNICAST | RTLLIB_PS_MBCAST;
+               break;
+
+       case IW_POWER_ON:
+               break;
+
+       default:
+               ret = -EINVAL;
+               goto exit;
+
+       }
+exit:
+       up(&ieee->wx_sem);
+       return ret;
+
+}
+
+/* this is stolen from hostap */
+int rtllib_wx_get_power(struct rtllib_device *ieee,
+                                struct iw_request_info *info,
+                                union iwreq_data *wrqu, char *extra)
+{
+       int ret =0;
+
+       down(&ieee->wx_sem);
+
+       if (ieee->ps == RTLLIB_PS_DISABLED) {
+               wrqu->power.disabled = 1;
+               goto exit;
+       }
+
+       wrqu->power.disabled = 0;
+
+       if ((wrqu->power.flags & IW_POWER_TYPE) == IW_POWER_TIMEOUT) {
+               wrqu->power.flags = IW_POWER_TIMEOUT;
+               wrqu->power.value = ieee->ps_timeout * 1000;
+       } else {
+               wrqu->power.flags = IW_POWER_PERIOD;
+               wrqu->power.value = ieee->ps_period * 1000;
+       }
+
+       if ((ieee->ps & (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST)) == (RTLLIB_PS_MBCAST | RTLLIB_PS_UNICAST))
+               wrqu->power.flags |= IW_POWER_ALL_R;
+       else if (ieee->ps & RTLLIB_PS_MBCAST)
+               wrqu->power.flags |= IW_POWER_MULTICAST_R;
+       else
+               wrqu->power.flags |= IW_POWER_UNICAST_R;
+
+exit:
+       up(&ieee->wx_sem);
+       return ret;
+
+}
diff --git a/drivers/staging/rtl8192e/rtllib_tx.c b/drivers/staging/rtl8192e/rtllib_tx.c
new file mode 100644 (file)
index 0000000..3cc066e
--- /dev/null
@@ -0,0 +1,1121 @@
+/******************************************************************************
+
+  Copyright(c) 2003 - 2004 Intel Corporation. All rights reserved.
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  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.
+
+  The full GNU General Public License is included in this distribution in the
+  file called LICENSE.
+
+  Contact Information:
+  James P. Ketrenos <ipw2100-admin@linux.intel.com>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+******************************************************************************
+
+  Few modifications for Realtek's Wi-Fi drivers by
+  Andrea Merello <andreamrl@tiscali.it>
+
+  A special thanks goes to Realtek for their support !
+
+******************************************************************************/
+
+#include <linux/compiler.h>
+#include <linux/errno.h>
+#include <linux/if_arp.h>
+#include <linux/in6.h>
+#include <linux/in.h>
+#include <linux/ip.h>
+#include <linux/kernel.h>
+#include <linux/module.h>
+#include <linux/netdevice.h>
+#include <linux/pci.h>
+#include <linux/proc_fs.h>
+#include <linux/skbuff.h>
+#include <linux/slab.h>
+#include <linux/tcp.h>
+#include <linux/types.h>
+#include <linux/version.h>
+#include <linux/wireless.h>
+#include <linux/etherdevice.h>
+#include <asm/uaccess.h>
+#include <linux/if_vlan.h>
+
+#include "rtllib.h"
+
+#ifdef RTK_DMP_PLATFORM
+#include <linux/usb_setting.h>
+#endif
+
+/*
+
+
+802.11 Data Frame
+
+
+802.11 frame_contorl for data frames - 2 bytes
+     ,-----------------------------------------------------------------------------------------.
+bits | 0  |  1  |  2  |  3  |  4  |  5  |  6  |  7  |  8  |  9  |  a  |  b  |  c  |  d  |  e   |
+     |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
+val  | 0  |  0  |  0  |  1  |  x  |  0  |  0  |  0  |  1  |  0  |  x  |  x  |  x  |  x  |  x   |
+     |----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|-----|------|
+desc | ^-ver-^  |  ^type-^  |  ^-----subtype-----^  | to  |from |more |retry| pwr |more |wep   |
+     |          |           | x=0 data,x=1 data+ack | DS  | DS  |frag |     | mgm |data |      |
+     '-----------------------------------------------------------------------------------------'
+                                                   /\
+                                                    |
+802.11 Data Frame                                   |
+           ,--------- 'ctrl' expands to >-----------'
+          |
+      ,--'---,-------------------------------------------------------------.
+Bytes |  2   |  2   |    6    |    6    |    6    |  2   | 0..2312 |   4  |
+      |------|------|---------|---------|---------|------|---------|------|
+Desc. | ctrl | dura |  DA/RA  |   TA    |    SA   | Sequ |  Frame  |  fcs |
+      |      | tion | (BSSID) |         |         | ence |  data   |      |
+      `--------------------------------------------------|         |------'
+Total: 28 non-data bytes                                 `----.----'
+                                                              |
+       .- 'Frame data' expands to <---------------------------'
+       |
+       V
+      ,---------------------------------------------------.
+Bytes |  1   |  1   |    1    |    3     |  2   |  0-2304 |
+      |------|------|---------|----------|------|---------|
+Desc. | SNAP | SNAP | Control |Eth Tunnel| Type | IP      |
+      | DSAP | SSAP |         |          |      | Packet  |
+      | 0xAA | 0xAA |0x03 (UI)|0x00-00-F8|      |         |
+      `-----------------------------------------|         |
+Total: 8 non-data bytes                         `----.----'
+                                                     |
+       .- 'IP Packet' expands, if WEP enabled, to <--'
+       |
+       V
+      ,-----------------------.
+Bytes |  4  |   0-2296  |  4  |
+      |-----|-----------|-----|
+Desc. | IV  | Encrypted | ICV |
+      |     | IP Packet |     |
+      `-----------------------'
+Total: 8 non-data bytes
+
+
+802.3 Ethernet Data Frame
+
+      ,-----------------------------------------.
+Bytes |   6   |   6   |  2   |  Variable |   4  |
+      |-------|-------|------|-----------|------|
+Desc. | Dest. | Source| Type | IP Packet |  fcs |
+      |  MAC  |  MAC  |      |           |      |
+      `-----------------------------------------'
+Total: 18 non-data bytes
+
+In the event that fragmentation is required, the incoming payload is split into
+N parts of size ieee->fts.  The first fragment contains the SNAP header and the
+remaining packets are just data.
+
+If encryption is enabled, each fragment payload size is reduced by enough space
+to add the prefix and postfix (IV and ICV totalling 8 bytes in the case of WEP)
+So if you have 1500 bytes of payload with ieee->fts set to 500 without
+encryption it will take 3 frames.  With WEP it will take 4 frames as the
+payload of each frame is reduced to 492 bytes.
+
+* SKB visualization
+*
+*  ,- skb->data
+* |
+* |    ETHERNET HEADER        ,-<-- PAYLOAD
+* |                           |     14 bytes from skb->data
+* |  2 bytes for Type --> ,T. |     (sizeof ethhdr)
+* |                       | | |
+* |,-Dest.--. ,--Src.---. | | |
+* |  6 bytes| | 6 bytes | | | |
+* v         | |         | | | |
+* 0         | v       1 | v | v           2
+* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+*     ^     | ^         | ^ |
+*     |     | |         | | |
+*     |     | |         | `T' <---- 2 bytes for Type
+*     |     | |         |
+*     |     | '---SNAP--' <-------- 6 bytes for SNAP
+*     |     |
+*     `-IV--' <-------------------- 4 bytes for IV (WEP)
+*
+*      SNAP HEADER
+*
+*/
+
+static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
+static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
+
+inline int rtllib_put_snap(u8 *data, u16 h_proto)
+{
+       struct rtllib_snap_hdr *snap;
+       u8 *oui;
+
+       snap = (struct rtllib_snap_hdr *)data;
+       snap->dsap = 0xaa;
+       snap->ssap = 0xaa;
+       snap->ctrl = 0x03;
+
+       if (h_proto == 0x8137 || h_proto == 0x80f3)
+               oui = P802_1H_OUI;
+       else
+               oui = RFC1042_OUI;
+       snap->oui[0] = oui[0];
+       snap->oui[1] = oui[1];
+       snap->oui[2] = oui[2];
+
+       *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
+
+       return SNAP_SIZE + sizeof(u16);
+}
+
+int rtllib_encrypt_fragment(
+       struct rtllib_device *ieee,
+       struct sk_buff *frag,
+       int hdr_len)
+{
+       struct rtllib_crypt_data* crypt = NULL;
+       int res;
+
+       crypt = ieee->crypt[ieee->tx_keyidx];
+
+       if (!(crypt && crypt->ops))
+       {
+               printk("=========>%s(), crypt is null\n", __func__);
+               return -1;
+       }
+#ifdef CONFIG_RTLLIB_CRYPT_TKIP
+       struct rtllib_hdr_1addr *header;
+
+       if (ieee->tkip_countermeasures &&
+           crypt && crypt->ops && strcmp(crypt->ops->name, "TKIP") == 0) {
+               header = (struct rtllib_hdr_1addr *) frag->data;
+               if (net_ratelimit()) {
+                       printk(KERN_DEBUG "%s: TKIP countermeasures: dropped "
+                              "TX packet to " MAC_FMT "\n",
+                              ieee->dev->name, MAC_ARG(header->addr1));
+               }
+               return -1;
+       }
+#endif
+       /* To encrypt, frame format is:
+        * IV (4 bytes), clear payload (including SNAP), ICV (4 bytes) */
+
+       /* Host-based IEEE 802.11 fragmentation for TX is not yet supported, so
+        * call both MSDU and MPDU encryption functions from here. */
+       atomic_inc(&crypt->refcnt);
+       res = 0;
+       if (crypt->ops->encrypt_msdu)
+               res = crypt->ops->encrypt_msdu(frag, hdr_len, crypt->priv);
+       if (res == 0 && crypt->ops->encrypt_mpdu)
+               res = crypt->ops->encrypt_mpdu(frag, hdr_len, crypt->priv);
+
+       atomic_dec(&crypt->refcnt);
+       if (res < 0) {
+               printk(KERN_INFO "%s: Encryption failed: len=%d.\n",
+                      ieee->dev->name, frag->len);
+               ieee->ieee_stats.tx_discards++;
+               return -1;
+       }
+
+       return 0;
+}
+
+
+void rtllib_txb_free(struct rtllib_txb *txb) {
+       if (unlikely(!txb))
+               return;
+       kfree(txb);
+}
+
+struct rtllib_txb *rtllib_alloc_txb(int nr_frags, int txb_size,
+                                         int gfp_mask)
+{
+#ifdef USB_USE_ALIGNMENT
+       u32 Tmpaddr=0;
+       int alignment=0;
+#endif
+       struct rtllib_txb *txb;
+       int i;
+       txb = kmalloc(
+               sizeof(struct rtllib_txb) + (sizeof(u8*) * nr_frags),
+               gfp_mask);
+       if (!txb)
+               return NULL;
+
+       memset(txb, 0, sizeof(struct rtllib_txb));
+       txb->nr_frags = nr_frags;
+       txb->frag_size = txb_size;
+
+       for (i = 0; i < nr_frags; i++) {
+#ifdef USB_USE_ALIGNMENT
+               txb->fragments[i] = dev_alloc_skb(txb_size+USB_512B_ALIGNMENT_SIZE);
+#else
+               txb->fragments[i] = dev_alloc_skb(txb_size);
+#endif
+               if (unlikely(!txb->fragments[i])) {
+                       i--;
+                       break;
+               }
+#ifdef USB_USE_ALIGNMENT
+               Tmpaddr = (u32)(txb->fragments[i]->data);
+               alignment = Tmpaddr & 0x1ff;
+               skb_reserve(txb->fragments[i],(USB_512B_ALIGNMENT_SIZE - alignment));
+#endif
+               memset(txb->fragments[i]->cb, 0, sizeof(txb->fragments[i]->cb));
+       }
+       if (unlikely(i != nr_frags)) {
+               while (i >= 0)
+                       dev_kfree_skb_any(txb->fragments[i--]);
+               kfree(txb);
+               return NULL;
+       }
+       return txb;
+}
+
+int
+rtllib_classify(struct sk_buff *skb, u8 bIsAmsdu)
+{
+       struct ethhdr *eth;
+       struct iphdr *ip;
+
+       eth = (struct ethhdr *)skb->data;
+       if (eth->h_proto != htons(ETH_P_IP))
+               return 0;
+
+       RTLLIB_DEBUG_DATA(RTLLIB_DL_DATA, skb->data, skb->len);
+       ip = ip_hdr(skb);
+       switch (ip->tos & 0xfc) {
+       case 0x20:
+               return 2;
+       case 0x40:
+               return 1;
+       case 0x60:
+               return 3;
+       case 0x80:
+               return 4;
+       case 0xa0:
+               return 5;
+       case 0xc0:
+               return 6;
+       case 0xe0:
+               return 7;
+       default:
+               return 0;
+       }
+}
+
+#define SN_LESS(a, b)          (((a-b)&0x800)!=0)
+void rtllib_tx_query_agg_cap(struct rtllib_device* ieee, struct sk_buff* skb, cb_desc* tcb_desc)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+       PTX_TS_RECORD                   pTxTs = NULL;
+       struct rtllib_hdr_1addr* hdr = (struct rtllib_hdr_1addr*)skb->data;
+
+       if (rtllib_act_scanning(ieee,false))
+               return;
+
+       if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
+               return;
+       if (!IsQoSDataFrame(skb->data))
+               return;
+       if (is_multicast_ether_addr(hdr->addr1) || is_broadcast_ether_addr(hdr->addr1))
+               return;
+#ifdef TO_DO_LIST
+       if (pTcb->PacketLength >= 4096)
+               return;
+       if (!Adapter->HalFunc.GetNmodeSupportBySecCfgHandler(Adapter))
+               return;
+#endif
+
+       if (tcb_desc->bdhcp || ieee->CntAfterLink<2)
+               return;
+
+       if (pHTInfo->IOTAction & HT_IOT_ACT_TX_NO_AGGREGATION)
+               return;
+
+       if (!ieee->GetNmodeSupportBySecCfg(ieee->dev))
+               return;
+       if (pHTInfo->bCurrentAMPDUEnable){
+               if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTxTs), hdr->addr1, skb->priority, TX_DIR, true)){
+                       printk("%s: can't get TS\n", __func__);
+                       return;
+               }
+               if (pTxTs->TxAdmittedBARecord.bValid == false){
+                       if (ieee->wpa_ie_len && (ieee->pairwise_key_type == KEY_TYPE_NA)) {
+                               ;
+                       } else if (tcb_desc->bdhcp == 1){
+                               ;
+                       } else if (!pTxTs->bDisable_AddBa){
+                               TsStartAddBaProcess(ieee, pTxTs);
+                       }
+                       goto FORCED_AGG_SETTING;
+               } else if (pTxTs->bUsingBa == false) {
+                       if (SN_LESS(pTxTs->TxAdmittedBARecord.BaStartSeqCtrl.field.SeqNum, (pTxTs->TxCurSeq+1)%4096))
+                               pTxTs->bUsingBa = true;
+                       else
+                               goto FORCED_AGG_SETTING;
+               }
+               if (ieee->iw_mode == IW_MODE_INFRA) {
+                       tcb_desc->bAMPDUEnable = true;
+                       tcb_desc->ampdu_factor = pHTInfo->CurrentAMPDUFactor;
+                       tcb_desc->ampdu_density = pHTInfo->CurrentMPDUDensity;
+               }
+       }
+FORCED_AGG_SETTING:
+       switch (pHTInfo->ForcedAMPDUMode) {
+               case HT_AGG_AUTO:
+                       break;
+
+               case HT_AGG_FORCE_ENABLE:
+                       tcb_desc->bAMPDUEnable = true;
+                       tcb_desc->ampdu_density = pHTInfo->ForcedMPDUDensity;
+                       tcb_desc->ampdu_factor = pHTInfo->ForcedAMPDUFactor;
+                       break;
+
+               case HT_AGG_FORCE_DISABLE:
+                       tcb_desc->bAMPDUEnable = false;
+                       tcb_desc->ampdu_density = 0;
+                       tcb_desc->ampdu_factor = 0;
+                       break;
+
+       }
+               return;
+}
+
+extern void rtllib_qurey_ShortPreambleMode(struct rtllib_device* ieee, cb_desc* tcb_desc)
+{
+       tcb_desc->bUseShortPreamble = false;
+       if (tcb_desc->data_rate == 2)
+       {
+               return;
+       }
+       else if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
+       {
+               tcb_desc->bUseShortPreamble = true;
+       }
+       return;
+}
+
+extern void
+rtllib_query_HTCapShortGI(struct rtllib_device *ieee, cb_desc *tcb_desc)
+{
+       PRT_HIGH_THROUGHPUT             pHTInfo = ieee->pHTInfo;
+
+       tcb_desc->bUseShortGI           = false;
+
+       if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
+               return;
+
+       if (pHTInfo->bForcedShortGI)
+       {
+               tcb_desc->bUseShortGI = true;
+               return;
+       }
+
+       if ((pHTInfo->bCurBW40MHz==true) && pHTInfo->bCurShortGI40MHz)
+               tcb_desc->bUseShortGI = true;
+       else if ((pHTInfo->bCurBW40MHz==false) && pHTInfo->bCurShortGI20MHz)
+               tcb_desc->bUseShortGI = true;
+}
+
+void rtllib_query_BandwidthMode(struct rtllib_device* ieee, cb_desc *tcb_desc)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+
+       tcb_desc->bPacketBW = false;
+
+       if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT)
+               return;
+
+       if (tcb_desc->bMulticast || tcb_desc->bBroadcast)
+               return;
+
+       if ((tcb_desc->data_rate & 0x80)==0)
+               return;
+       if (pHTInfo->bCurBW40MHz && pHTInfo->bCurTxBW40MHz && !ieee->bandwidth_auto_switch.bforced_tx20Mhz)
+               tcb_desc->bPacketBW = true;
+       return;
+}
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+extern void rtllib_ibss_query_HTCapShortGI(struct rtllib_device *ieee, cb_desc *tcb_desc,u8 is_peer_shortGI_40M,u8 is_peer_shortGI_20M)
+{
+       PRT_HIGH_THROUGHPUT             pHTInfo = ieee->pHTInfo;
+
+       tcb_desc->bUseShortGI           = false;
+
+       if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT || (ieee->iw_mode != IW_MODE_ADHOC))
+       {
+               return;
+       }
+
+       if (pHTInfo->bForcedShortGI)
+       {
+               tcb_desc->bUseShortGI = true;
+               return;
+       }
+       if ((pHTInfo->bCurBW40MHz==true) && is_peer_shortGI_40M)
+               tcb_desc->bUseShortGI = true;
+       else if ((pHTInfo->bCurBW40MHz==false) && is_peer_shortGI_20M)
+               tcb_desc->bUseShortGI = true;
+}
+void rtllib_ibss_query_BandwidthMode(struct rtllib_device* ieee, cb_desc *tcb_desc, u8 is_peer_40M)
+{
+       PRT_HIGH_THROUGHPUT     pHTInfo = ieee->pHTInfo;
+
+       tcb_desc->bPacketBW = false;
+
+       if (!pHTInfo->bCurrentHTSupport||!pHTInfo->bEnableHT || (ieee->iw_mode != IW_MODE_ADHOC))
+       {
+               return;
+       }
+
+       if (tcb_desc->bMulticast || tcb_desc->bBroadcast)
+       {
+               return;
+       }
+
+       if ((tcb_desc->data_rate & 0x80)==0)
+       {
+               return;
+       }
+       if (pHTInfo->bCurBW40MHz && is_peer_40M && !ieee->bandwidth_auto_switch.bforced_tx20Mhz)
+               tcb_desc->bPacketBW = true;
+       return;
+}
+#endif
+void rtllib_query_protectionmode(struct rtllib_device* ieee, cb_desc* tcb_desc, struct sk_buff* skb)
+{
+       tcb_desc->bRTSSTBC                      = false;
+       tcb_desc->bRTSUseShortGI                = false;
+       tcb_desc->bCTSEnable                    = false;
+       tcb_desc->RTSSC                         = 0;
+       tcb_desc->bRTSBW                        = false;
+
+       if (tcb_desc->bBroadcast || tcb_desc->bMulticast)
+               return;
+
+       if (is_broadcast_ether_addr(skb->data+16))
+               return;
+
+       if (ieee->mode < IEEE_N_24G)
+       {
+               if (skb->len > ieee->rts)
+               {
+                       tcb_desc->bRTSEnable = true;
+                       tcb_desc->rts_rate = MGN_24M;
+               }
+               else if (ieee->current_network.buseprotection)
+               {
+                       tcb_desc->bRTSEnable = true;
+                       tcb_desc->bCTSEnable = true;
+                       tcb_desc->rts_rate = MGN_24M;
+               }
+               return;
+       }
+       else
+       {
+               PRT_HIGH_THROUGHPUT pHTInfo = ieee->pHTInfo;
+               while (true)
+               {
+                       if (pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
+                       {
+                               tcb_desc->bCTSEnable    = true;
+                               tcb_desc->rts_rate  =   MGN_24M;
+                               tcb_desc->bRTSEnable = true;
+                               break;
+                       }
+                       else if (pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))
+                       {
+                               tcb_desc->bRTSEnable = true;
+                               tcb_desc->rts_rate  =   MGN_24M;
+                               break;
+                       }
+                       if (ieee->current_network.buseprotection)
+                       {
+                               tcb_desc->bRTSEnable = true;
+                               tcb_desc->bCTSEnable = true;
+                               tcb_desc->rts_rate = MGN_24M;
+                               break;
+                       }
+                       if (pHTInfo->bCurrentHTSupport  && pHTInfo->bEnableHT)
+                       {
+                               u8 HTOpMode = pHTInfo->CurrentOpMode;
+                               if ((pHTInfo->bCurBW40MHz && (HTOpMode == 2 || HTOpMode == 3)) ||
+                                                       (!pHTInfo->bCurBW40MHz && HTOpMode == 3) )
+                               {
+                                       tcb_desc->rts_rate = MGN_24M;
+                                       tcb_desc->bRTSEnable = true;
+                                       break;
+                               }
+                       }
+                       if (skb->len > ieee->rts)
+                       {
+                               tcb_desc->rts_rate = MGN_24M;
+                               tcb_desc->bRTSEnable = true;
+                               break;
+                       }
+                       if (tcb_desc->bAMPDUEnable)
+                       {
+                               tcb_desc->rts_rate = MGN_24M;
+                               tcb_desc->bRTSEnable = false;
+                               break;
+                       }
+                       goto NO_PROTECTION;
+               }
+               }
+       if ( 0 )
+       {
+               tcb_desc->bCTSEnable    = true;
+               tcb_desc->rts_rate = MGN_24M;
+               tcb_desc->bRTSEnable    = true;
+       }
+       if (ieee->current_network.capability & WLAN_CAPABILITY_SHORT_PREAMBLE)
+               tcb_desc->bUseShortPreamble = true;
+       if (ieee->iw_mode == IW_MODE_MASTER)
+                       goto NO_PROTECTION;
+       return;
+NO_PROTECTION:
+       tcb_desc->bRTSEnable    = false;
+       tcb_desc->bCTSEnable    = false;
+       tcb_desc->rts_rate              = 0;
+       tcb_desc->RTSSC         = 0;
+       tcb_desc->bRTSBW                = false;
+}
+
+
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+void rtllib_txrate_selectmode(struct rtllib_device* ieee, cb_desc* tcb_desc,struct sta_info *psta)
+#else
+void rtllib_txrate_selectmode(struct rtllib_device* ieee, cb_desc* tcb_desc)
+#endif
+{
+#ifdef TO_DO_LIST
+       if (!IsDataFrame(pFrame))
+       {
+               pTcb->bTxDisableRateFallBack = true;
+               pTcb->bTxUseDriverAssingedRate = true;
+               pTcb->RATRIndex = 7;
+               return;
+       }
+
+       if (pMgntInfo->ForcedDataRate!= 0)
+       {
+               pTcb->bTxDisableRateFallBack = true;
+               pTcb->bTxUseDriverAssingedRate = true;
+               return;
+       }
+#endif
+       if (ieee->bTxDisableRateFallBack)
+               tcb_desc->bTxDisableRateFallBack = true;
+
+       if (ieee->bTxUseDriverAssingedRate)
+               tcb_desc->bTxUseDriverAssingedRate = true;
+       if (!tcb_desc->bTxDisableRateFallBack || !tcb_desc->bTxUseDriverAssingedRate)
+       {
+               if (ieee->iw_mode == IW_MODE_INFRA || ieee->iw_mode == IW_MODE_ADHOC)
+                       tcb_desc->RATRIndex = 0;
+       }
+}
+
+u16 rtllib_query_seqnum(struct rtllib_device*ieee, struct sk_buff* skb, u8* dst)
+{
+       u16 seqnum = 0;
+
+       if (is_multicast_ether_addr(dst) || is_broadcast_ether_addr(dst))
+               return 0;
+       if (IsQoSDataFrame(skb->data))
+       {
+               PTX_TS_RECORD pTS = NULL;
+               if (!GetTs(ieee, (PTS_COMMON_INFO*)(&pTS), dst, skb->priority, TX_DIR, true))
+               {
+                       return 0;
+               }
+               seqnum = pTS->TxCurSeq;
+               pTS->TxCurSeq = (pTS->TxCurSeq+1)%4096;
+               return seqnum;
+       }
+       return 0;
+}
+
+static int wme_downgrade_ac(struct sk_buff *skb)
+{
+       switch (skb->priority) {
+               case 6:
+               case 7:
+                       skb->priority = 5; /* VO -> VI */
+                       return 0;
+               case 4:
+               case 5:
+                       skb->priority = 3; /* VI -> BE */
+                       return 0;
+               case 0:
+               case 3:
+                       skb->priority = 1; /* BE -> BK */
+                       return 0;
+               default:
+                       return -1;
+       }
+}
+
+int rtllib_xmit_inter(struct sk_buff *skb, struct net_device *dev)
+{
+       struct rtllib_device *ieee = (struct rtllib_device *)netdev_priv_rsl(dev);
+       struct rtllib_txb *txb = NULL;
+       struct rtllib_hdr_3addrqos *frag_hdr;
+       int i, bytes_per_frag, nr_frags, bytes_last_frag, frag_size;
+       unsigned long flags;
+       struct net_device_stats *stats = &ieee->stats;
+       int ether_type = 0, encrypt;
+       int bytes, fc, qos_ctl = 0, hdr_len;
+       struct sk_buff *skb_frag;
+       struct rtllib_hdr_3addrqos header = { /* Ensure zero initialized */
+               .duration_id = 0,
+               .seq_ctl = 0,
+               .qos_ctl = 0
+       };
+       u8 dest[ETH_ALEN], src[ETH_ALEN];
+       int qos_actived = ieee->current_network.qos_data.active;
+       struct rtllib_crypt_data* crypt = NULL;
+       cb_desc *tcb_desc;
+       u8 bIsMulticast = false;
+       u8 IsAmsdu = false;
+
+       bool    bdhcp =false;
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       /* If there is no driver handler to take the TXB, dont' bother
+        * creating it... */
+       if ((!ieee->hard_start_xmit && !(ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE))||
+          ((!ieee->softmac_data_hard_start_xmit && (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE)))) {
+               printk(KERN_WARNING "%s: No xmit handler.\n",
+                      ieee->dev->name);
+               goto success;
+       }
+
+
+       if (likely(ieee->raw_tx == 0)){
+               if (unlikely(skb->len < SNAP_SIZE + sizeof(u16))) {
+                       printk(KERN_WARNING "%s: skb too small (%d).\n",
+                       ieee->dev->name, skb->len);
+                       goto success;
+               }
+               /* Save source and destination addresses */
+               memcpy(dest, skb->data, ETH_ALEN);
+               memcpy(src, skb->data+ETH_ALEN, ETH_ALEN);
+
+               memset(skb->cb, 0, sizeof(skb->cb));
+               ether_type = ntohs(((struct ethhdr *)skb->data)->h_proto);
+
+               if (ieee->iw_mode == IW_MODE_MONITOR)
+               {
+                       txb = rtllib_alloc_txb(1, skb->len, GFP_ATOMIC);
+                       if (unlikely(!txb)) {
+                               printk(KERN_WARNING "%s: Could not allocate TXB\n",
+                               ieee->dev->name);
+                               goto failed;
+                       }
+
+                       txb->encrypted = 0;
+                       txb->payload_size = skb->len;
+                       memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len);
+
+                       goto success;
+               }
+
+               if (skb->len > 282){
+                       if (ETH_P_IP == ether_type) {
+                               const struct iphdr *ip = (struct iphdr *)((u8 *)skb->data+14);
+                               if (IPPROTO_UDP == ip->protocol) {
+                                       struct udphdr *udp = (struct udphdr *)((u8 *)ip + (ip->ihl << 2));
+                                       if (((((u8 *)udp)[1] == 68) && (((u8 *)udp)[3] == 67)) ||
+                                           ((((u8 *)udp)[1] == 67) && (((u8 *)udp)[3] == 68))) {
+                                               printk("DHCP pkt src port:%d, dest port:%d!!\n", ((u8 *)udp)[1],((u8 *)udp)[3]);
+
+                                               bdhcp = true;
+                                               ieee->LPSDelayCnt = 200;
+                                       }
+                               }
+                       }else if (ETH_P_ARP == ether_type){
+                               printk("=================>DHCP Protocol start tx ARP pkt!!\n");
+                               bdhcp = true;
+                               ieee->LPSDelayCnt = ieee->current_network.tim.tim_count;
+
+
+                       }
+               }
+
+               skb->priority = rtllib_classify(skb, IsAmsdu);
+               crypt = ieee->crypt[ieee->tx_keyidx];
+               encrypt = !(ether_type == ETH_P_PAE && ieee->ieee802_1x) &&
+                       ieee->host_encrypt && crypt && crypt->ops;
+               if (!encrypt && ieee->ieee802_1x &&
+               ieee->drop_unencrypted && ether_type != ETH_P_PAE) {
+                       stats->tx_dropped++;
+                       goto success;
+               }
+       #ifdef CONFIG_RTLLIB_DEBUG
+               if (crypt && !encrypt && ether_type == ETH_P_PAE) {
+                       struct eapol *eap = (struct eapol *)(skb->data +
+                               sizeof(struct ethhdr) - SNAP_SIZE - sizeof(u16));
+                       RTLLIB_DEBUG_EAP("TX: IEEE 802.11 EAPOL frame: %s\n",
+                               eap_get_type(eap->type));
+               }
+       #endif
+
+               /* Advance the SKB to the start of the payload */
+               skb_pull(skb, sizeof(struct ethhdr));
+
+                /* Determine total amount of storage required for TXB packets */
+               bytes = skb->len + SNAP_SIZE + sizeof(u16);
+
+               if (encrypt)
+                       fc = RTLLIB_FTYPE_DATA | RTLLIB_FCTL_WEP;
+               else
+                       fc = RTLLIB_FTYPE_DATA;
+
+               if (qos_actived)
+                       fc |= RTLLIB_STYPE_QOS_DATA;
+               else
+                       fc |= RTLLIB_STYPE_DATA;
+
+               if (ieee->iw_mode == IW_MODE_INFRA) {
+                       fc |= RTLLIB_FCTL_TODS;
+                       /* To DS: Addr1 = BSSID, Addr2 = SA,
+                       Addr3 = DA */
+                       memcpy(&header.addr1, ieee->current_network.bssid, ETH_ALEN);
+                       memcpy(&header.addr2, &src, ETH_ALEN);
+                       if (IsAmsdu)
+                               memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN);
+                       else
+                               memcpy(&header.addr3, &dest, ETH_ALEN);
+               } else if (ieee->iw_mode == IW_MODE_ADHOC) {
+                       /* not From/To DS: Addr1 = DA, Addr2 = SA,
+                       Addr3 = BSSID */
+                       memcpy(&header.addr1, dest, ETH_ALEN);
+                       memcpy(&header.addr2, src, ETH_ALEN);
+                       memcpy(&header.addr3, ieee->current_network.bssid, ETH_ALEN);
+               }
+
+               bIsMulticast = is_broadcast_ether_addr(header.addr1) ||is_multicast_ether_addr(header.addr1);
+
+                header.frame_ctl = cpu_to_le16(fc);
+
+               /* Determine fragmentation size based on destination (multicast
+               * and broadcast are not fragmented) */
+               if (bIsMulticast) {
+                       frag_size = MAX_FRAG_THRESHOLD;
+                       qos_ctl |= QOS_CTL_NOTCONTAIN_ACK;
+               } else {
+                       frag_size = ieee->fts;
+                       qos_ctl = 0;
+               }
+
+               if (qos_actived) {
+                       hdr_len = RTLLIB_3ADDR_LEN + 2;
+
+                    /* in case we are a client verify acm is not set for this ac */
+                    while (unlikely(ieee->wmm_acm & (0x01 << skb->priority))) {
+                        printk("skb->priority = %x\n", skb->priority);
+                        if (wme_downgrade_ac(skb)) {
+                            break;
+                        }
+                        printk("converted skb->priority = %x\n", skb->priority);
+                    }
+                    qos_ctl |= skb->priority;
+                    header.qos_ctl = cpu_to_le16(qos_ctl & RTLLIB_QOS_TID);
+               } else {
+                       hdr_len = RTLLIB_3ADDR_LEN;
+               }
+               /* Determine amount of payload per fragment.  Regardless of if
+               * this stack is providing the full 802.11 header, one will
+               * eventually be affixed to this fragment -- so we must account for
+               * it when determining the amount of payload space. */
+               bytes_per_frag = frag_size - hdr_len;
+               if (ieee->config &
+               (CFG_RTLLIB_COMPUTE_FCS | CFG_RTLLIB_RESERVE_FCS))
+                       bytes_per_frag -= RTLLIB_FCS_LEN;
+
+               /* Each fragment may need to have room for encryptiong pre/postfix */
+               if (encrypt) {
+                       bytes_per_frag -= crypt->ops->extra_prefix_len +
+                               crypt->ops->extra_postfix_len;
+               }
+               /* Number of fragments is the total bytes_per_frag /
+               * payload_per_fragment */
+               nr_frags = bytes / bytes_per_frag;
+               bytes_last_frag = bytes % bytes_per_frag;
+               if (bytes_last_frag)
+                       nr_frags++;
+               else
+                       bytes_last_frag = bytes_per_frag;
+
+               /* When we allocate the TXB we allocate enough space for the reserve
+               * and full fragment bytes (bytes_per_frag doesn't include prefix,
+               * postfix, header, FCS, etc.) */
+               txb = rtllib_alloc_txb(nr_frags, frag_size + ieee->tx_headroom, GFP_ATOMIC);
+               if (unlikely(!txb)) {
+                       printk(KERN_WARNING "%s: Could not allocate TXB\n",
+                       ieee->dev->name);
+                       goto failed;
+               }
+               txb->encrypted = encrypt;
+               txb->payload_size = bytes;
+
+               if (qos_actived)
+               {
+                       txb->queue_index = UP2AC(skb->priority);
+               } else {
+                       txb->queue_index = WME_AC_BE;;
+               }
+
+               for (i = 0; i < nr_frags; i++) {
+                       skb_frag = txb->fragments[i];
+                       tcb_desc = (cb_desc *)(skb_frag->cb + MAX_DEV_ADDR_SIZE);
+                       if (qos_actived){
+                               skb_frag->priority = skb->priority;
+                               tcb_desc->queue_index =  UP2AC(skb->priority);
+                       } else {
+                               skb_frag->priority = WME_AC_BE;
+                               tcb_desc->queue_index = WME_AC_BE;
+                       }
+                       skb_reserve(skb_frag, ieee->tx_headroom);
+
+                       if (encrypt){
+                               if (ieee->hwsec_active)
+                                       tcb_desc->bHwSec = 1;
+                               else
+                                       tcb_desc->bHwSec = 0;
+                               skb_reserve(skb_frag, crypt->ops->extra_prefix_len);
+                       } else {
+                               tcb_desc->bHwSec = 0;
+                       }
+                       frag_hdr = (struct rtllib_hdr_3addrqos *)skb_put(skb_frag, hdr_len);
+                       memcpy(frag_hdr, &header, hdr_len);
+
+                       /* If this is not the last fragment, then add the MOREFRAGS
+                       * bit to the frame control */
+                       if (i != nr_frags - 1) {
+                               frag_hdr->frame_ctl = cpu_to_le16(
+                                       fc | RTLLIB_FCTL_MOREFRAGS);
+                               bytes = bytes_per_frag;
+
+                       } else {
+                               /* The last fragment takes the remaining length */
+                               bytes = bytes_last_frag;
+                       }
+                       if ((qos_actived) && (!bIsMulticast))
+                       {
+                               frag_hdr->seq_ctl = rtllib_query_seqnum(ieee, skb_frag, header.addr1);
+                               frag_hdr->seq_ctl = cpu_to_le16(frag_hdr->seq_ctl<<4 | i);
+                       } else {
+                               frag_hdr->seq_ctl = cpu_to_le16(ieee->seq_ctrl[0]<<4 | i);
+                       }
+                       /* Put a SNAP header on the first fragment */
+                       if (i == 0) {
+                               rtllib_put_snap(
+                                       skb_put(skb_frag, SNAP_SIZE + sizeof(u16)),
+                                       ether_type);
+                               bytes -= SNAP_SIZE + sizeof(u16);
+                       }
+
+                       memcpy(skb_put(skb_frag, bytes), skb->data, bytes);
+
+                       /* Advance the SKB... */
+                       skb_pull(skb, bytes);
+
+                       /* Encryption routine will move the header forward in order
+                       * to insert the IV between the header and the payload */
+                       if (encrypt)
+                               rtllib_encrypt_fragment(ieee, skb_frag, hdr_len);
+                       if (ieee->config &
+                       (CFG_RTLLIB_COMPUTE_FCS | CFG_RTLLIB_RESERVE_FCS))
+                               skb_put(skb_frag, 4);
+               }
+
+               if ((qos_actived) && (!bIsMulticast)) {
+                 if (ieee->seq_ctrl[UP2AC(skb->priority) + 1] == 0xFFF)
+                       ieee->seq_ctrl[UP2AC(skb->priority) + 1] = 0;
+                 else
+                       ieee->seq_ctrl[UP2AC(skb->priority) + 1]++;
+               } else {
+                 if (ieee->seq_ctrl[0] == 0xFFF)
+                       ieee->seq_ctrl[0] = 0;
+                 else
+                       ieee->seq_ctrl[0]++;
+               }
+       }else{
+               if (unlikely(skb->len < sizeof(struct rtllib_hdr_3addr))) {
+                       printk(KERN_WARNING "%s: skb too small (%d).\n",
+                       ieee->dev->name, skb->len);
+                       goto success;
+               }
+
+               txb = rtllib_alloc_txb(1, skb->len, GFP_ATOMIC);
+               if (!txb){
+                       printk(KERN_WARNING "%s: Could not allocate TXB\n",
+                       ieee->dev->name);
+                       goto failed;
+               }
+
+               txb->encrypted = 0;
+               txb->payload_size = skb->len;
+               memcpy(skb_put(txb->fragments[0],skb->len), skb->data, skb->len);
+       }
+
+ success:
+       if (txb)
+       {
+#if 1
+               cb_desc *tcb_desc = (cb_desc *)(txb->fragments[0]->cb + MAX_DEV_ADDR_SIZE);
+               tcb_desc->bTxEnableFwCalcDur = 1;
+               tcb_desc->priority = skb->priority;
+
+               if (ether_type == ETH_P_PAE) {
+                       if (ieee->pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
+                       {
+                               tcb_desc->data_rate = MgntQuery_TxRateExcludeCCKRates(ieee);
+                               tcb_desc->bTxDisableRateFallBack = false;
+                       }else{
+                               tcb_desc->data_rate = ieee->basic_rate;
+                               tcb_desc->bTxDisableRateFallBack = 1;
+                       }
+
+
+                       tcb_desc->RATRIndex = 7;
+                       tcb_desc->bTxUseDriverAssingedRate = 1;
+               } else {
+                       if (is_multicast_ether_addr(header.addr1))
+                               tcb_desc->bMulticast = 1;
+                       if (is_broadcast_ether_addr(header.addr1))
+                               tcb_desc->bBroadcast = 1;
+#if defined(RTL8192U) || defined(RTL8192SU) || defined(RTL8192SE)
+                       if ( tcb_desc->bMulticast ||  tcb_desc->bBroadcast){
+                               rtllib_txrate_selectmode(ieee, tcb_desc, p_sta);
+                               tcb_desc->data_rate = ieee->basic_rate;
+                       }
+                       else
+                       {
+                               if (ieee->iw_mode == IW_MODE_ADHOC)
+                               {
+                                       u8 is_peer_shortGI_40M = 0;
+                                       u8 is_peer_shortGI_20M = 0;
+                                       u8 is_peer_BW_40M = 0;
+                                       p_sta = GetStaInfo(ieee, header.addr1);
+                                       if (NULL == p_sta)
+                                       {
+                                               rtllib_txrate_selectmode(ieee, tcb_desc, p_sta);
+                                               tcb_desc->data_rate = ieee->rate;
+                                       }
+                                       else
+                                       {
+                                               rtllib_txrate_selectmode(ieee, tcb_desc, p_sta);
+                                               tcb_desc->data_rate = CURRENT_RATE(p_sta->wireless_mode, p_sta->CurDataRate, p_sta->htinfo.HTHighestOperaRate);
+                                               is_peer_shortGI_40M = p_sta->htinfo.bCurShortGI40MHz;
+                                               is_peer_shortGI_20M = p_sta->htinfo.bCurShortGI20MHz;
+                                               is_peer_BW_40M = p_sta->htinfo.bCurTxBW40MHz;
+                                       }
+                                       rtllib_qurey_ShortPreambleMode(ieee, tcb_desc);
+                                       rtllib_tx_query_agg_cap(ieee, txb->fragments[0], tcb_desc);
+                                       rtllib_ibss_query_HTCapShortGI(ieee, tcb_desc,is_peer_shortGI_40M,is_peer_shortGI_20M);
+                                       rtllib_ibss_query_BandwidthMode(ieee, tcb_desc,is_peer_BW_40M);
+                                       rtllib_query_protectionmode(ieee, tcb_desc, txb->fragments[0]);
+                               }
+                               else {
+                                       rtllib_txrate_selectmode(ieee, tcb_desc, p_sta);
+                                       tcb_desc->data_rate = CURRENT_RATE(ieee->mode, ieee->rate, ieee->HTCurrentOperaRate);
+                                       if (bdhcp == true){
+                                               if (ieee->pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom) {
+                                                       tcb_desc->data_rate = MGN_1M;
+                                                       tcb_desc->bTxDisableRateFallBack = false;
+                                               }else{
+                                                       tcb_desc->data_rate = MGN_1M;
+                                                       tcb_desc->bTxDisableRateFallBack = 1;
+                                               }
+
+                                               tcb_desc->RATRIndex = 7;
+                                               tcb_desc->bTxUseDriverAssingedRate = 1;
+                                               tcb_desc->bdhcp = 1;
+                                       }
+                                       rtllib_qurey_ShortPreambleMode(ieee, tcb_desc);
+                                       rtllib_tx_query_agg_cap(ieee, txb->fragments[0], tcb_desc);
+                                       rtllib_query_HTCapShortGI(ieee, tcb_desc);
+                                       rtllib_query_BandwidthMode(ieee, tcb_desc);
+                                       rtllib_query_protectionmode(ieee, tcb_desc, txb->fragments[0]);
+                               }
+                       }
+#else
+                       rtllib_txrate_selectmode(ieee, tcb_desc);
+                       if ( tcb_desc->bMulticast ||  tcb_desc->bBroadcast)
+                               tcb_desc->data_rate = ieee->basic_rate;
+                       else
+                               tcb_desc->data_rate = CURRENT_RATE(ieee->mode, ieee->rate, ieee->HTCurrentOperaRate);
+
+                       if (bdhcp == true){
+                               if (ieee->pHTInfo->IOTAction & HT_IOT_ACT_WA_IOT_Broadcom)
+                               {
+                                       tcb_desc->data_rate = MgntQuery_TxRateExcludeCCKRates(ieee);
+                                       tcb_desc->bTxDisableRateFallBack = false;
+                               }else{
+                                       tcb_desc->data_rate = MGN_1M;
+                                       tcb_desc->bTxDisableRateFallBack = 1;
+                               }
+
+
+                               tcb_desc->RATRIndex = 7;
+                               tcb_desc->bTxUseDriverAssingedRate = 1;
+                               tcb_desc->bdhcp = 1;
+                       }
+
+                       rtllib_qurey_ShortPreambleMode(ieee, tcb_desc);
+                       rtllib_tx_query_agg_cap(ieee, txb->fragments[0], tcb_desc);
+                       rtllib_query_HTCapShortGI(ieee, tcb_desc);
+                       rtllib_query_BandwidthMode(ieee, tcb_desc);
+                       rtllib_query_protectionmode(ieee, tcb_desc, txb->fragments[0]);
+#endif
+               }
+#endif
+       }
+       spin_unlock_irqrestore(&ieee->lock, flags);
+       dev_kfree_skb_any(skb);
+       if (txb) {
+               if (ieee->softmac_features & IEEE_SOFTMAC_TX_QUEUE){
+                       dev->stats.tx_packets++;
+                       dev->stats.tx_bytes += txb->payload_size;
+                       rtllib_softmac_xmit(txb, ieee);
+               }else{
+                       if ((*ieee->hard_start_xmit)(txb, dev) == 0) {
+                               stats->tx_packets++;
+                               stats->tx_bytes += txb->payload_size;
+                               return 0;
+                       }
+                       rtllib_txb_free(txb);
+               }
+       }
+
+       return 0;
+
+ failed:
+       spin_unlock_irqrestore(&ieee->lock, flags);
+       netif_stop_queue(dev);
+       stats->tx_errors++;
+       return 1;
+
+}
+int rtllib_xmit(struct sk_buff *skb, struct net_device *dev)
+{
+       memset(skb->cb, 0, sizeof(skb->cb));
+       return rtllib_xmit_inter(skb, dev);
+}
diff --git a/drivers/staging/rtl8192e/rtllib_wx.c b/drivers/staging/rtl8192e/rtllib_wx.c
new file mode 100644 (file)
index 0000000..7f3f5b0
--- /dev/null
@@ -0,0 +1,901 @@
+/******************************************************************************
+
+  Copyright(c) 2004 Intel Corporation. All rights reserved.
+
+  Portions of this file are based on the WEP enablement code provided by the
+  Host AP project hostap-drivers v0.1.3
+  Copyright (c) 2001-2002, SSH Communications Security Corp and Jouni Malinen
+  <jkmaline@cc.hut.fi>
+  Copyright (c) 2002-2003, Jouni Malinen <jkmaline@cc.hut.fi>
+
+  This program is free software; you can redistribute it and/or modify it
+  under the terms of version 2 of the GNU General Public License as
+  published by the Free Software Foundation.
+
+  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.
+
+  The full GNU General Public License is included in this distribution in the
+  file called LICENSE.
+
+  Contact Information:
+  James P. Ketrenos <ipw2100-admin@linux.intel.com>
+  Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497
+
+******************************************************************************/
+#include <linux/wireless.h>
+#include <linux/version.h>
+#include <linux/kmod.h>
+#include <linux/module.h>
+
+#include "rtllib.h"
+struct modes_unit {
+       char *mode_string;
+       int mode_size;
+};
+static struct modes_unit rtllib_modes[] = {
+       {"a",1},
+       {"b",1},
+       {"g",1},
+       {"?",1},
+       {"N-24G",5},
+       {"N-5G",4},
+};
+
+#define MAX_CUSTOM_LEN 64
+static inline char *rtl819x_translate_scan(struct rtllib_device *ieee,
+                                          char *start, char *stop,
+                                          struct rtllib_network *network,
+                                           struct iw_request_info *info)
+{
+       char custom[MAX_CUSTOM_LEN];
+       char proto_name[IFNAMSIZ];
+       char *pname = proto_name;
+       char *p;
+       struct iw_event iwe;
+       int i, j;
+       u16 max_rate, rate;
+       static u8       EWC11NHTCap[] = {0x00, 0x90, 0x4c, 0x33};
+
+       /* First entry *MUST* be the AP MAC address */
+       iwe.cmd = SIOCGIWAP;
+       iwe.u.ap_addr.sa_family = ARPHRD_ETHER;
+       memcpy(iwe.u.ap_addr.sa_data, network->bssid, ETH_ALEN);
+       start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_ADDR_LEN);
+       /* Remaining entries will be displayed in the order we provide them */
+
+       /* Add the ESSID */
+       iwe.cmd = SIOCGIWESSID;
+       iwe.u.data.flags = 1;
+       if (network->ssid_len > 0){
+               iwe.u.data.length = min(network->ssid_len, (u8)32);
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, network->ssid);
+        }else if (network->hidden_ssid_len == 0){
+               iwe.u.data.length = sizeof("<hidden>");
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, "<hidden>");
+        }else {
+               iwe.u.data.length = min(network->hidden_ssid_len, (u8)32);
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, network->hidden_ssid);
+       }
+       /* Add the protocol name */
+       iwe.cmd = SIOCGIWNAME;
+       for (i=0; i<(sizeof(rtllib_modes)/sizeof(rtllib_modes[0])); i++) {
+               if (network->mode&(1<<i)) {
+                       sprintf(pname,rtllib_modes[i].mode_string,rtllib_modes[i].mode_size);
+                       pname +=rtllib_modes[i].mode_size;
+               }
+       }
+       *pname = '\0';
+       snprintf(iwe.u.name, IFNAMSIZ, "IEEE802.11%s", proto_name);
+        start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_CHAR_LEN);
+        /* Add mode */
+        iwe.cmd = SIOCGIWMODE;
+        if (network->capability &
+           (WLAN_CAPABILITY_ESS | WLAN_CAPABILITY_IBSS)) {
+               if (network->capability & WLAN_CAPABILITY_ESS)
+                       iwe.u.mode = IW_MODE_MASTER;
+               else
+                       iwe.u.mode = IW_MODE_ADHOC;
+               start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_UINT_LEN);
+        }
+
+        /* Add frequency/channel */
+       iwe.cmd = SIOCGIWFREQ;
+/*     iwe.u.freq.m = rtllib_frequency(network->channel, network->mode);
+       iwe.u.freq.e = 3; */
+       iwe.u.freq.m = network->channel;
+       iwe.u.freq.e = 0;
+       iwe.u.freq.i = 0;
+       start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_FREQ_LEN);
+
+       /* Add encryption capability */
+       iwe.cmd = SIOCGIWENCODE;
+       if (network->capability & WLAN_CAPABILITY_PRIVACY)
+               iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY;
+       else
+               iwe.u.data.flags = IW_ENCODE_DISABLED;
+       iwe.u.data.length = 0;
+       start = iwe_stream_add_point_rsl(info, start, stop, &iwe, network->ssid);
+       /* Add basic and extended rates */
+       max_rate = 0;
+       p = custom;
+       p += snprintf(p, MAX_CUSTOM_LEN - (p - custom), " Rates (Mb/s): ");
+       for (i = 0, j = 0; i < network->rates_len; ) {
+               if (j < network->rates_ex_len &&
+                   ((network->rates_ex[j] & 0x7F) <
+                    (network->rates[i] & 0x7F)))
+                       rate = network->rates_ex[j++] & 0x7F;
+               else
+                       rate = network->rates[i++] & 0x7F;
+               if (rate > max_rate)
+                       max_rate = rate;
+               p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
+                             "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
+       }
+       for (; j < network->rates_ex_len; j++) {
+               rate = network->rates_ex[j] & 0x7F;
+               p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
+                             "%d%s ", rate >> 1, (rate & 1) ? ".5" : "");
+               if (rate > max_rate)
+                       max_rate = rate;
+       }
+
+       if (network->mode >= IEEE_N_24G)
+       {
+               PHT_CAPABILITY_ELE ht_cap = NULL;
+               bool is40M = false, isShortGI = false;
+               u8 max_mcs = 0;
+               if (!memcmp(network->bssht.bdHTCapBuf, EWC11NHTCap, 4))
+                       ht_cap = (PHT_CAPABILITY_ELE)&network->bssht.bdHTCapBuf[4];
+               else
+                       ht_cap = (PHT_CAPABILITY_ELE)&network->bssht.bdHTCapBuf[0];
+               is40M = (ht_cap->ChlWidth)?1:0;
+               isShortGI = (ht_cap->ChlWidth)?
+                                               ((ht_cap->ShortGI40Mhz)?1:0):
+                                               ((ht_cap->ShortGI20Mhz)?1:0);
+
+               max_mcs = HTGetHighestMCSRate(ieee, ht_cap->MCS, MCS_FILTER_ALL);
+               rate = MCS_DATA_RATE[is40M][isShortGI][max_mcs&0x7f];
+               if (rate > max_rate)
+                       max_rate = rate;
+       }
+       iwe.cmd = SIOCGIWRATE;
+       iwe.u.bitrate.fixed = iwe.u.bitrate.disabled = 0;
+       iwe.u.bitrate.value = max_rate * 500000;
+       start = iwe_stream_add_event_rsl(info, start, stop, &iwe,
+                                    IW_EV_PARAM_LEN);
+       iwe.cmd = IWEVCUSTOM;
+       iwe.u.data.length = p - custom;
+       if (iwe.u.data.length)
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, custom);
+       /* Add quality statistics */
+       /* TODO: Fix these values... */
+       iwe.cmd = IWEVQUAL;
+       iwe.u.qual.qual = network->stats.signal;
+       iwe.u.qual.level = network->stats.rssi;
+       iwe.u.qual.noise = network->stats.noise;
+       iwe.u.qual.updated = network->stats.mask & RTLLIB_STATMASK_WEMASK;
+       if (!(network->stats.mask & RTLLIB_STATMASK_RSSI))
+               iwe.u.qual.updated |= IW_QUAL_LEVEL_INVALID;
+       if (!(network->stats.mask & RTLLIB_STATMASK_NOISE))
+               iwe.u.qual.updated |= IW_QUAL_NOISE_INVALID;
+       if (!(network->stats.mask & RTLLIB_STATMASK_SIGNAL))
+               iwe.u.qual.updated |= IW_QUAL_QUAL_INVALID;
+       iwe.u.qual.updated = 7;
+       start = iwe_stream_add_event_rsl(info, start, stop, &iwe, IW_EV_QUAL_LEN);
+
+       iwe.cmd = IWEVCUSTOM;
+       p = custom;
+       iwe.u.data.length = p - custom;
+       if (iwe.u.data.length)
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, custom);
+#if (WIRELESS_EXT < 18)
+       if (ieee->wpa_enabled && network->wpa_ie_len){
+               char buf[MAX_WPA_IE_LEN * 2 + 30];
+               u8 *p = buf;
+               p += sprintf(p, "wpa_ie=");
+               for (i = 0; i < network->wpa_ie_len; i++) {
+                       p += sprintf(p, "%02x", network->wpa_ie[i]);
+               }
+
+               memset(&iwe, 0, sizeof(iwe));
+               iwe.cmd = IWEVCUSTOM;
+               iwe.u.data.length = strlen(buf);
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, buf);
+        }
+
+       if (ieee->wpa_enabled && network->rsn_ie_len){
+               char buf[MAX_WPA_IE_LEN * 2 + 30];
+
+               u8 *p = buf;
+               p += sprintf(p, "rsn_ie=");
+               for (i = 0; i < network->rsn_ie_len; i++) {
+                       p += sprintf(p, "%02x", network->rsn_ie[i]);
+               }
+
+               memset(&iwe, 0, sizeof(iwe));
+               iwe.cmd = IWEVCUSTOM;
+               iwe.u.data.length = strlen(buf);
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, buf);
+        }
+#else
+       memset(&iwe, 0, sizeof(iwe));
+       if (network->wpa_ie_len)
+       {
+               char buf[MAX_WPA_IE_LEN];
+               memcpy(buf, network->wpa_ie, network->wpa_ie_len);
+               iwe.cmd = IWEVGENIE;
+               iwe.u.data.length = network->wpa_ie_len;
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, buf);
+        }
+       memset(&iwe, 0, sizeof(iwe));
+       if (network->rsn_ie_len)
+       {
+               char buf[MAX_WPA_IE_LEN];
+               memcpy(buf, network->rsn_ie, network->rsn_ie_len);
+               iwe.cmd = IWEVGENIE;
+               iwe.u.data.length = network->rsn_ie_len;
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, buf);
+        }
+
+#ifndef CUSTOMER_ID_INTEL_CMPC
+       /* add info for WZC */
+       memset(&iwe, 0, sizeof(iwe));
+       if (network->wzc_ie_len)
+       {
+               char buf[MAX_WZC_IE_LEN];
+               memcpy(buf, network->wzc_ie, network->wzc_ie_len);
+               iwe.cmd = IWEVGENIE;
+               iwe.u.data.length = network->wzc_ie_len;
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, buf);
+        }
+#endif
+#endif
+
+       /* Add EXTRA: Age to display seconds since last beacon/probe response
+        * for given network. */
+       iwe.cmd = IWEVCUSTOM;
+       p = custom;
+       p += snprintf(p, MAX_CUSTOM_LEN - (p - custom),
+                     " Last beacon: %lums ago", (jiffies - network->last_scanned) / (HZ / 100));
+       iwe.u.data.length = p - custom;
+       if (iwe.u.data.length)
+               start = iwe_stream_add_point_rsl(info, start, stop, &iwe, custom);
+
+       return start;
+}
+
+int rtllib_wx_get_scan(struct rtllib_device *ieee,
+                         struct iw_request_info *info,
+                         union iwreq_data *wrqu, char *extra)
+{
+       struct rtllib_network *network;
+       unsigned long flags;
+
+       char *ev = extra;
+       char *stop = ev + wrqu->data.length;
+       int i = 0;
+       int err = 0;
+       RTLLIB_DEBUG_WX("Getting scan\n");
+       down(&ieee->wx_sem);
+       spin_lock_irqsave(&ieee->lock, flags);
+
+       list_for_each_entry(network, &ieee->network_list, list) {
+               i++;
+               if ((stop-ev)<200)
+               {
+                       err = -E2BIG;
+                       break;
+                                                                                               }
+               if (ieee->scan_age == 0 ||
+                   time_after(network->last_scanned + ieee->scan_age, jiffies))
+                       ev = rtl819x_translate_scan(ieee, ev, stop, network, info);
+               else
+                       RTLLIB_DEBUG_SCAN(
+                               "Not showing network '%s ("
+                               MAC_FMT ")' due to age (%lums).\n",
+                               escape_essid(network->ssid,
+                                            network->ssid_len),
+                               MAC_ARG(network->bssid),
+                               (jiffies - network->last_scanned) / (HZ / 100));
+       }
+
+       spin_unlock_irqrestore(&ieee->lock, flags);
+       up(&ieee->wx_sem);
+       wrqu->data.length = ev -  extra;
+       wrqu->data.flags = 0;
+
+       RTLLIB_DEBUG_WX("exit: %d networks returned.\n", i);
+
+       return err;
+}
+
+int rtllib_wx_set_encode(struct rtllib_device *ieee,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *keybuf)
+{
+       struct iw_point *erq = &(wrqu->encoding);
+       struct net_device *dev = ieee->dev;
+       struct rtllib_security sec = {
+               .flags = 0
+       };
+       int i, key, key_provided, len;
+       struct rtllib_crypt_data **crypt;
+
+       RTLLIB_DEBUG_WX("SET_ENCODE\n");
+
+       key = erq->flags & IW_ENCODE_INDEX;
+       if (key) {
+               if (key > WEP_KEYS)
+                       return -EINVAL;
+               key--;
+               key_provided = 1;
+       } else {
+               key_provided = 0;
+               key = ieee->tx_keyidx;
+       }
+
+       RTLLIB_DEBUG_WX("Key: %d [%s]\n", key, key_provided ?
+                          "provided" : "default");
+       crypt = &ieee->crypt[key];
+       if (erq->flags & IW_ENCODE_DISABLED) {
+               if (key_provided && *crypt) {
+                       RTLLIB_DEBUG_WX("Disabling encryption on key %d.\n",
+                                          key);
+                       rtllib_crypt_delayed_deinit(ieee, crypt);
+               } else
+                       RTLLIB_DEBUG_WX("Disabling encryption.\n");
+
+               /* Check all the keys to see if any are still configured,
+                * and if no key index was provided, de-init them all */
+               for (i = 0; i < WEP_KEYS; i++) {
+                       if (ieee->crypt[i] != NULL) {
+                               if (key_provided)
+                                       break;
+                               rtllib_crypt_delayed_deinit(ieee, &ieee->crypt[i]);
+                       }
+               }
+
+               if (i == WEP_KEYS) {
+                       sec.enabled = 0;
+                       sec.level = SEC_LEVEL_0;
+                       sec.flags |= SEC_ENABLED | SEC_LEVEL;
+               }
+
+               goto done;
+       }
+
+
+
+       sec.enabled = 1;
+       sec.flags |= SEC_ENABLED;
+
+       if (*crypt != NULL && (*crypt)->ops != NULL &&
+           strcmp((*crypt)->ops->name, "WEP") != 0) {
+               /* changing to use WEP; deinit previously used algorithm
+                * on this key */
+               rtllib_crypt_delayed_deinit(ieee, crypt);
+       }
+
+       if (*crypt == NULL) {
+               struct rtllib_crypt_data *new_crypt;
+
+               /* take WEP into use */
+               new_crypt = kmalloc(sizeof(struct rtllib_crypt_data),
+                                   GFP_KERNEL);
+               if (new_crypt == NULL)
+                       return -ENOMEM;
+               memset(new_crypt, 0, sizeof(struct rtllib_crypt_data));
+               new_crypt->ops = rtllib_get_crypto_ops("WEP");
+               if (!new_crypt->ops) {
+                       request_module("rtllib_crypt_wep");
+                       new_crypt->ops = rtllib_get_crypto_ops("WEP");
+               }
+
+               if (new_crypt->ops)
+                       new_crypt->priv = new_crypt->ops->init(key);
+
+               if (!new_crypt->ops || !new_crypt->priv) {
+                       kfree(new_crypt);
+                       new_crypt = NULL;
+
+                       printk(KERN_WARNING "%s: could not initialize WEP: "
+                              "load module rtllib_crypt_wep\n",
+                              dev->name);
+                       return -EOPNOTSUPP;
+               }
+               *crypt = new_crypt;
+       }
+
+       /* If a new key was provided, set it up */
+       if (erq->length > 0) {
+               len = erq->length <= 5 ? 5 : 13;
+               memcpy(sec.keys[key], keybuf, erq->length);
+               if (len > erq->length)
+                       memset(sec.keys[key] + erq->length, 0,
+                              len - erq->length);
+               RTLLIB_DEBUG_WX("Setting key %d to '%s' (%d:%d bytes)\n",
+                                  key, escape_essid(sec.keys[key], len),
+                                  erq->length, len);
+               sec.key_sizes[key] = len;
+               (*crypt)->ops->set_key(sec.keys[key], len, NULL,
+                                      (*crypt)->priv);
+               sec.flags |= (1 << key);
+               /* This ensures a key will be activated if no key is
+                * explicitely set */
+               if (key == sec.active_key)
+                       sec.flags |= SEC_ACTIVE_KEY;
+               ieee->tx_keyidx = key;
+
+       } else {
+               len = (*crypt)->ops->get_key(sec.keys[key], WEP_KEY_LEN,
+                                            NULL, (*crypt)->priv);
+               if (len == 0) {
+                       /* Set a default key of all 0 */
+                       printk("Setting key %d to all zero.\n",
+                                          key);
+
+                       RTLLIB_DEBUG_WX("Setting key %d to all zero.\n",
+                                          key);
+                       memset(sec.keys[key], 0, 13);
+                       (*crypt)->ops->set_key(sec.keys[key], 13, NULL,
+                                              (*crypt)->priv);
+                       sec.key_sizes[key] = 13;
+                       sec.flags |= (1 << key);
+               }
+
+               /* No key data - just set the default TX key index */
+               if (key_provided) {
+                       RTLLIB_DEBUG_WX(
+                               "Setting key %d to default Tx key.\n", key);
+                       ieee->tx_keyidx = key;
+                       sec.active_key = key;
+                       sec.flags |= SEC_ACTIVE_KEY;
+               }
+       }
+ done:
+       ieee->open_wep = !(erq->flags & IW_ENCODE_RESTRICTED);
+       ieee->auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY;
+       sec.auth_mode = ieee->open_wep ? WLAN_AUTH_OPEN : WLAN_AUTH_SHARED_KEY;
+       sec.flags |= SEC_AUTH_MODE;
+       RTLLIB_DEBUG_WX("Auth: %s\n", sec.auth_mode == WLAN_AUTH_OPEN ?
+                          "OPEN" : "SHARED KEY");
+
+       /* For now we just support WEP, so only set that security level...
+        * TODO: When WPA is added this is one place that needs to change */
+       sec.flags |= SEC_LEVEL;
+       sec.level = SEC_LEVEL_1; /* 40 and 104 bit WEP */
+
+       if (ieee->set_security)
+               ieee->set_security(dev, &sec);
+
+       /* Do not reset port if card is in Managed mode since resetting will
+        * generate new IEEE 802.11 authentication which may end up in looping
+        * with IEEE 802.1X.  If your hardware requires a reset after WEP
+        * configuration (for example... Prism2), implement the reset_port in
+        * the callbacks structures used to initialize the 802.11 stack. */
+       if (ieee->reset_on_keychange &&
+           ieee->iw_mode != IW_MODE_INFRA &&
+           ieee->reset_port && ieee->reset_port(dev)) {
+               printk(KERN_DEBUG "%s: reset_port failed\n", dev->name);
+               return -EINVAL;
+       }
+       return 0;
+}
+
+int rtllib_wx_get_encode(struct rtllib_device *ieee,
+                           struct iw_request_info *info,
+                           union iwreq_data *wrqu, char *keybuf)
+{
+       struct iw_point *erq = &(wrqu->encoding);
+       int len, key;
+       struct rtllib_crypt_data *crypt;
+
+       RTLLIB_DEBUG_WX("GET_ENCODE\n");
+
+       if (ieee->iw_mode == IW_MODE_MONITOR)
+               return -1;
+
+       key = erq->flags & IW_ENCODE_INDEX;
+       if (key) {
+               if (key > WEP_KEYS)
+                       return -EINVAL;
+               key--;
+       } else {
+               key = ieee->tx_keyidx;
+       }
+       crypt = ieee->crypt[key];
+
+       erq->flags = key + 1;
+
+       if (crypt == NULL || crypt->ops == NULL) {
+               erq->length = 0;
+               erq->flags |= IW_ENCODE_DISABLED;
+               return 0;
+       }
+       len = crypt->ops->get_key(keybuf, SCM_KEY_LEN, NULL, crypt->priv);
+       erq->length = (len >= 0 ? len : 0);
+
+       erq->flags |= IW_ENCODE_ENABLED;
+
+       if (ieee->open_wep)
+               erq->flags |= IW_ENCODE_OPEN;
+       else
+               erq->flags |= IW_ENCODE_RESTRICTED;
+
+       return 0;
+}
+#if (WIRELESS_EXT >= 18)
+int rtllib_wx_set_encode_ext(struct rtllib_device *ieee,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       int ret = 0;
+       struct net_device *dev = ieee->dev;
+        struct iw_point *encoding = &wrqu->encoding;
+        struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+        int i, idx;
+        int group_key = 0;
+        const char *alg, *module;
+        struct rtllib_crypto_ops *ops;
+        struct rtllib_crypt_data **crypt;
+
+        struct rtllib_security sec = {
+                .flags = 0,
+        };
+        idx = encoding->flags & IW_ENCODE_INDEX;
+        if (idx) {
+                if (idx < 1 || idx > WEP_KEYS)
+                        return -EINVAL;
+                idx--;
+       } else{
+                       idx = ieee->tx_keyidx;
+       }
+       if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) {
+               crypt = &ieee->crypt[idx];
+               group_key = 1;
+       } else {
+               /* some Cisco APs use idx>0 for unicast in dynamic WEP */
+               if (idx != 0 && ext->alg != IW_ENCODE_ALG_WEP)
+                        return -EINVAL;
+               if (ieee->iw_mode == IW_MODE_INFRA)
+                       crypt = &ieee->crypt[idx];
+               else
+                       return -EINVAL;
+       }
+
+       sec.flags |= SEC_ENABLED;
+       if ((encoding->flags & IW_ENCODE_DISABLED) ||
+            ext->alg == IW_ENCODE_ALG_NONE) {
+               if (*crypt)
+                       rtllib_crypt_delayed_deinit(ieee, crypt);
+
+               for (i = 0; i < WEP_KEYS; i++) {
+                       if (ieee->crypt[i] != NULL)
+                               break;
+               }
+               if (i == WEP_KEYS) {
+                       sec.enabled = 0;
+                       sec.level = SEC_LEVEL_0;
+                       sec.flags |= SEC_LEVEL;
+               }
+               goto done;
+       }
+
+       sec.enabled = 1;
+        switch (ext->alg) {
+        case IW_ENCODE_ALG_WEP:
+                alg = "WEP";
+                module = "rtllib_crypt_wep";
+                break;
+        case IW_ENCODE_ALG_TKIP:
+                alg = "TKIP";
+                module = "rtllib_crypt_tkip";
+                break;
+        case IW_ENCODE_ALG_CCMP:
+                alg = "CCMP";
+                module = "rtllib_crypt_ccmp";
+                break;
+        default:
+                RTLLIB_DEBUG_WX("%s: unknown crypto alg %d\n",
+                                   dev->name, ext->alg);
+                ret = -EINVAL;
+                goto done;
+        }
+       printk("alg name:%s\n",alg);
+
+        ops = rtllib_get_crypto_ops(alg);
+        if (ops == NULL) {
+                char tempbuf[100];
+
+                memset( tempbuf, 0x00, 100 );
+                sprintf( tempbuf, "%s", module);
+                request_module("%s",tempbuf);
+                ops = rtllib_get_crypto_ops(alg);
+        }
+        if (ops == NULL) {
+                RTLLIB_DEBUG_WX("%s: unknown crypto alg %d\n",
+                                   dev->name, ext->alg);
+               printk("========>unknown crypto alg %d\n", ext->alg);
+                ret = -EINVAL;
+                goto done;
+        }
+
+        if (*crypt == NULL || (*crypt)->ops != ops) {
+                struct rtllib_crypt_data *new_crypt;
+
+                rtllib_crypt_delayed_deinit(ieee, crypt);
+
+                new_crypt = kzalloc(sizeof(*new_crypt), GFP_KERNEL);
+                if (new_crypt == NULL) {
+                        ret = -ENOMEM;
+                        goto done;
+                }
+                new_crypt->ops = ops;
+               if (new_crypt->ops)
+                        new_crypt->priv = new_crypt->ops->init(idx);
+
+                if (new_crypt->priv == NULL) {
+                        kfree(new_crypt);
+                        ret = -EINVAL;
+                        goto done;
+                }
+                *crypt = new_crypt;
+
+       }
+
+        if (ext->key_len > 0 && (*crypt)->ops->set_key &&
+            (*crypt)->ops->set_key(ext->key, ext->key_len, ext->rx_seq,
+                                   (*crypt)->priv) < 0) {
+                RTLLIB_DEBUG_WX("%s: key setting failed\n", dev->name);
+               printk("key setting failed\n");
+                ret = -EINVAL;
+                goto done;
+        }
+        if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) {
+                ieee->tx_keyidx = idx;
+                sec.active_key = idx;
+                sec.flags |= SEC_ACTIVE_KEY;
+        }
+        if (ext->alg != IW_ENCODE_ALG_NONE) {
+                sec.key_sizes[idx] = ext->key_len;
+                sec.flags |= (1 << idx);
+                if (ext->alg == IW_ENCODE_ALG_WEP) {
+                        sec.flags |= SEC_LEVEL;
+                        sec.level = SEC_LEVEL_1;
+                } else if (ext->alg == IW_ENCODE_ALG_TKIP) {
+                        sec.flags |= SEC_LEVEL;
+                        sec.level = SEC_LEVEL_2;
+                } else if (ext->alg == IW_ENCODE_ALG_CCMP) {
+                        sec.flags |= SEC_LEVEL;
+                        sec.level = SEC_LEVEL_3;
+                }
+                /* Don't set sec level for group keys. */
+                if (group_key)
+                        sec.flags &= ~SEC_LEVEL;
+        }
+done:
+        if (ieee->set_security)
+                ieee->set_security(ieee->dev, &sec);
+
+        if (ieee->reset_on_keychange &&
+            ieee->iw_mode != IW_MODE_INFRA &&
+            ieee->reset_port && ieee->reset_port(dev)) {
+                RTLLIB_DEBUG_WX("%s: reset_port failed\n", dev->name);
+                return -EINVAL;
+        }
+        return ret;
+}
+
+int rtllib_wx_get_encode_ext(struct rtllib_device *ieee,
+                              struct iw_request_info *info,
+                              union iwreq_data *wrqu, char *extra)
+{
+       struct iw_point *encoding = &wrqu->encoding;
+       struct iw_encode_ext *ext = (struct iw_encode_ext *)extra;
+       struct rtllib_crypt_data *crypt;
+       int idx, max_key_len;
+
+       max_key_len = encoding->length - sizeof(*ext);
+       if (max_key_len < 0)
+               return -EINVAL;
+
+       idx = encoding->flags & IW_ENCODE_INDEX;
+       if (idx) {
+               if (idx < 1 || idx > WEP_KEYS)
+                       return -EINVAL;
+               idx--;
+       } else {
+               idx = ieee->tx_keyidx;
+       }
+       if (!(ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) &&
+           (ext->alg != IW_ENCODE_ALG_WEP))
+               if (idx != 0 || (ieee->iw_mode != IW_MODE_INFRA))
+                       return -EINVAL;
+
+       crypt = ieee->crypt[idx];
+
+       encoding->flags = idx + 1;
+       memset(ext, 0, sizeof(*ext));
+
+       if (crypt == NULL || crypt->ops == NULL ) {
+               ext->alg = IW_ENCODE_ALG_NONE;
+               ext->key_len = 0;
+               encoding->flags |= IW_ENCODE_DISABLED;
+       } else {
+               if (strcmp(crypt->ops->name, "WEP") == 0 )
+                       ext->alg = IW_ENCODE_ALG_WEP;
+               else if (strcmp(crypt->ops->name, "TKIP"))
+                       ext->alg = IW_ENCODE_ALG_TKIP;
+               else if (strcmp(crypt->ops->name, "CCMP"))
+                       ext->alg = IW_ENCODE_ALG_CCMP;
+               else
+                       return -EINVAL;
+               ext->key_len = crypt->ops->get_key(ext->key, SCM_KEY_LEN, NULL, crypt->priv);
+               encoding->flags |= IW_ENCODE_ENABLED;
+               if (ext->key_len &&
+                   (ext->alg == IW_ENCODE_ALG_TKIP ||
+                    ext->alg == IW_ENCODE_ALG_CCMP))
+                       ext->ext_flags |= IW_ENCODE_EXT_TX_SEQ_VALID;
+
+       }
+
+       return 0;
+}
+
+int rtllib_wx_set_mlme(struct rtllib_device *ieee,
+                               struct iw_request_info *info,
+                               union iwreq_data *wrqu, char *extra)
+{
+       u8 i = 0;
+       bool deauth = false;
+       struct iw_mlme *mlme = (struct iw_mlme *) extra;
+
+       if (ieee->state != RTLLIB_LINKED)
+               return -ENOLINK;
+
+       down(&ieee->wx_sem);
+
+       switch (mlme->cmd) {
+               case IW_MLME_DEAUTH:
+                       deauth = true;
+                       /* leave break out intentionly */
+
+               case IW_MLME_DISASSOC:
+                       if (deauth == true)
+                               printk("disauth packet !\n");
+                       else
+                               printk("dis associate packet!\n");
+
+                       ieee->cannot_notify = true;
+
+                       SendDisassociation(ieee,deauth,mlme->reason_code);
+                       rtllib_disassociate(ieee);
+
+                       ieee->wap_set = 0;
+                       for (i = 0; i < 6; i++)
+                               ieee->current_network.bssid[i]= 0x55;
+
+                       ieee->ssid_set = 0;
+                       ieee->current_network.ssid[0] = '\0';
+                       ieee->current_network.ssid_len = 0;
+               break;
+       default:
+               up(&ieee->wx_sem);
+               return -EOPNOTSUPP;
+       }
+
+       up(&ieee->wx_sem);
+
+       return 0;
+}
+
+int rtllib_wx_set_auth(struct rtllib_device *ieee,
+                               struct iw_request_info *info,
+                               struct iw_param *data, char *extra)
+{
+       switch (data->flags & IW_AUTH_INDEX) {
+        case IW_AUTH_WPA_VERSION:
+               break;
+        case IW_AUTH_CIPHER_PAIRWISE:
+        case IW_AUTH_CIPHER_GROUP:
+        case IW_AUTH_KEY_MGMT:
+               /*
+                * Host AP driver does not use these parameters and allows
+                * wpa_supplicant to control them internally.
+                */
+                break;
+        case IW_AUTH_TKIP_COUNTERMEASURES:
+                ieee->tkip_countermeasures = data->value;
+                break;
+        case IW_AUTH_DROP_UNENCRYPTED:
+                ieee->drop_unencrypted = data->value;
+               break;
+
+       case IW_AUTH_80211_AUTH_ALG:
+               if (data->value & IW_AUTH_ALG_SHARED_KEY){
+                       ieee->open_wep = 0;
+                       ieee->auth_mode = 1;
+               }
+               else if (data->value & IW_AUTH_ALG_OPEN_SYSTEM){
+                       ieee->open_wep = 1;
+                       ieee->auth_mode = 0;
+               }
+               else if (data->value & IW_AUTH_ALG_LEAP){
+                       ieee->open_wep = 1;
+                       ieee->auth_mode = 2;
+               }
+               else
+                       return -EINVAL;
+               break;
+
+       case IW_AUTH_WPA_ENABLED:
+               ieee->wpa_enabled = (data->value)?1:0;
+               break;
+
+       case IW_AUTH_RX_UNENCRYPTED_EAPOL:
+                ieee->ieee802_1x = data->value;
+               break;
+       case IW_AUTH_PRIVACY_INVOKED:
+               ieee->privacy_invoked = data->value;
+               break;
+       default:
+                return -EOPNOTSUPP;
+       }
+       return 0;
+}
+#endif
+
+int rtllib_wx_set_gen_ie(struct rtllib_device *ieee, u8 *ie, size_t len)
+{
+#if (WIRELESS_EXT >= 18 )
+       u8 *buf;
+       u8 eid, wps_oui[4]={0x0,0x50,0xf2,0x04};
+
+       if (len > MAX_WPA_IE_LEN || (len && ie == NULL)) {
+               return -EINVAL;
+       }
+
+       if (len) {
+               eid = ie[0];
+               if ((eid == MFIE_TYPE_GENERIC) && (!memcmp(&ie[2], wps_oui, 4))) {
+
+                       ieee->wps_ie_len = (len < MAX_WZC_IE_LEN) ? (len):(MAX_WZC_IE_LEN);
+                       buf = kmalloc(ieee->wps_ie_len, GFP_KERNEL);
+                       if (buf == NULL)
+                               return -ENOMEM;
+                       memcpy(buf, ie, ieee->wps_ie_len);
+                       ieee->wps_ie = buf;
+                       return 0;
+               }
+       }
+       ieee->wps_ie_len = 0;
+       if (ieee->wps_ie)
+               kfree(ieee->wps_ie);
+       ieee->wps_ie = NULL;
+       if (len) {
+               if (len != ie[1]+2) {
+                       return -EINVAL;
+               }
+               buf = kmalloc(len, GFP_KERNEL);
+               if (buf == NULL)
+                       return -ENOMEM;
+               memcpy(buf, ie, len);
+               kfree(ieee->wpa_ie);
+               ieee->wpa_ie = buf;
+               ieee->wpa_ie_len = len;
+       } else {
+               if (ieee->wpa_ie)
+               kfree(ieee->wpa_ie);
+               ieee->wpa_ie = NULL;
+               ieee->wpa_ie_len = 0;
+       }
+#endif
+       return 0;
+}